ページへ戻る

− Links

 印刷 

sero​/efg01解析 のバックアップ差分(No.4) :: OSASK計画

osaskwiki:sero/efg01解析 のバックアップ差分(No.4)

« Prev[4]  Next »[5]
3: 2010-02-04 (木) 01:10:44 sero[6] ソース[7] 4: 2010-02-04 (木) 23:12:32 sero[6] ソース[8]
Line 21: Line 21:
** void c_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax, int eip) [#k101e498] ** 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を呼び出したときのアプリのレジスタの値(これを変更すると、アプリのレジスタも書き換わる) - 引数: APIを呼び出したときのアプリのレジスタの値(これを変更すると、アプリのレジスタも書き換わる)
- 主要なローカル変数 - 主要なローカル変数
Line 26: Line 27:
-- int f3 = 1 : あといくつのAPI機能を実行するか(初期値は1、つまり、一つの機能を実行したら終了) -- int f3 = 1 : あといくつのAPI機能を実行するか(初期値は1、つまり、一つの機能を実行したら終了)
- メインの処理 - メインの処理
-    if (edi == 0) +    if (edi == 0) // EDIが0だったら 
-     cmd = (UCHAR *) eip; +     cmd = (UCHAR *) eip; // APIパケットの開始はEIPから 
-    init_ra(&ra, cmd); +    init_ra(&ra, cmd); // raを初期化し、パケット情報を受け取る準備をする 
-    ra.reg32 = &edi; +    ra.reg32 = &edi; // レジスタを参照・書き換えするための準備 
-    ra.st0 = &eip;+    ra.st0 = &eip; // 詳細は不明(guigui01.h(つまりC言語からのアクセス)を使うだけならおそらく使われていない(要調査TODO))
    for (;;) {     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); 
 +     }
    }     }
« Prev[4]  Next »[5]