ページへ戻る
印刷
sero/efg01解析
をテンプレートにして作成 ::
OSASK計画
osaskwiki
:sero/efg01解析 をテンプレートにして作成
開始行:
* efg01解析
- (by [[sero]], 2010/2/2~)
- このページはSeroがefg01のソースを読んでわかったことをメ...
- よって、正確な情報であるという保障はありません
- その点留意していただければ幸いです
- 優先的に解析結果がほしい分野があればコメント欄へどうぞ ...
** 解析の前に
- ここでは、OSASK.NETトップから[各種過去ログ集メニュー]→[...
- また、当面の間はAPIコールを中心に解析します
** 概要
- GUIGUI01のAPIは複数の機能を一度に実行できる
- そのため、実行するAPIの機能を順に並べたパケットをefg01...
- その形式は、[[GH4>GUIGUI01/man0004]]と呼ばれる
** efg01に到達するまで
+ APIコール(z_tools/guigui01/g01libc0.lib/startup.askのg0...
+ JMP [ESI]
+ efg01/asm_apiで、レジスタをスタックに積んでから、
+ efg01/c_api()がコールされる
** 型名・構造体など
- UCHAR
-- 実体はunsigned char型
- READ_EH4
-- 概要: (名前はEH4になっているが)GH4形式のパケットからデ...
--- UCHAR buf[READ_EH4_BUFLEN] : パケットのデータを一時的...
--- int r : 次のデータがあるbuf上のインデックス
** void c_api(int edi, int esi, int ebp, int esp, int ebx...
- 概要: GUIGUI01のAPI処理本体(名称は「Cで書かれたAPI」に...
- 引数: 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言語か...
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(仕様が決...
中略
} else {
printf("c_api: error i=%d\n", i);
exit(1);
}
}
*** コマンドラインオプションの処理
- 概要: (GUIGUI01アプリに渡された(実際はefg01が受け取って...
- 関連するグローバル変数
-- FUNC06STR *func06str : コマンドラインオプションの定義...
** コメント欄
#comment
終了行:
* efg01解析
- (by [[sero]], 2010/2/2~)
- このページはSeroがefg01のソースを読んでわかったことをメ...
- よって、正確な情報であるという保障はありません
- その点留意していただければ幸いです
- 優先的に解析結果がほしい分野があればコメント欄へどうぞ ...
** 解析の前に
- ここでは、OSASK.NETトップから[各種過去ログ集メニュー]→[...
- また、当面の間はAPIコールを中心に解析します
** 概要
- GUIGUI01のAPIは複数の機能を一度に実行できる
- そのため、実行するAPIの機能を順に並べたパケットをefg01...
- その形式は、[[GH4>GUIGUI01/man0004]]と呼ばれる
** efg01に到達するまで
+ APIコール(z_tools/guigui01/g01libc0.lib/startup.askのg0...
+ JMP [ESI]
+ efg01/asm_apiで、レジスタをスタックに積んでから、
+ efg01/c_api()がコールされる
** 型名・構造体など
- UCHAR
-- 実体はunsigned char型
- READ_EH4
-- 概要: (名前はEH4になっているが)GH4形式のパケットからデ...
--- UCHAR buf[READ_EH4_BUFLEN] : パケットのデータを一時的...
--- int r : 次のデータがあるbuf上のインデックス
** void c_api(int edi, int esi, int ebp, int esp, int ebx...
- 概要: GUIGUI01のAPI処理本体(名称は「Cで書かれたAPI」に...
- 引数: 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言語か...
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(仕様が決...
中略
} else {
printf("c_api: error i=%d\n", i);
exit(1);
}
}
*** コマンドラインオプションの処理
- 概要: (GUIGUI01アプリに渡された(実際はefg01が受け取って...
- 関連するグローバル変数
-- FUNC06STR *func06str : コマンドラインオプションの定義...
** コメント欄
#comment
ページ名: