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
解読お願いします。
2021/06/23(水) 14:11:48.77ID:VZC5/Bjf
>>32
https://wtools.io/paste-code/b58W
Func7C903F7Fは拡張子に関する探索を行う関数とみられる。
Func7C8FF2D3は絶対パスかチェックする関数とみられる。
Func7C9A5238は絶対パスを構築する関数とみられる。
https://wtools.io/paste-code/b58W
Func7C903F7Fは拡張子に関する探索を行う関数とみられる。
Func7C8FF2D3は絶対パスかチェックする関数とみられる。
Func7C9A5238は絶対パスを構築する関数とみられる。
2021/06/24(木) 14:47:00.14ID:70oiT5zZ
小学生が大人に九九暗唱してみせれば微笑ましいが
大人が大人に九九暗唱してみせるなら不気味で滑稽である
大人が大人に九九暗唱してみせるなら不気味で滑稽である
2021/06/24(木) 16:39:48.53ID:KFTtHP2O
複雑怪奇なアセンブリだけど、どうやって逆アセしてるんですか?
2021/06/24(木) 16:41:35.70ID:GPZ7ub3d
>>35
逆汗にはCodeReverse2というソフトを使用した。
ビルドさえ出来れば無料で使用できる。
katahiromz/CodeReverse2
https://github.com/katahiromz/CodeReverse2
逆汗にはCodeReverse2というソフトを使用した。
ビルドさえ出来れば無料で使用できる。
katahiromz/CodeReverse2
https://github.com/katahiromz/CodeReverse2
2021/06/24(木) 17:12:02.26ID:KFTtHP2O
普通にgit cloneしたけど、ビルド出来ないよ
2021/06/24(木) 17:15:49.84ID:GPZ7ub3d
>>37
CodeReverse2は、udis86というサブモジュールを含んでいるので
単純なgit cloneだけでは取得できない。詳しくはこちらのページ:
https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E3%82%B5%E3%83%96%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB
の「サブモジュールを含むプロジェクトのクローン」を参照されたい。
CodeReverse2は、udis86というサブモジュールを含んでいるので
単純なgit cloneだけでは取得できない。詳しくはこちらのページ:
https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E3%82%B5%E3%83%96%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB
の「サブモジュールを含むプロジェクトのクローン」を参照されたい。
2021/06/24(木) 17:20:01.56ID:KFTtHP2O
わかった。git cloneに--recursiveを付ければダウンロードできるんだ。ありがとう
git clone --recursive https://github.com/katahiromz/CodeReverse2
git clone --recursive https://github.com/katahiromz/CodeReverse2
2021/06/24(木) 18:02:34.25ID:KFTtHP2O
早くしないとx86 PC死んじゃうよ(何を)。
2021/06/24(木) 19:04:47.18ID:VS1e3y9e
katayamaさんは秀才
2021/06/24(木) 19:30:04.89ID:GPZ7ub3d
世の中には様々な逆コンパがあるが、コンピュータの歴史上、一般のPC上で
無料で正確なコードを出力するものは存在しない。ある程度性能のある逆コンパは、
車一台買えるような値段になる。
しかも、従来の逆コンパは、本当の逆変換になっていない未熟なものである
(つまり、逆コンパしたコードはほとんどコンパイルできない)。
情報技術者のほとんどが人間の考えを機械の言葉にすることを考えてきたが、
逆に機械語をプログラミングの言葉に直そうと考えて究極の答えにたどり着いた人は
ほとんど居ない。
私は、人間にもコンピュータにも分かる、トレース(追跡)可能な逆コンパ用の言葉が
必要だと考えている。
まず、一般的にアセンブリは次のように「```asm」と「```」という二つの行で囲って表すこととする。
```asm
push eax
pop ebx
```
これはGitHubなどで使われているMarkDownと同じ記述方法であるので
受け入れ可能であろう。「`」はバッククォートという記号であり、日本語109キー
ボードではShift+@で入力できる。
無料で正確なコードを出力するものは存在しない。ある程度性能のある逆コンパは、
車一台買えるような値段になる。
しかも、従来の逆コンパは、本当の逆変換になっていない未熟なものである
(つまり、逆コンパしたコードはほとんどコンパイルできない)。
情報技術者のほとんどが人間の考えを機械の言葉にすることを考えてきたが、
逆に機械語をプログラミングの言葉に直そうと考えて究極の答えにたどり着いた人は
ほとんど居ない。
私は、人間にもコンピュータにも分かる、トレース(追跡)可能な逆コンパ用の言葉が
必要だと考えている。
まず、一般的にアセンブリは次のように「```asm」と「```」という二つの行で囲って表すこととする。
```asm
push eax
pop ebx
```
これはGitHubなどで使われているMarkDownと同じ記述方法であるので
受け入れ可能であろう。「`」はバッククォートという記号であり、日本語109キー
ボードではShift+@で入力できる。
2021/06/24(木) 19:32:52.43ID:m+XEGxhu
バッククォートくらい知っとるわアホが
2021/06/24(木) 19:38:00.14ID:GPZ7ub3d
アセンブリは左側に仮想アドレスを書いてもよい。
```asm
7CAB1C58: mov ebp, esp
7CAB1C5A: mov ecx, [ebp+0x8]
```
この場合「mov ebp, esp」は仮想アドレス0x7CAB1C58にあり、
「mov ecx, [ebp+0x8]」は仮想アドレス0x7CAB1C5Aにある。
「:」はコロンという記号である。
また、ジャンプ先のラベルを表す一行をアセンブリに記載してもよい。
例えば、次の「Label_7CAB1C55:」はラベル行を表す。
```asm
Label_7CAB1C55:
7CAB1C55: mov edi, edi
7CAB1C57: push ebp
```
```asm
7CAB1C58: mov ebp, esp
7CAB1C5A: mov ecx, [ebp+0x8]
```
この場合「mov ebp, esp」は仮想アドレス0x7CAB1C58にあり、
「mov ecx, [ebp+0x8]」は仮想アドレス0x7CAB1C5Aにある。
「:」はコロンという記号である。
また、ジャンプ先のラベルを表す一行をアセンブリに記載してもよい。
例えば、次の「Label_7CAB1C55:」はラベル行を表す。
```asm
Label_7CAB1C55:
7CAB1C55: mov edi, edi
7CAB1C57: push ebp
```
2021/06/24(木) 20:46:18.12ID:GPZ7ub3d
私が考えているのは、2つのプログラムに対する演算や関係を記述するメタ言語である。
次のような記号を考えよう。
```x
PX
```
[===]
```y
PY
```
上記は「言語Xのプログラム「PX」は言語Yのプログラム「PY」と同値である」と読む。
[===]は、プログラムの同値関係を表す記号である。
```x
PX
```
[==]
```y
PY
```
上記は「言語Xのプログラム「PX」は言語Yのプログラム「PY」と(ほとんど)同じ意味である」と読む。
```x
PX
```
[=>]
```y
PY
```
上記は「言語Xのプログラム「PX」から言語Yのプログラム「PY」が導出される」と読む。
[=>]は、プログラムの導出を表す記号である。
次のような記号を考えよう。
```x
PX
```
[===]
```y
PY
```
上記は「言語Xのプログラム「PX」は言語Yのプログラム「PY」と同値である」と読む。
[===]は、プログラムの同値関係を表す記号である。
```x
PX
```
[==]
```y
PY
```
上記は「言語Xのプログラム「PX」は言語Yのプログラム「PY」と(ほとんど)同じ意味である」と読む。
```x
PX
```
[=>]
```y
PY
```
上記は「言語Xのプログラム「PX」から言語Yのプログラム「PY」が導出される」と読む。
[=>]は、プログラムの導出を表す記号である。
2021/06/24(木) 21:03:40.76ID:GPZ7ub3d
実際にコードが記述されているプログラムを実引数として変換を行う方法を考えよう。
MarkDown形式の三連バッククォートで囲って実際に記載されているコードを「実コード」と呼び、
実コードに対する代名詞を「仮コード」と呼ぶことにする。
実コードを抽象化すると仮コードの名前になる。
例えば、>>45の
```x
PX
```
をPX0という代名詞で表し、
```y
PY
```
をPY0という代名詞で表すとき、「PX0[===]PY0」、「PX0[==]PY0」、「PX0[=>]PY0」などと記述できる。
MarkDown形式の三連バッククォートで囲って実際に記載されているコードを「実コード」と呼び、
実コードに対する代名詞を「仮コード」と呼ぶことにする。
実コードを抽象化すると仮コードの名前になる。
例えば、>>45の
```x
PX
```
をPX0という代名詞で表し、
```y
PY
```
をPY0という代名詞で表すとき、「PX0[===]PY0」、「PX0[==]PY0」、「PX0[=>]PY0」などと記述できる。
2021/06/24(木) 21:15:17.55ID:GPZ7ub3d
Pを変数とするメタ関数Fを「[F][(]P[)]」と表すことにする。
また、Fを仮コードpに施したものを「[F][(]p[)]」と表すことにする。
MarkDownの三連バッククォート記法に従うなら、「[F][(]p[)]」の仮コード「p」を
実コードに置き換えてもいい。
メタ関数の引数が2つや3つの場合も「[F][(]a[,]b[,]c[)]」などと記述する。
メタ関数名やメタ記号を角かっこ [ ] で囲っているのは、実際のプログラムで
使用している記号との混同を避けるためである。
また、Fを仮コードpに施したものを「[F][(]p[)]」と表すことにする。
MarkDownの三連バッククォート記法に従うなら、「[F][(]p[)]」の仮コード「p」を
実コードに置き換えてもいい。
メタ関数の引数が2つや3つの場合も「[F][(]a[,]b[,]c[)]」などと記述する。
メタ関数名やメタ記号を角かっこ [ ] で囲っているのは、実際のプログラムで
使用している記号との混同を避けるためである。
2021/06/24(木) 22:06:26.29ID:KFTtHP2O
だとすれば、形式言語で書くと
```asm
push eax
pop ebx
```
[==]
```asm
mov ebx, eax
```
とか、
```asm
xor eax, eax
```
[==]
```asm
mov eax, 0
```
とか書けますね(だからどうした
```asm
push eax
pop ebx
```
[==]
```asm
mov ebx, eax
```
とか、
```asm
xor eax, eax
```
[==]
```asm
mov eax, 0
```
とか書けますね(だからどうした
2021/06/24(木) 22:14:16.13ID:KFTtHP2O
形式言語はバッククォート表記のせいで無駄に行数を喰いますね。
「push eax; pop ebx」[==]「mov ebx, eax」
これじゃいけないんすか?
「push eax; pop ebx」[==]「mov ebx, eax」
これじゃいけないんすか?
2021/06/24(木) 22:36:01.24ID:GPZ7ub3d
>>49
ちゃんと言語名を明記すべき。行区切りは全角の「/」にしよう。
asm「push eax/pop ebx」[==] asm「mov ebx, eax」
これならバッククォート表記と整合性が図れる。
でも全角文字は英語圏では使いづらいので日本語圏に限定するしかない。
ちゃんと言語名を明記すべき。行区切りは全角の「/」にしよう。
asm「push eax/pop ebx」[==] asm「mov ebx, eax」
これならバッククォート表記と整合性が図れる。
でも全角文字は英語圏では使いづらいので日本語圏に限定するしかない。
2021/06/24(木) 22:51:38.01ID:GPZ7ub3d
要するに、アセンブリとC/C++言語の中間言語「cr2言語(仮)」を考えているんだろ。
アセンブリは広大な言語空間だから、素人の人間が手作業でちまちまやっていたら
何カ月経っても制覇できない。
インターネットで公開データが気軽にダウンロードできる時代だから、
データ指向でCPUの全命令を一気に網羅することを考えないといけない。
生データがなければウェブからスクレイピングするとか。。。
x86/x64 CPU の仕様は
「Intel 64 and IA-32 Architectures Software Developer’s Manual」に
全部書かれていて、PDFファイルとしてダウンロードできる(一次情報)。
アセンブリは広大な言語空間だから、素人の人間が手作業でちまちまやっていたら
何カ月経っても制覇できない。
インターネットで公開データが気軽にダウンロードできる時代だから、
データ指向でCPUの全命令を一気に網羅することを考えないといけない。
生データがなければウェブからスクレイピングするとか。。。
x86/x64 CPU の仕様は
「Intel 64 and IA-32 Architectures Software Developer’s Manual」に
全部書かれていて、PDFファイルとしてダウンロードできる(一次情報)。
2021/06/24(木) 23:03:34.25ID:GPZ7ub3d
ほらよ:
https://github.com/netwide-assembler/nasm/blob/master/x86/insns.dat
全部で6256行あるぜ。これを手作業で変換処理を書くつもりか???
正気かよ
https://github.com/netwide-assembler/nasm/blob/master/x86/insns.dat
全部で6256行あるぜ。これを手作業で変換処理を書くつもりか???
正気かよ
2021/06/24(木) 23:16:42.66ID:KFTtHP2O
2021/06/25(金) 00:46:15.53ID:xLwe8284
解読していくと。。。
使い方を知りたいならinsns.plを読みなさいと。
拡張子.plはPerlだよな。
うわ、こんな所でPerlが出てくるのか。
使い方を知りたいならinsns.plを読みなさいと。
拡張子.plはPerlだよな。
うわ、こんな所でPerlが出てくるのか。
2021/06/25(金) 01:46:22.63ID:xLwe8284
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【外交】元台湾総統・馬英九氏、高市首相発言に「台湾を危険にさらす」台湾海峡の問題は「両岸の中国人が自ら話し合うべき」★2 [1ゲットロボ★]
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 ★8 [ぐれ★]
- 「母の部屋に安倍氏が表紙の機関誌が」「(安倍氏が被害者なのは)不思議に思いませんでした」山上被告の妹が証言 [おっさん友の会★]
- 【news23】小川彩佳アナ「ここまでの広がりになるということを、高市総理はどれだけ想像できていたんでしょうね」 日中問題特集で [冬月記者★]
- 【次の一手】台湾問題で小林よしのり氏が私見「まさに戦争前夜」「ただちに徴兵制を敷いて、高市支持者を最前線へ」… ★5 [BFU★]
- 【野球】大谷翔平、佐々木朗希、山本由伸らがWBC辞退なら広がる不協和音… 『過去イチ盛り上がらない大会』になる可能性も★2 [冬月記者★]
- 【高市売り】円安、止まらず!凄い勢いで暴落中。157円へ [219241683]
- 1,000万円のBMWに擦ってしまった札幌のガキ、捕らえられてガチで詰む [329329848]
- 俺の代わりに中国がバカウヨを倒してくれる [805596214]
- 【悲報】ヤフコメ民「中国が水産物を輸入禁止にするなら、日本国民向けに安く販売すればいい。中国依存から脱するべき」 [153736977]
- 高市が首相になってから進次郎の評価が爆上がりしてる件について
- (´ん`)「公明党、お前だったのか。自民党から国民を守ってくれていたのは...」 [603416639]
