miau's blog?

仕事で hack っぽいことを

現在手伝い中のシステムは、

PHP→ASP→ActiveX→DLL→EXE

なんてやたら複雑な造りになってて、DLL と EXE ってのは旧システムを作った会社から提供されています。
で、今回私が作ってるのは ActiveX の部分で。
DLL のドキュメントはあるものの、基本的にブラックボックスなので、妙な手を使って調査する機会が多かったりして。

そのへんのネタです。


■ファイルまわり

DLLが「ファイル作成失敗」みたいなエラーコードを返すことはわかったけど、その詳細がわからなかったりして。

仕方ないので Sysinternals の FileMon で、どんなファイルを作ろうとしてるか確認。
本来であれば

hoge.<プロセスID>
fuga.<プロセスID>

といったファイルができるはずなのですが、

hoge.
fuga.

なんてのを作ろうとして「FILENAME INVARID」みたいなエラーになってました。
んー・・・ActiveX 経由だからプロセスIDが取得できないとかあるのかな?
(↑確認してないですが、たぶん勘違いです)
で、ファイル末尾がドットだからファイル名として不正、と?

とりあえず DLL を覗いてみると、"%s.%s" なんて文字列があった。
のでバイナリエディタで "#%s%s" とかに書き換えてみる。
これならファイル名として OK なはず・・・だけど、なんかうまくいかない。

よくよく見てみると、<プロセスID> の部分に \x01 がたくさん入ってた。
あ、なるほど。それはファイル名不正だろう。
であれば・・・"%s.%s" だったのを "Dmy%s" にでも。

で、成功。

・sprintf() まわりのロジック(%s が少なくても問題ない)
・C 言語コンパイル後のバイナリファイル構造

周りがわかってたから、結構確信持って作業できました。
(他のところで "%s.%s" を使ってなかったのは運が良かったのですが)
C 言語の知識も、たまに役に立つなーと。


■戻り値取得とか

今度は DLL 内関数の戻り値が「EXE 異常終了(-922)」とか。

よくわからないので、DLL のソースを提供してもらったところ・・・
if (GetExitCodeProcess(hProcess, &exitCode)) {
if (STILL_ACTIVE == exitCode){
return exitCode;
}
}
CloseHandle(hProcess);

if (0 != exitCode) {
return -992;
}

どんなエラーでも -992 を返すと。
EXE の終了コードとか知りたいんですけど・・・。

ということで、OllyDbg でその付近を覗いてみたり。

10007F9D |. 8D4C24 08 LEA ECX,DWORD PTR SS:[ESP+8]
10007FA1 |. 51 PUSH ECX ; /pExitCode
10007FA2 |. 50 PUSH EAX ; |hProcess
10007FA3 |. FF15 28600110 CALL DWORD PTR DS:[<&KERNEL32.GetExitCod>; \GetExitCodeProcess
10007FA9 |. 85C0 TEST EAX,EAX
10007FAB |. 74 0D JE SHORT hogefuga.10007FBA
10007FAD |. 8B4C24 08 MOV ECX,DWORD PTR SS:[ESP+8]
10007FB1 |. B8 03010000 MOV EAX,103
10007FB6 |. 3BC8 CMP ECX,EAX
10007FB8 |. 74 5E JE SHORT hogefuga.10008018
10007FBA |> 8B56 30 MOV EDX,DWORD PTR DS:[ESI+30]
10007FBD |. 52 PUSH EDX ; /hObject
10007FBE |. FF15 1C600110 CALL DWORD PTR DS:[<&KERNEL32.CloseHandl>; \CloseHandle
10007FC4 |. 8B4424 08 MOV EAX,DWORD PTR SS:[ESP+8]
10007FC8 |. 85C0 TEST EAX,EAX
10007FCA |. 74 0B JE SHORT hogefuga.10007FD7
10007FCC |. 5F POP EDI
10007FCD |. B8 20FCFFFF MOV EAX,-3E0
10007FD2 |. 5E POP ESI
10007FD3 |. 83C4 7C ADD ESP,7C
10007FD6 |. C3 RETN

お?これならなんとかなりそうな。
10007FCD  |. B8 20FCFFFF    MOV EAX,-3E0

の部分で戻り値を -922 に設定してるっぽいので、バイナリエディタで

10007FCD |. 90 NOP
10007FCE |. 90 NOP
10007FCF |. 90 NOP
10007FD0 |. 90 NOP
10007FD1 |. 90 NOP

こんな感じに変更。

これで、関数の戻り値として EXE の終了コードが拾えるように。


とまぁこんな感じで、珍しく仕事でこういう知識が役に立ちました。
まぁ実際はこんなことしなくてもよかったんですが・・・それはまた別項で。
posted at 03:42:43 on 2005-05-02 by miau - Category: Work No Trackbacks - Permalink

TrackBack

このエントリにトラックバックはありません
現在トラックバックは受け付けていません。

Comments

No comments yet

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。