5ちゃんねるの総力を挙げて、人力でアセンブリや機械語を逆コンパイルするスレッドです。コード解析の達人やヒマ人の皆様、ご協力下さい。
===依頼テンプレここから===
【依頼の目的と内容説明】ここに目的と説明を書く
【プロセッサの種類】x86/x64/ARM/JVM など
【OSの種類】Windows/Linux/Mac/Android/iOS など
【言語】C/C++/Java/C# など
【報酬金額と送金方法】報酬なし/銀行振込/WebMoney など
【アセンブリまたは機械語】以下にアセンブリまたは機械語を記載
===依頼テンプレここまで===
依頼は一度に1関数までとします。あまりにも長いコードは人力では逆コンパイルできません。常識の範囲でご利用ください。
探検
アセンブリや機械語を解析して楽しむスレ
■ このスレッドは過去ログ倉庫に格納されています
2021/06/19(土) 17:16:50.94ID:KpP01EPy
2021/06/19(土) 17:35:44.71ID:KpP01EPy
【依頼の目的と内容説明】知恵試し
【プロセッサの種類】x86
【OSの種類】Windows
【言語】C/C++
【報酬金額と送金方法】報酬なし
【アセンブリまたは機械語】
LC0:
__.ascii "hello\0"
__.text
__.p2align 4
__.globl _hello
__.def _hello; .scl 2; .type 32; .endef
_hello:
LFB126:
__.cfi_startproc
__subl $28, %esp
__.cfi_def_cfa_offset 32
__movl $64, 12(%esp)
__movl $0, 8(%esp)
__movl $LC0, 4(%esp)
__movl $0, (%esp)
__call *__imp__MessageBoxA@16
__.cfi_def_cfa_offset 16
__subl $16, %esp
__.cfi_def_cfa_offset 32
__addl $28, %esp
__.cfi_def_cfa_offset 4
__ret
__.cfi_endproc
【プロセッサの種類】x86
【OSの種類】Windows
【言語】C/C++
【報酬金額と送金方法】報酬なし
【アセンブリまたは機械語】
LC0:
__.ascii "hello\0"
__.text
__.p2align 4
__.globl _hello
__.def _hello; .scl 2; .type 32; .endef
_hello:
LFB126:
__.cfi_startproc
__subl $28, %esp
__.cfi_def_cfa_offset 32
__movl $64, 12(%esp)
__movl $0, 8(%esp)
__movl $LC0, 4(%esp)
__movl $0, (%esp)
__call *__imp__MessageBoxA@16
__.cfi_def_cfa_offset 16
__subl $16, %esp
__.cfi_def_cfa_offset 32
__addl $28, %esp
__.cfi_def_cfa_offset 4
__ret
__.cfi_endproc
2021/06/19(土) 19:13:37.49ID:Obm1tdWY
2021/06/19(土) 19:14:20.22ID:Obm1tdWY
逆アセンブラ、解析 [無断転載禁止]c2ch.net
https://mevius.5ch.net/test/read.cgi/tech/1498686597/
https://mevius.5ch.net/test/read.cgi/tech/1498686597/
2021/06/19(土) 19:14:49.34ID:Obm1tdWY
2021/06/19(土) 20:23:58.66ID:Obm1tdWY
>>2
#include <windows.h>
int hello(void)
{
return MessageBoxA(NULL, "hello", NULL, MB_ICONINFORMATION);
}
#include <windows.h>
int hello(void)
{
return MessageBoxA(NULL, "hello", NULL, MB_ICONINFORMATION);
}
2021/06/19(土) 20:42:09.84ID:KpP01EPy
2021/06/19(土) 21:51:43.98ID:Obm1tdWY
>>7
アセンブラや解析の本を読んでみなよ
初心者なら
https://ja.m.wikibooks.org/wiki/X86%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%A9/GAS%E3%81%A7%E3%81%AE%E6%96%87%E6%B3%95
この辺から読み始めるといいよ。
アセンブラや解析の本を読んでみなよ
初心者なら
https://ja.m.wikibooks.org/wiki/X86%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%A9/GAS%E3%81%A7%E3%81%AE%E6%96%87%E6%B3%95
この辺から読み始めるといいよ。
2021/06/19(土) 23:37:15.06ID:/D3aIkOV
スレ立てたの素人かよ
2021/06/20(日) 14:20:56.65ID:dQPhad/Q
【依頼の目的と内容説明】 shell32.dllの解析
【プロセッサの種類】 x86 【OSの種類】 Win Server 2003 【言語】 C/C++
【報酬金額と送金方法】 報酬なし
【アセンブリまたは機械語】
proc Func7C903F7F@16 Label_7C903F7F
Label_7C8FAE6A:
7C8FAE6A: cmp dword [ebp+0x10], 0x0 # jump_from : 7C903F91
7C8FAE6E: push dword [ebp+0x14]
7C8FAE71: jz Label_7C8FAE84
7C8FAE73: push dword [ebp+0xc]
7C8FAE76: push dword [ebp+0x8]
7C8FAE79: call shlwapi.dll!6
7C8FAE7F: jmp Label_7C903F99
Label_7C8FAE84:
7C8FAE84: push dword [ebp+0x8] # jump_from : 7C8FAE71
7C8FAE87: call shlwapi.dll!4
7C8FAE8D: jmp Label_7C903F99
Label_7C903F7F:
7C903F7F: mov edi, edi
7C903F81: push ebp
7C903F82: mov ebp, esp
7C903F84: push dword [ebp+0x8]
7C903F87: call shlwapi.dll!PathFindExtensionW
7C903F8D: cmp word [eax], 0x0
7C903F91: jz Label_7C8FAE6A
7C903F97: xor eax, eax
Label_7C903F99:
7C903F99: pop ebp # jump_from : 7C8FAE7F 7C8FAE8D
7C903F9A: ret 0x10
end proc
shlwapi.dll!6は3引数の関数で、shlwapi.dll!4は2引数の関数で、PathFindExtensionWは1引数の関数です。
よろしくお願いいたします。
【プロセッサの種類】 x86 【OSの種類】 Win Server 2003 【言語】 C/C++
【報酬金額と送金方法】 報酬なし
【アセンブリまたは機械語】
proc Func7C903F7F@16 Label_7C903F7F
Label_7C8FAE6A:
7C8FAE6A: cmp dword [ebp+0x10], 0x0 # jump_from : 7C903F91
7C8FAE6E: push dword [ebp+0x14]
7C8FAE71: jz Label_7C8FAE84
7C8FAE73: push dword [ebp+0xc]
7C8FAE76: push dword [ebp+0x8]
7C8FAE79: call shlwapi.dll!6
7C8FAE7F: jmp Label_7C903F99
Label_7C8FAE84:
7C8FAE84: push dword [ebp+0x8] # jump_from : 7C8FAE71
7C8FAE87: call shlwapi.dll!4
7C8FAE8D: jmp Label_7C903F99
Label_7C903F7F:
7C903F7F: mov edi, edi
7C903F81: push ebp
7C903F82: mov ebp, esp
7C903F84: push dword [ebp+0x8]
7C903F87: call shlwapi.dll!PathFindExtensionW
7C903F8D: cmp word [eax], 0x0
7C903F91: jz Label_7C8FAE6A
7C903F97: xor eax, eax
Label_7C903F99:
7C903F99: pop ebp # jump_from : 7C8FAE7F 7C8FAE8D
7C903F9A: ret 0x10
end proc
shlwapi.dll!6は3引数の関数で、shlwapi.dll!4は2引数の関数で、PathFindExtensionWは1引数の関数です。
よろしくお願いいたします。
2021/06/20(日) 18:43:24.30ID:dQPhad/Q
>>10
最初の項目を1番目とする。正の向きを下向きまたは右向きとする。
問題の関数はFunc7C903F7F関数である。Func7C903F7Fは仮の名前で7C903F7Fが関数の仮想アドレスを表す。
Func7C903F7Fの入り口は、7C903F7Fである。出口は7C903F9A: ret 0x10とあるので、
Func7C903F7F関数は__stdcallであり 16バイトの引数リストを持つ。
おそらく32ビット(4バイト)の引数が4個ある。任意の関数「f」のi番目の実引数を「f.#i」と表すことにする。
最初に入口の7C903F7Fに入る。
7C903F7F: mov edi, edi
これは何もしない。
7C903F81: push ebp
7C903F82: mov ebp, esp
これはスタックフレームを確立する。すると
ESP=EBP=[(old EBP), (復帰アドレス), Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#3, Func7C903F7F.#4]
となる。よって[ebp+0x8]はFunc7C903F7F.#1である。さらに
7C903F84: push dword [ebp+0x8]
7C903F87: call shlwapi.dll!PathFindExtensionW
ここで、Func7C903F7F.#1をプッシュしてPathFindExtensionWを呼び出す。
PathFindExtensionWの呼び出し規約は__stdcallであるから、C言語風に書くと
eax = PathFindExtensionW(Func7C903F7F.#1);
となる。呼び出した後は、プッシュしたFunc7C903F7F.#1はスタックから解放される。
7C903F8D: cmp word [eax], 0x0
7C903F91: jz Label_7C8FAE6A
これはif (*(WORD *)eax == 0) goto Label_7C8FAE6A;と解釈される。このeaxはPathFindExtensionWの戻り値である。
*(WORD *)eaxの値によって次の(a.1)か(a.2)に分岐する。
(a.1) *(WORD *)eaxが非ゼロの場合。
7C903F97: xor eax, eax
ここでeaxはクリアされてスタックフレームが破棄されてFunc7C903F7F関数はゼロを返す。
(a.2) *(WORD *)eaxがゼロの場合。Label_7C8FAE6Aに飛ぶ。
7C8FAE6A: cmp dword [ebp+0x10], 0x0 # jump_from : 7C903F91
...(続く)...
最初の項目を1番目とする。正の向きを下向きまたは右向きとする。
問題の関数はFunc7C903F7F関数である。Func7C903F7Fは仮の名前で7C903F7Fが関数の仮想アドレスを表す。
Func7C903F7Fの入り口は、7C903F7Fである。出口は7C903F9A: ret 0x10とあるので、
Func7C903F7F関数は__stdcallであり 16バイトの引数リストを持つ。
おそらく32ビット(4バイト)の引数が4個ある。任意の関数「f」のi番目の実引数を「f.#i」と表すことにする。
最初に入口の7C903F7Fに入る。
7C903F7F: mov edi, edi
これは何もしない。
7C903F81: push ebp
7C903F82: mov ebp, esp
これはスタックフレームを確立する。すると
ESP=EBP=[(old EBP), (復帰アドレス), Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#3, Func7C903F7F.#4]
となる。よって[ebp+0x8]はFunc7C903F7F.#1である。さらに
7C903F84: push dword [ebp+0x8]
7C903F87: call shlwapi.dll!PathFindExtensionW
ここで、Func7C903F7F.#1をプッシュしてPathFindExtensionWを呼び出す。
PathFindExtensionWの呼び出し規約は__stdcallであるから、C言語風に書くと
eax = PathFindExtensionW(Func7C903F7F.#1);
となる。呼び出した後は、プッシュしたFunc7C903F7F.#1はスタックから解放される。
7C903F8D: cmp word [eax], 0x0
7C903F91: jz Label_7C8FAE6A
これはif (*(WORD *)eax == 0) goto Label_7C8FAE6A;と解釈される。このeaxはPathFindExtensionWの戻り値である。
*(WORD *)eaxの値によって次の(a.1)か(a.2)に分岐する。
(a.1) *(WORD *)eaxが非ゼロの場合。
7C903F97: xor eax, eax
ここでeaxはクリアされてスタックフレームが破棄されてFunc7C903F7F関数はゼロを返す。
(a.2) *(WORD *)eaxがゼロの場合。Label_7C8FAE6Aに飛ぶ。
7C8FAE6A: cmp dword [ebp+0x10], 0x0 # jump_from : 7C903F91
...(続く)...
2021/06/20(日) 18:44:37.17ID:dQPhad/Q
...(続き)...
ここでスタックは
ESP=EBP=[(old EBP), (復帰アドレス), Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#3, Func7C903F7F.#4]
であったから、[ebp+0x10]は、Func7C903F7F.#3である。
Func7C903F7F.#3とゼロを比較して結果をZeroFlagに格納する。
7C8FAE6E: push dword [ebp+0x14]
ここで[ebp+0x14]は、Func7C903F7F.#4であった。Func7C903F7F.#4をプッシュすると、
ESP=[Func7C903F7F.#4, (old EBP), (復帰アドレス), Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#3, Func7C903F7F.#4]
EBP=[(old EBP), (復帰アドレス), Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#3, Func7C903F7F.#4]
となる。次に進む。
7C8FAE71: jz Label_7C8FAE84
これは
if (ZeroFlag) goto Label_7C8FAE84;
となる。すなわちZeroFlagによって次の(b.1)か(b.2)に分岐する。
(b.1) ZeroFlagが偽の場合。
7C8FAE73: push dword [ebp+0xc]
ここで[ebp+0xc]は、Func7C903F7F.#2であった。Func7C903F7F.#2がプッシュされて
ESP=[Func7C903F7F.#2, Func7C903F7F.#4, (old EBP), (復帰アドレス), Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#3, Func7C903F7F.#4]
EBP=[(old EBP), (復帰アドレス), Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#3, Func7C903F7F.#4]
となる。さらに
7C8FAE76: push dword [ebp+0x8]
ここで[ebp+0x8]は、Func7C903F7F.#1であった。Func7C903F7F.#1がプッシュされて
ESP=[Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#4, (old EBP), (復帰アドレス), Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#3, Func7C903F7F.#4]
EBP=[(old EBP), (復帰アドレス), Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#3, Func7C903F7F.#4]
となる。
7C8FAE79: call shlwapi.dll!6
これはC風に書くとeax = shlwapi.dll!6(Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#4);となる。さらに
7C8FAE7F: jmp Label_7C903F99
でLabel_7C903F99に飛び、スタックフレームが破棄されて、Func7C903F7Fは戻り値eaxを返す。
(b.2) ZeroFlagが真の場合。Label_7C8FAE84に飛ぶ。
...(続く)...
ここでスタックは
ESP=EBP=[(old EBP), (復帰アドレス), Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#3, Func7C903F7F.#4]
であったから、[ebp+0x10]は、Func7C903F7F.#3である。
Func7C903F7F.#3とゼロを比較して結果をZeroFlagに格納する。
7C8FAE6E: push dword [ebp+0x14]
ここで[ebp+0x14]は、Func7C903F7F.#4であった。Func7C903F7F.#4をプッシュすると、
ESP=[Func7C903F7F.#4, (old EBP), (復帰アドレス), Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#3, Func7C903F7F.#4]
EBP=[(old EBP), (復帰アドレス), Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#3, Func7C903F7F.#4]
となる。次に進む。
7C8FAE71: jz Label_7C8FAE84
これは
if (ZeroFlag) goto Label_7C8FAE84;
となる。すなわちZeroFlagによって次の(b.1)か(b.2)に分岐する。
(b.1) ZeroFlagが偽の場合。
7C8FAE73: push dword [ebp+0xc]
ここで[ebp+0xc]は、Func7C903F7F.#2であった。Func7C903F7F.#2がプッシュされて
ESP=[Func7C903F7F.#2, Func7C903F7F.#4, (old EBP), (復帰アドレス), Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#3, Func7C903F7F.#4]
EBP=[(old EBP), (復帰アドレス), Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#3, Func7C903F7F.#4]
となる。さらに
7C8FAE76: push dword [ebp+0x8]
ここで[ebp+0x8]は、Func7C903F7F.#1であった。Func7C903F7F.#1がプッシュされて
ESP=[Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#4, (old EBP), (復帰アドレス), Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#3, Func7C903F7F.#4]
EBP=[(old EBP), (復帰アドレス), Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#3, Func7C903F7F.#4]
となる。
7C8FAE79: call shlwapi.dll!6
これはC風に書くとeax = shlwapi.dll!6(Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#4);となる。さらに
7C8FAE7F: jmp Label_7C903F99
でLabel_7C903F99に飛び、スタックフレームが破棄されて、Func7C903F7Fは戻り値eaxを返す。
(b.2) ZeroFlagが真の場合。Label_7C8FAE84に飛ぶ。
...(続く)...
2021/06/20(日) 18:46:06.04ID:dQPhad/Q
...(続き)...
7C8FAE84: push dword [ebp+0x8]
ここで[ebp+0x8]は、Func7C903F7F.#1であった。Func7C903F7F.#1がプッシュされて、
ESP=[Func7C903F7F.#1, Func7C903F7F.#4, (old EBP), (復帰アドレス), Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#3, Func7C903F7F.#4]
EBP=[(old EBP), (復帰アドレス), Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#3, Func7C903F7F.#4]
となる。さらに
7C8FAE87: call shlwapi.dll!4
これはC風に書くとeax = shlwapi.dll!4(Func7C903F7F.#1, Func7C903F7F.#4);となる。
7C8FAE8D: jmp Label_7C903F99
これでLabel_7C903F99に飛び、スタックフレームが破棄されてFunc7C903F7Fは戻り値eaxを返す。
以上をまとめると
unknown Func7C903F7F(unknown p1, unknown p2, unknown p3, unknown p4)
{
if (*(WORD *)PathFindExtensionW(p1) != 0)
return 0;
if (!p3)
return shlwapi.dll!4(p1, p4);
else
return shlwapi.dll!6(p1, p2, p4);
}
p1はPathFindExtensionWの引数なので、型はLPCWSTRである。p3は使われ方からBOOL型であると推測される。
ReactOSのソースdll/win32/shlwapi/shlwapi.specを見ると、
shlwapi.dll!4は、PathFileExistsDefExtWであり、shlwapi.dll!6は、PathFindOnPathExWである。
...(続く)...
7C8FAE84: push dword [ebp+0x8]
ここで[ebp+0x8]は、Func7C903F7F.#1であった。Func7C903F7F.#1がプッシュされて、
ESP=[Func7C903F7F.#1, Func7C903F7F.#4, (old EBP), (復帰アドレス), Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#3, Func7C903F7F.#4]
EBP=[(old EBP), (復帰アドレス), Func7C903F7F.#1, Func7C903F7F.#2, Func7C903F7F.#3, Func7C903F7F.#4]
となる。さらに
7C8FAE87: call shlwapi.dll!4
これはC風に書くとeax = shlwapi.dll!4(Func7C903F7F.#1, Func7C903F7F.#4);となる。
7C8FAE8D: jmp Label_7C903F99
これでLabel_7C903F99に飛び、スタックフレームが破棄されてFunc7C903F7Fは戻り値eaxを返す。
以上をまとめると
unknown Func7C903F7F(unknown p1, unknown p2, unknown p3, unknown p4)
{
if (*(WORD *)PathFindExtensionW(p1) != 0)
return 0;
if (!p3)
return shlwapi.dll!4(p1, p4);
else
return shlwapi.dll!6(p1, p2, p4);
}
p1はPathFindExtensionWの引数なので、型はLPCWSTRである。p3は使われ方からBOOL型であると推測される。
ReactOSのソースdll/win32/shlwapi/shlwapi.specを見ると、
shlwapi.dll!4は、PathFileExistsDefExtWであり、shlwapi.dll!6は、PathFindOnPathExWである。
...(続く)...
2021/06/20(日) 18:47:21.92ID:dQPhad/Q
...(続き)...
各関数のプロトタイプを確認し、整理すると
BOOL Func7C903F7F(LPCWSTR path, LPCWSTR *dirs, BOOL flag, DWORD dwWhich)
{
if (*PathFindExtensionW(path) != 0)
return FALSE;
if (!flag)
return PathFileExistsDefExtW(path, dwWhich);
else
return PathFindOnPathExW(path, dirs, dwWhich);
}
となり、これで逆コンパイルが完了する。 □
各関数のプロトタイプを確認し、整理すると
BOOL Func7C903F7F(LPCWSTR path, LPCWSTR *dirs, BOOL flag, DWORD dwWhich)
{
if (*PathFindExtensionW(path) != 0)
return FALSE;
if (!flag)
return PathFileExistsDefExtW(path, dwWhich);
else
return PathFindOnPathExW(path, dirs, dwWhich);
}
となり、これで逆コンパイルが完了する。 □
2021/06/20(日) 19:11:08.28ID:dQPhad/Q
【依頼の目的と内容説明】shell32.dllの解析 【プロセッサの種類】x86 【OSの種類】Win Server 2003 【言語】C/C++ 【報酬金額と送金方法】 報酬なし
【アセンブリまたは機械語】
proc Func7C8FF2D3@4 Label_7C8FF2D3
Label_7C8FF2D3:
7C8FF2D3: mov edi, edi
7C8FF2D5: push ebp
7C8FF2D6: mov ebp, esp
7C8FF2D8: push esi
7C8FF2D9: mov esi, [ebp+0x8]
7C8FF2DC: push esi
7C8FF2DD: call shlwapi.dll!PathIsUNCW@4
7C8FF2E2: test eax, eax
7C8FF2E4: jz Label_7C8FF3FC
Label_7C8FF2EA:
7C8FF2EA: xor eax, eax # jump_from : 7C8FF40C
7C8FF2EC: inc eax
Label_7C8FF2ED:
7C8FF2ED: pop esi # jump_from : 7C8FF414
7C8FF2EE: pop ebp
7C8FF2EF: ret 0x4
Label_7C8FF3FC:
7C8FF3FC: push esi # jump_from : 7C8FF2E4
7C8FF3FD: call shlwapi.dll!PathGetDriveNumberW@4
7C8FF402: cmp eax, 0xffffffff
7C8FF405: jz Label_7C8FF412
7C8FF407: cmp word [esi+0x4], 0x5c
7C8FF40C: jz Label_7C8FF2EA
Label_7C8FF412:
7C8FF412: xor eax, eax # jump_from : 7C8FF405
7C8FF414: jmp Label_7C8FF2ED
end proc
よろしくお願いいたします。
【アセンブリまたは機械語】
proc Func7C8FF2D3@4 Label_7C8FF2D3
Label_7C8FF2D3:
7C8FF2D3: mov edi, edi
7C8FF2D5: push ebp
7C8FF2D6: mov ebp, esp
7C8FF2D8: push esi
7C8FF2D9: mov esi, [ebp+0x8]
7C8FF2DC: push esi
7C8FF2DD: call shlwapi.dll!PathIsUNCW@4
7C8FF2E2: test eax, eax
7C8FF2E4: jz Label_7C8FF3FC
Label_7C8FF2EA:
7C8FF2EA: xor eax, eax # jump_from : 7C8FF40C
7C8FF2EC: inc eax
Label_7C8FF2ED:
7C8FF2ED: pop esi # jump_from : 7C8FF414
7C8FF2EE: pop ebp
7C8FF2EF: ret 0x4
Label_7C8FF3FC:
7C8FF3FC: push esi # jump_from : 7C8FF2E4
7C8FF3FD: call shlwapi.dll!PathGetDriveNumberW@4
7C8FF402: cmp eax, 0xffffffff
7C8FF405: jz Label_7C8FF412
7C8FF407: cmp word [esi+0x4], 0x5c
7C8FF40C: jz Label_7C8FF2EA
Label_7C8FF412:
7C8FF412: xor eax, eax # jump_from : 7C8FF405
7C8FF414: jmp Label_7C8FF2ED
end proc
よろしくお願いいたします。
2021/06/20(日) 20:40:13.59ID:dQPhad/Q
>>15
関数Func7C8FF2D3の入口7C8FF2D3より入る。
「7C8FF2D3: mov edi, edi」は何もしない。
7C8FF2D5: push ebp
7C8FF2D6: mov ebp, esp
スタックフレームを確立する。
7C8FF2D8: push esi
esiの値をスタックに保存する。
ESP=[(old ESI), (old EBP), (復帰アドレス), Func7C8FF2D3.#1],
EBP=[(old EBP), (復帰アドレス), Func7C8FF2D3.#1].
ここで、[ebp+0x8]は、Func7C8FF2D3.#1である。
7C8FF2D9: mov esi, [ebp+0x8]
esiにFunc7C8FF2D3.#1を代入する。
7C8FF2DC: push esi
7C8FF2DD: call shlwapi.dll!PathIsUNCW@4
esi=Func7C8FF2D3.#1をプッシュしてPathIsUNCWを呼ぶ。
C風に書くとeax = PathIsUNCW(Func7C8FF2D3.#1);
プッシュしたFunc7C8FF2D3.#1は呼び出し完了後、解放される。
7C8FF2E2: test eax, eax
7C8FF2E4: jz Label_7C8FF3FC
これはif (!eax) goto Label_7C8FF3FC;と解釈される。よって(c.1)と(c.2)に分岐する。
(c.1) eaxが非ゼロの場合。
7C8FF2EA: xor eax, eax
7C8FF2EC: inc eax
これはeaxに1を代入することに等しい。さらに
7C8FF2ED: pop esi
7C8FF2EE: pop ebp
7C8FF2EF: ret 0x4
ESIを復元し、スタックフレームを解放してeax=1を返す。
...(続く)...
関数Func7C8FF2D3の入口7C8FF2D3より入る。
「7C8FF2D3: mov edi, edi」は何もしない。
7C8FF2D5: push ebp
7C8FF2D6: mov ebp, esp
スタックフレームを確立する。
7C8FF2D8: push esi
esiの値をスタックに保存する。
ESP=[(old ESI), (old EBP), (復帰アドレス), Func7C8FF2D3.#1],
EBP=[(old EBP), (復帰アドレス), Func7C8FF2D3.#1].
ここで、[ebp+0x8]は、Func7C8FF2D3.#1である。
7C8FF2D9: mov esi, [ebp+0x8]
esiにFunc7C8FF2D3.#1を代入する。
7C8FF2DC: push esi
7C8FF2DD: call shlwapi.dll!PathIsUNCW@4
esi=Func7C8FF2D3.#1をプッシュしてPathIsUNCWを呼ぶ。
C風に書くとeax = PathIsUNCW(Func7C8FF2D3.#1);
プッシュしたFunc7C8FF2D3.#1は呼び出し完了後、解放される。
7C8FF2E2: test eax, eax
7C8FF2E4: jz Label_7C8FF3FC
これはif (!eax) goto Label_7C8FF3FC;と解釈される。よって(c.1)と(c.2)に分岐する。
(c.1) eaxが非ゼロの場合。
7C8FF2EA: xor eax, eax
7C8FF2EC: inc eax
これはeaxに1を代入することに等しい。さらに
7C8FF2ED: pop esi
7C8FF2EE: pop ebp
7C8FF2EF: ret 0x4
ESIを復元し、スタックフレームを解放してeax=1を返す。
...(続く)...
2021/06/20(日) 20:41:31.44ID:dQPhad/Q
...(続き)...
(c.2) eax非ゼロの場合。Label_7C8FF3FCに飛ぶ。
7C8FF3FC: push esi
7C8FF3FD: call shlwapi.dll!PathGetDriveNumberW@4
esi=Func7C8FF2D3.#1をプッシュしてPathGetDriveNumberWを呼ぶ。
これはeax = PathGetDriveNumberW(Func7C8FF2D3.#1);と解釈される。
7C8FF402: cmp eax, 0xffffffff
7C8FF405: jz Label_7C8FF412
eax、つまりPathGetDriveNumberWの戻り値が-1であればLabel_7C8FF412に飛ぶ。
これはif (eax == -1) goto Label_7C8FF412; と解釈される。
7C8FF407: cmp word [esi+0x4], 0x5c
7C8FF40C: jz Label_7C8FF2EA
これはif (((const WORD *)ESI)[2] == 0x5c) goto Label_7C8FF2EA;と解釈される。
7C8FF412: xor eax, eax
7C8FF414: jmp Label_7C8FF2ED
これはeaxをゼロクリアしてLabel_7C8FF2EDに飛ぶ。
...(続く)...
(c.2) eax非ゼロの場合。Label_7C8FF3FCに飛ぶ。
7C8FF3FC: push esi
7C8FF3FD: call shlwapi.dll!PathGetDriveNumberW@4
esi=Func7C8FF2D3.#1をプッシュしてPathGetDriveNumberWを呼ぶ。
これはeax = PathGetDriveNumberW(Func7C8FF2D3.#1);と解釈される。
7C8FF402: cmp eax, 0xffffffff
7C8FF405: jz Label_7C8FF412
eax、つまりPathGetDriveNumberWの戻り値が-1であればLabel_7C8FF412に飛ぶ。
これはif (eax == -1) goto Label_7C8FF412; と解釈される。
7C8FF407: cmp word [esi+0x4], 0x5c
7C8FF40C: jz Label_7C8FF2EA
これはif (((const WORD *)ESI)[2] == 0x5c) goto Label_7C8FF2EA;と解釈される。
7C8FF412: xor eax, eax
7C8FF414: jmp Label_7C8FF2ED
これはeaxをゼロクリアしてLabel_7C8FF2EDに飛ぶ。
...(続く)...
2021/06/20(日) 20:42:30.48ID:dQPhad/Q
...(続き)... まとめると
unknown Func7C8FF2D3(unknown p1)
{
eax = PathIsUNCW(p1);
if (eax)
{
Label_7C8FF2EA:
eax = 1;
Label_7C8FF2ED:
return eax;
}
eax = PathGetDriveNumberW(p1);
if (eax == -1)
goto Label_7C8FF412;
if (((const WORD *)p1)[2] == 0x5C)
goto Label_7C8FF2EA;
Label_7C8FF412:
eax = 0;
goto Label_7C8FF2ED;
}
整理すると
BOOL Func7C8FF2D3(LPCWSTR path)
{
if (PathIsUNCW(path))
return TRUE;
if (PathGetDriveNumberW(path) == -1)
return FALSE;
return (path[2] == L'\\');
}
となる。逆コンパイル完了。 □
unknown Func7C8FF2D3(unknown p1)
{
eax = PathIsUNCW(p1);
if (eax)
{
Label_7C8FF2EA:
eax = 1;
Label_7C8FF2ED:
return eax;
}
eax = PathGetDriveNumberW(p1);
if (eax == -1)
goto Label_7C8FF412;
if (((const WORD *)p1)[2] == 0x5C)
goto Label_7C8FF2EA;
Label_7C8FF412:
eax = 0;
goto Label_7C8FF2ED;
}
整理すると
BOOL Func7C8FF2D3(LPCWSTR path)
{
if (PathIsUNCW(path))
return TRUE;
if (PathGetDriveNumberW(path) == -1)
return FALSE;
return (path[2] == L'\\');
}
となる。逆コンパイル完了。 □
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国、日本行き“50万人”キャンセル 渡航自粛でコロナ禍以来最大 ★2 [お断り★]
- 中国、日本行き“50万人”キャンセル 渡航自粛でコロナ禍以来最大 [お断り★]
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 ★5 [ぐれ★]
- 【次の一手】台湾問題で小林よしのり氏が私見「まさに戦争前夜」「ただちに徴兵制を敷いて、高市支持者を最前線へ」… ★4 [BFU★]
- 【速報】日本産牛肉の対中国輸出再開協議が中止 ★2 [おっさん友の会★]
- 毛寧(もう・ねい)報道官「中国に日本の水産品の市場は無い」 高市首相の国会答弁に「中国民衆の強い怒り」 [ぐれ★]
- 【悲報】高市早苗さん、もう辞職しか選択肢がない… [271912485]
- 【愛国者速報】フィフィ、中国の“日本産水産物輸入停止”措置に私見「中国依存しないとやっていけない企業は考えを改めて」 [856698234]
- 【ござる専🏡】風間🥷配信実況スレ🏯【風間いろは】
- 中国・環球時報「沖縄は日本領ではないのでは?」高市 [931948549]
- 【速報】中国政府、ゲームを禁輸。原神やブルアカ、荒野行動が日本で影響 [347751896]
- 中国「私達が怒ってるのは日本の政治家に対してで、日本の観光客や日本企業はこれまで通り歓迎する。これこそが大国としての余裕」 [377482965]
