ページへ戻る

− Links

 印刷 

sero​/efg01解析 のソース :: OSASK計画

osaskwiki:sero/efg01解析のソース

« Prev[3]  
* efg01解析 [#b357c99a]
- (by [[sero]], 2010/2/2~)
- このページはSeroがefg01のソースを読んでわかったことをメモするページです
- よって、正確な情報であるという保障はありません
- その点留意していただければ幸いです
- 優先的に解析結果がほしい分野があればコメント欄へどうぞ 実力の及ぶ限り努力します

** 解析の前に [#af236b59]
- ここでは、OSASK.NETトップから[各種過去ログ集メニュー]→[2009.11.01時点でのトップページ]→[おもな成果物/[[OSASK-HB系:http://old.osask.jp/osaskhb.html]]]からダウンロードできるabcdw017を対象とします
- また、当面の間はAPIコールを中心に解析します

** 概要 [#g19ba445]
- GUIGUI01のAPIは複数の機能を一度に実行できる
- そのため、実行するAPIの機能を順に並べたパケットをefg01に渡すことになっている
- その形式は、[[GH4>GUIGUI01/man0004]]と呼ばれる

** efg01に到達するまで [#s5534258]
+ APIコール(z_tools/guigui01/g01libc0.lib/startup.askのg01_execcmd(0))
+ JMP [ESI]
+ efg01/asm_apiで、レジスタをスタックに積んでから、
+ efg01/c_api()がコールされる

** 型名・構造体など [#dc5a88da]
- UCHAR
-- 実体はunsigned char型
- READ_EH4
-- 概要: (名前はEH4になっているが)GH4形式のパケットからデータを取り出すための構造体 FIFO構造を持つ
--- UCHAR buf[READ_EH4_BUFLEN] : パケットのデータを一時的にキャッシュするバッファ
--- int r : 次のデータがあるbuf上のインデックス

** void c_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax, int eip) [#k101e498]
- 概要: GUIGUI01のAPI処理本体(名称は「Cで書かれたAPI」に由来すると思われる) 行数: 797行
- 引数: APIを呼び出したときのアプリのレジスタの値(これを変更すると、アプリのレジスタも書き換わる)
- 主要なローカル変数
-- struct READ_API ra : efg01に渡されるパケットから情報を取り出すための構造体
-- int f3 = 1 : あといくつのAPI機能を実行するか(初期値は1、つまり、一つの機能を実行したら終了)
- メインの処理
	if (edi == 0)			// EDIが0だったら
		cmd = (UCHAR *) eip;		// APIパケットの開始はEIPから
	init_ra(&ra, cmd);		// raを初期化し、パケット情報を受け取る準備をする
	ra.reg32 = &edi;		// レジスタを参照・書き換えするための準備
	ra.st0 = &eip;			// 詳細は不明(guigui01.h(つまりC言語からのアクセス)を使うだけならおそらく使われていない(要調査TODO))
	for (;;) {
		if (f3 == 0)			// 実行する機能の残りが0ならば
			goto fin;			// API処理終了
		f3--;				// 今からひとつ処理する
		i = getnum_api(&ra, 0);		// パケットからひとつデータを取り出す
		if (i == 0)
			continue;			// API番号0はパディングのためスキップされる
		if (i == 3) {				// パケットの終端、またはパケットの延長
			中略
			return;
		}
		if (i == 4) {				// アプリの終了
			中略
			exit(1);
		}
		if (i == 5) {				// 文字列表示
			中略
		} else if (i == 6) {			// コマンドラインオプションの処理
			中略
		} else if (i == 0x00ffffff) {		// ジャンクAPI(仕様が決定版でないAPI)の処理
			中略
		} else {
			printf("c_api: error i=%d\n", i);
			exit(1);
		}
	}

*** コマンドラインオプションの処理 [#j57d1ec7]
- 概要: (GUIGUI01アプリに渡された(実際はefg01が受け取っている))コマンドラインオプションの形式を定義し、その値をアプリに引き渡す 行数: 287行
- 関連するグローバル変数
-- FUNC06STR *func06str : コマンドラインオプションの定義を保管する構造体 ポインタになっているが、アプリ実行開始時にはすでに動的確保済み

** コメント欄 [#pfe3f553]
#comment

« Prev[3]