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'\\');
}
となる。逆コンパイル完了。 □
2021/06/20(日) 22:50:23.97ID:b3Yj6C5d
>>18
もっと簡略化できるよ。
BOOL Func7C8FF2D3(LPCWSTR path)
{
return PathIsUNCW(path) || (PathGetDriveNumberW(path) != -1 && path[2] == L'\\');
}
もっと簡略化できるよ。
BOOL Func7C8FF2D3(LPCWSTR path)
{
return PathIsUNCW(path) || (PathGetDriveNumberW(path) != -1 && path[2] == L'\\');
}
2021/06/21(月) 07:48:39.30ID:6C6uvD3w
【依頼の目的と内容説明】 shell32.dllの解析
【プロセッサの種類】 x86 【OSの種類】 Win Server 2003 【言語】 C/C++
【報酬金額と送金方法】 報酬なし
【アセンブリまたは機械語】
proc Func7C9A5238@4 Label_7C9A5238
Label_7C9A5238:
7C9A5238: mov edi, edi
7C9A523A: push ebp
7C9A523B: mov ebp, esp
7C9A523D: sub esp, 0x20c
7C9A5243: mov eax, [0x7cae9764]
7C9A5248: push edi
7C9A5249: mov edi, [ebp+0x8]
7C9A524C: test edi, edi
7C9A524E: mov [ebp-0x4], eax
7C9A5251: jnz Label_7C9A5257
7C9A5253: xor eax, eax
7C9A5255: jmp Label_7C9A528D
Label_7C9A5257:
7C9A5257: push esi # jump_from : 7C9A5251
7C9A5258: lea eax, [ebp-0x20c]
7C9A525E: push eax
7C9A525F: mov esi, 0x104
7C9A5264: push esi
7C9A5265: call kernel32.dll!GetCurrentDirectoryW
7C9A526B: test eax, eax
7C9A526D: jz Label_7C9A528A
7C9A526F: cmp eax, esi
7C9A5271: ja Label_7C9A528A
7C9A5273: push edi
...(続く)...
【プロセッサの種類】 x86 【OSの種類】 Win Server 2003 【言語】 C/C++
【報酬金額と送金方法】 報酬なし
【アセンブリまたは機械語】
proc Func7C9A5238@4 Label_7C9A5238
Label_7C9A5238:
7C9A5238: mov edi, edi
7C9A523A: push ebp
7C9A523B: mov ebp, esp
7C9A523D: sub esp, 0x20c
7C9A5243: mov eax, [0x7cae9764]
7C9A5248: push edi
7C9A5249: mov edi, [ebp+0x8]
7C9A524C: test edi, edi
7C9A524E: mov [ebp-0x4], eax
7C9A5251: jnz Label_7C9A5257
7C9A5253: xor eax, eax
7C9A5255: jmp Label_7C9A528D
Label_7C9A5257:
7C9A5257: push esi # jump_from : 7C9A5251
7C9A5258: lea eax, [ebp-0x20c]
7C9A525E: push eax
7C9A525F: mov esi, 0x104
7C9A5264: push esi
7C9A5265: call kernel32.dll!GetCurrentDirectoryW
7C9A526B: test eax, eax
7C9A526D: jz Label_7C9A528A
7C9A526F: cmp eax, esi
7C9A5271: ja Label_7C9A528A
7C9A5273: push edi
...(続く)...
2021/06/21(月) 07:58:16.17ID:6C6uvD3w
...(続き)...
7C9A5274: lea eax, [ebp-0x20c]
7C9A527A: push eax
7C9A527B: push edi
7C9A527C: call shlwapi.dll!PathCombineW
7C9A5282: neg eax
7C9A5284: sbb eax, eax
7C9A5286: neg eax
7C9A5288: jmp Label_7C9A528C
Label_7C9A528A:
7C9A528A: xor eax, eax # jump_from : 7C9A526D 7C9A5271
Label_7C9A528C:
7C9A528C: pop esi # jump_from : 7C9A5288
Label_7C9A528D:
7C9A528D: mov ecx, [ebp-0x4] # jump_from : 7C9A5255
7C9A5290: pop edi
7C9A5291: call Func7C92EC80
7C9A5296: leave
7C9A5297: ret 0x4
end proc
よろしくお願いいたします。
7C9A5274: lea eax, [ebp-0x20c]
7C9A527A: push eax
7C9A527B: push edi
7C9A527C: call shlwapi.dll!PathCombineW
7C9A5282: neg eax
7C9A5284: sbb eax, eax
7C9A5286: neg eax
7C9A5288: jmp Label_7C9A528C
Label_7C9A528A:
7C9A528A: xor eax, eax # jump_from : 7C9A526D 7C9A5271
Label_7C9A528C:
7C9A528C: pop esi # jump_from : 7C9A5288
Label_7C9A528D:
7C9A528D: mov ecx, [ebp-0x4] # jump_from : 7C9A5255
7C9A5290: pop edi
7C9A5291: call Func7C92EC80
7C9A5296: leave
7C9A5297: ret 0x4
end proc
よろしくお願いいたします。
2021/06/21(月) 09:21:15.08ID:6C6uvD3w
>>20-21
INT Func7C9A5238(LPWSTR p1)
{
WCHAR path1[MAX_PATH];
DWORD cch, v1 = *(DWORD*)0x7cae9764;
BOOL ret = FALSE;
if (p1 == NULL)
goto Quit;
cch = GetCurrentDirectoryW(MAX_PATH, path1);
if (!cch || cch > MAX_PATH)
goto Quit;
if (PathCombineW(p1, path1, p1) != NULL)
ret = TRUE;
Quit:
ecx = v1;
Func7C92EC80(...); // 引数はわからない。ecxの値をチェックしているようだ。
return ret;
}
□
INT Func7C9A5238(LPWSTR p1)
{
WCHAR path1[MAX_PATH];
DWORD cch, v1 = *(DWORD*)0x7cae9764;
BOOL ret = FALSE;
if (p1 == NULL)
goto Quit;
cch = GetCurrentDirectoryW(MAX_PATH, path1);
if (!cch || cch > MAX_PATH)
goto Quit;
if (PathCombineW(p1, path1, p1) != NULL)
ret = TRUE;
Quit:
ecx = v1;
Func7C92EC80(...); // 引数はわからない。ecxの値をチェックしているようだ。
return ret;
}
□
2021/06/21(月) 09:34:40.87ID:6C6uvD3w
【依頼の目的と内容説明】 shell32.dllの解析
【プロセッサの種類】 x86 【OSの種類】 Win Server 2003 【言語】 C/C++
【報酬金額と送金方法】 報酬なし
【アセンブリまたは機械語】
proc Func7C92C7B9@12 Label_7C92C7B9
Label_7C9138BF:
7C9138BF: dec edx # jump_from : 7C92C7E9
7C9138C0: dec edx
7C9138C1: mov eax, 0x8007007a
7C9138C6: jmp Label_7C92C7EF
Label_7C92C7B9:
7C92C7B9: mov edi, edi
7C92C7BB: push ebp
7C92C7BC: mov ebp, esp
7C92C7BE: xor eax, eax
7C92C7C0: cmp [ebp+0xc], eax
7C92C7C3: jz Label_7C98E437
7C92C7C9: mov edx, [ebp+0x8]
7C92C7CC: push esi
7C92C7CD: mov esi, [ebp+0x10]
Label_7C92C7D0:
7C92C7D0: mov cx, [esi] # jump_from : 7C92C7E2
7C92C7D3: test cx, cx
7C92C7D6: jz Label_7C92C7E4
7C92C7D8: mov [edx], cx
7C92C7DB: inc edx
7C92C7DC: inc edx
7C92C7DD: inc esi
7C92C7DE: inc esi
...(続く)...
【プロセッサの種類】 x86 【OSの種類】 Win Server 2003 【言語】 C/C++
【報酬金額と送金方法】 報酬なし
【アセンブリまたは機械語】
proc Func7C92C7B9@12 Label_7C92C7B9
Label_7C9138BF:
7C9138BF: dec edx # jump_from : 7C92C7E9
7C9138C0: dec edx
7C9138C1: mov eax, 0x8007007a
7C9138C6: jmp Label_7C92C7EF
Label_7C92C7B9:
7C92C7B9: mov edi, edi
7C92C7BB: push ebp
7C92C7BC: mov ebp, esp
7C92C7BE: xor eax, eax
7C92C7C0: cmp [ebp+0xc], eax
7C92C7C3: jz Label_7C98E437
7C92C7C9: mov edx, [ebp+0x8]
7C92C7CC: push esi
7C92C7CD: mov esi, [ebp+0x10]
Label_7C92C7D0:
7C92C7D0: mov cx, [esi] # jump_from : 7C92C7E2
7C92C7D3: test cx, cx
7C92C7D6: jz Label_7C92C7E4
7C92C7D8: mov [edx], cx
7C92C7DB: inc edx
7C92C7DC: inc edx
7C92C7DD: inc esi
7C92C7DE: inc esi
...(続く)...
2021/06/21(月) 09:35:10.89ID:6C6uvD3w
...(続き)...
7C92C7DF: dec dword [ebp+0xc]
7C92C7E2: jnz Label_7C92C7D0
Label_7C92C7E4:
7C92C7E4: cmp dword [ebp+0xc], 0x0 # jump_from : 7C92C7D6
7C92C7E8: pop esi
7C92C7E9: jz Label_7C9138BF
Label_7C92C7EF:
7C92C7EF: and word [edx], 0x0 # jump_from : 7C9138C6
Label_7C92C7F3:
7C92C7F3: pop ebp # jump_from : 7C98E43C
7C92C7F4: ret 0xc
Label_7C98E437:
7C98E437: mov eax, 0x80070057 # jump_from : 7C92C7C3
7C98E43C: jmp Label_7C92C7F3
end proc
よろしくお願いいたします。
7C92C7DF: dec dword [ebp+0xc]
7C92C7E2: jnz Label_7C92C7D0
Label_7C92C7E4:
7C92C7E4: cmp dword [ebp+0xc], 0x0 # jump_from : 7C92C7D6
7C92C7E8: pop esi
7C92C7E9: jz Label_7C9138BF
Label_7C92C7EF:
7C92C7EF: and word [edx], 0x0 # jump_from : 7C9138C6
Label_7C92C7F3:
7C92C7F3: pop ebp # jump_from : 7C98E43C
7C92C7F4: ret 0xc
Label_7C98E437:
7C98E437: mov eax, 0x80070057 # jump_from : 7C92C7C3
7C98E43C: jmp Label_7C92C7F3
end proc
よろしくお願いいたします。
2021/06/21(月) 11:07:32.85ID:6C6uvD3w
>>23-24
入口は7C92C7B9から。出口は
7C92C7F3: pop ebp # jump_from : 7C98E43C
7C92C7F4: ret 0xc
である。0xc == 12だから関数Func7C92C7B9の引数はおそらく3個。
「7C92C7B9: mov edi, edi」は何もしない。
7C92C7BB: push ebp
7C92C7BC: mov ebp, esp
スタックフレームを確立。その直後、
ESP=EBP=[(old EBP), (復帰アドレス), Func7C92C7B9.#1, Func7C92C7B9.#2, Func7C92C7B9.#3]
となっている。
7C92C7BE: xor eax, eax
eaxをゼロクリア。
7C92C7C0: cmp [ebp+0xc], eax
7C92C7C3: jz Label_7C98E437
Func7C92C7B9.#2とeax(==0)を比較し、等しければLabel_7C98E437に飛ぶ。
すなわち if (Func7C92C7B9.#2 == 0) goto Label_7C98E437;
7C92C7C9: mov edx, [ebp+0x8]
Func7C92C7B9.#1をedxに代入する。
7C92C7CC: push esi
esiをスタックに保存する。
EBP=[(old EBP), (復帰アドレス), Func7C92C7B9.#1, Func7C92C7B9.#2, Func7C92C7B9.#3]
ESP=[(old ESI), (old EBP), (復帰アドレス), Func7C92C7B9.#1, Func7C92C7B9.#2, Func7C92C7B9.#3]
7C92C7CD: mov esi, [ebp+0x10]
Func7C92C7B9.#3をESIに代入する。
Label_7C92C7D0:
7C92C7D0: mov cx, [esi]
これはcx = *(WORD*)esi; と解釈される。
7C92C7D3: test cx, cx
7C92C7D6: jz Label_7C92C7E4
...(続く)...
入口は7C92C7B9から。出口は
7C92C7F3: pop ebp # jump_from : 7C98E43C
7C92C7F4: ret 0xc
である。0xc == 12だから関数Func7C92C7B9の引数はおそらく3個。
「7C92C7B9: mov edi, edi」は何もしない。
7C92C7BB: push ebp
7C92C7BC: mov ebp, esp
スタックフレームを確立。その直後、
ESP=EBP=[(old EBP), (復帰アドレス), Func7C92C7B9.#1, Func7C92C7B9.#2, Func7C92C7B9.#3]
となっている。
7C92C7BE: xor eax, eax
eaxをゼロクリア。
7C92C7C0: cmp [ebp+0xc], eax
7C92C7C3: jz Label_7C98E437
Func7C92C7B9.#2とeax(==0)を比較し、等しければLabel_7C98E437に飛ぶ。
すなわち if (Func7C92C7B9.#2 == 0) goto Label_7C98E437;
7C92C7C9: mov edx, [ebp+0x8]
Func7C92C7B9.#1をedxに代入する。
7C92C7CC: push esi
esiをスタックに保存する。
EBP=[(old EBP), (復帰アドレス), Func7C92C7B9.#1, Func7C92C7B9.#2, Func7C92C7B9.#3]
ESP=[(old ESI), (old EBP), (復帰アドレス), Func7C92C7B9.#1, Func7C92C7B9.#2, Func7C92C7B9.#3]
7C92C7CD: mov esi, [ebp+0x10]
Func7C92C7B9.#3をESIに代入する。
Label_7C92C7D0:
7C92C7D0: mov cx, [esi]
これはcx = *(WORD*)esi; と解釈される。
7C92C7D3: test cx, cx
7C92C7D6: jz Label_7C92C7E4
...(続く)...
2021/06/21(月) 11:09:09.06ID:6C6uvD3w
...(続き)...
cxがゼロならばLabel_7C92C7E4に飛ぶ。
すなわちif (*(WORD*)esi == 0) goto Label_7C92C7E4;
7C92C7D8: mov [edx], cx
これは*(WORD*)edx = *(WORD*)esi; と解釈される。
7C92C7DB: inc edx
7C92C7DC: inc edx
7C92C7DD: inc esi
7C92C7DE: inc esi
edxとesiをそれぞれ2だけ増やす。
7C92C7DF: dec dword [ebp+0xc]
ここで[ebp+0xc]は、Func7C92C7B9.#2であった。
Func7C92C7B9.#2を1だけ減らし、減してた結果がゼロならZeroFlagをTRUEにする。
7C92C7E2: jnz Label_7C92C7D0
ZeroFlagがFALSEならばLabel_7C92C7D0に飛ぶ。
Label_7C92C7E4:
7C92C7E4: cmp dword [ebp+0xc], 0x0 # jump_from : 7C92C7D6
Func7C92C7B9.#2とゼロを比較する。
7C92C7E8: pop esi
esiを元に戻す。
EBP=[(old EBP), (復帰アドレス), Func7C92C7B9.#1, Func7C92C7B9.#2, Func7C92C7B9.#3]
ESP=[(old EBP), (復帰アドレス), Func7C92C7B9.#1, Func7C92C7B9.#2, Func7C92C7B9.#3]
7C92C7E9: jz Label_7C9138BF
Func7C92C7B9.#2とゼロが等しければ、Label_7C9138BFに飛ぶ。
Label_7C92C7EF:
7C92C7EF: and word [edx], 0x0 # jump_from : 7C9138C6
*(WORD*)edxをゼロにする。
Label_7C92C7F3:
7C92C7F3: pop ebp # jump_from : 7C98E43C
7C92C7F4: ret 0xc
...(続く)...
cxがゼロならばLabel_7C92C7E4に飛ぶ。
すなわちif (*(WORD*)esi == 0) goto Label_7C92C7E4;
7C92C7D8: mov [edx], cx
これは*(WORD*)edx = *(WORD*)esi; と解釈される。
7C92C7DB: inc edx
7C92C7DC: inc edx
7C92C7DD: inc esi
7C92C7DE: inc esi
edxとesiをそれぞれ2だけ増やす。
7C92C7DF: dec dword [ebp+0xc]
ここで[ebp+0xc]は、Func7C92C7B9.#2であった。
Func7C92C7B9.#2を1だけ減らし、減してた結果がゼロならZeroFlagをTRUEにする。
7C92C7E2: jnz Label_7C92C7D0
ZeroFlagがFALSEならばLabel_7C92C7D0に飛ぶ。
Label_7C92C7E4:
7C92C7E4: cmp dword [ebp+0xc], 0x0 # jump_from : 7C92C7D6
Func7C92C7B9.#2とゼロを比較する。
7C92C7E8: pop esi
esiを元に戻す。
EBP=[(old EBP), (復帰アドレス), Func7C92C7B9.#1, Func7C92C7B9.#2, Func7C92C7B9.#3]
ESP=[(old EBP), (復帰アドレス), Func7C92C7B9.#1, Func7C92C7B9.#2, Func7C92C7B9.#3]
7C92C7E9: jz Label_7C9138BF
Func7C92C7B9.#2とゼロが等しければ、Label_7C9138BFに飛ぶ。
Label_7C92C7EF:
7C92C7EF: and word [edx], 0x0 # jump_from : 7C9138C6
*(WORD*)edxをゼロにする。
Label_7C92C7F3:
7C92C7F3: pop ebp # jump_from : 7C98E43C
7C92C7F4: ret 0xc
...(続く)...
2021/06/21(月) 11:11:17.74ID:6C6uvD3w
...(続き)...
関数Func7C92C7B9から戻る。戻り値はeaxまたはなし。
Label_7C98E437:
7C98E437: mov eax, 0x80070057 # jump_from : 7C92C7C3
7C98E43C: jmp Label_7C92C7F3
0x80070057はおそらくE_INVALIDARG。
eax にE_INVALIDARGを代入してLabel_7C92C7F3へ飛ぶ。
Label_7C9138BFについて:
7C9138BF: dec edx # jump_from : 7C92C7E9
7C9138C0: dec edx
7C9138C1: mov eax, 0x8007007a
7C9138C6: jmp Label_7C92C7EF
edxを2だけ減らし、eaxにE_NOT_SUFFICIENT_BUFFERを代入してLabel_7C92C7EFに飛ぶ。
...(続く)...
関数Func7C92C7B9から戻る。戻り値はeaxまたはなし。
Label_7C98E437:
7C98E437: mov eax, 0x80070057 # jump_from : 7C92C7C3
7C98E43C: jmp Label_7C92C7F3
0x80070057はおそらくE_INVALIDARG。
eax にE_INVALIDARGを代入してLabel_7C92C7F3へ飛ぶ。
Label_7C9138BFについて:
7C9138BF: dec edx # jump_from : 7C92C7E9
7C9138C0: dec edx
7C9138C1: mov eax, 0x8007007a
7C9138C6: jmp Label_7C92C7EF
edxを2だけ減らし、eaxにE_NOT_SUFFICIENT_BUFFERを代入してLabel_7C92C7EFに飛ぶ。
...(続く)...
2021/06/21(月) 11:13:11.16ID:6C6uvD3w
...(続き)...
整理すると
HRESULT Func7C92C7B9(LPWSTR pszDest, DWORD cchDest, LPCWSTR pszSrc)
{
LPWSTR dest = pszDest;
LPCWSTR src = pszSrc;
if (cchDest == 0) return E_INVALIDARG;
do
{
if (*src == 0) break;
*dest++ = *src++;
} while (--cchDest != 0);
if (cchDest == 0)
{
--dest;
*dest = 0;
return E_NOT_SUFFICIENT_BUFFER;
}
*dest = 0;
return S_OK;
}
これで逆コンパイルは完了。
この関数はおそらく<strsafe.h>のStringCchCopyWだと思われる。 □
整理すると
HRESULT Func7C92C7B9(LPWSTR pszDest, DWORD cchDest, LPCWSTR pszSrc)
{
LPWSTR dest = pszDest;
LPCWSTR src = pszSrc;
if (cchDest == 0) return E_INVALIDARG;
do
{
if (*src == 0) break;
*dest++ = *src++;
} while (--cchDest != 0);
if (cchDest == 0)
{
--dest;
*dest = 0;
return E_NOT_SUFFICIENT_BUFFER;
}
*dest = 0;
return S_OK;
}
これで逆コンパイルは完了。
この関数はおそらく<strsafe.h>のStringCchCopyWだと思われる。 □
2021/06/21(月) 11:44:38.13ID:6C6uvD3w
【依頼の目的と内容説明】 shell32.dllの解析
【プロセッサの種類】 x86 【OSの種類】 Win Server 2003 【言語】 C/C++
【報酬金額と送金方法】 報酬なし
【アセンブリまたは機械語】
長いのでこちらに貼ります:
https://justpaste.it/6e2t2
Func7C92C7B9は前述のStringCchCopyW関数です。
Func7C92EC80の引数は不明ですが、戻り値がvoidでecxをチェックすることが分かっています。
shlwapi.dll!448は、VOID WINAPI FixSlashesAndColonW(LPWSTR lpwstr)です。
shlwapi.dll!456は、BOOL WINAPI PathIsValidCharW(WCHAR c, DWORD class)です。
長いですが、解析お願いします。
【プロセッサの種類】 x86 【OSの種類】 Win Server 2003 【言語】 C/C++
【報酬金額と送金方法】 報酬なし
【アセンブリまたは機械語】
長いのでこちらに貼ります:
https://justpaste.it/6e2t2
Func7C92C7B9は前述のStringCchCopyW関数です。
Func7C92EC80の引数は不明ですが、戻り値がvoidでecxをチェックすることが分かっています。
shlwapi.dll!448は、VOID WINAPI FixSlashesAndColonW(LPWSTR lpwstr)です。
shlwapi.dll!456は、BOOL WINAPI PathIsValidCharW(WCHAR c, DWORD class)です。
長いですが、解析お願いします。
2021/06/21(月) 19:19:37.61ID:6C6uvD3w
2021/06/22(火) 23:46:23.94ID:r0+t7d7W
2021/06/23(水) 08:58:52.22ID:VZC5/Bjf
【依頼の目的と内容説明】 shell32.dllの解析
【プロセッサの種類】 x86 【OSの種類】 Win Server 2003 【言語】 C/C++
【報酬金額と送金方法】 報酬なし
【アセンブリまたは機械語】
https://justpaste.it/9pwe4
解読お願いします。
【プロセッサの種類】 x86 【OSの種類】 Win Server 2003 【言語】 C/C++
【報酬金額と送金方法】 報酬なし
【アセンブリまたは機械語】
https://justpaste.it/9pwe4
解読お願いします。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国、日本行き“50万人”キャンセル 渡航自粛でコロナ禍以来最大 ★2 [お断り★]
- 中国、日本行き“50万人”キャンセル 渡航自粛でコロナ禍以来最大 [お断り★]
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 ★5 [ぐれ★]
- 【次の一手】台湾問題で小林よしのり氏が私見「まさに戦争前夜」「ただちに徴兵制を敷いて、高市支持者を最前線へ」… ★4 [BFU★]
- 【速報】日本産牛肉の対中国輸出再開協議が中止 ★2 [おっさん友の会★]
- 毛寧(もう・ねい)報道官「中国に日本の水産品の市場は無い」 高市首相の国会答弁に「中国民衆の強い怒り」 [ぐれ★]
- 【悲報】高市早苗さん、もう辞職しか選択肢がない… [271912485]
- 【愛国者速報】フィフィ、中国の“日本産水産物輸入停止”措置に私見「中国依存しないとやっていけない企業は考えを改めて」 [856698234]
- 【ござる専🏡】風間🥷配信実況スレ🏯【風間いろは】
- 中国・環球時報「沖縄は日本領ではないのでは?」高市 [931948549]
- 【速報】中国政府、ゲームを禁輸。原神やブルアカ、荒野行動が日本で影響 [347751896]
- 中国「私達が怒ってるのは日本の政治家に対してで、日本の観光客や日本企業はこれまで通り歓迎する。これこそが大国としての余裕」 [377482965]
