サイトトップへ
OSASK.NET
  サイトトップへ       新掲示板(閉鎖済)   Wiki(凍結済)   旧掲示板(廃止済)   ニュース(廃止済)  

efg01解析 anchor.png

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

解析の前に anchor.png

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

概要 anchor.png

  • GUIGUI01のAPIは複数の機能を一度に実行できる
  • そのため、実行するAPIの機能を順に並べたパケットをefg01に渡すことになっている
  • その形式は、GH4と呼ばれる
Page Top

efg01に到達するまで anchor.png

  1. APIコール(z_tools/guigui01/g01libc0.lib/startup.askのg01_execcmd(0))
  2. JMP [ESI]
  3. efg01/asm_apiで、レジスタをスタックに積んでから、
  4. efg01/c_api()がコールされる
Page Top

型名・構造体など anchor.png

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

void c_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax, int eip) anchor.png

  • 概要: 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);
    		}
    	}
Page Top

コマンドラインオプションの処理 anchor.png

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

コメント欄 anchor.png


一般用コメント一覧

一般用コメント欄は使用できません
トップ   凍結解除 差分 バックアップ 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ
新着

目次
メンバー一覧


最新の20件
2016-10-01 2016-09-08
  • @MenuBar.
2016-09-07 2016-09-04 2016-08-15 2015-09-23 2014-07-30 2014-07-04 2014-02-04 2013-10-26 2013-06-21 2013-06-17 2013-06-15 2013-04-02 2013-02-09 2013-02-04 2012-12-25 2012-12-01 2012-05-28 2012-03-31

トピック一覧
一般用コメント最新
新掲示板lina
2016/9/5 20:58
SandBoxゲスト
2016/9/4 12:01
RecentDeletedlina
2015/6/2 19:29
Old-OSASK-MLlina
2014/6/29 9:14
hideyosi/メールhideyosi
2014/1/6 20:17
hideyosi/募集中lina
2013/11/8 19:56

このサイトは川合秀実から委託を受けて、OSASKコミュニティによって管理・運営されています。