我用VB Decompiler反编译了一个程序,它说我的目标函数(我想看代码的那个)位于地址0x00617B70。所以,一旦我拆开了应用程序,我就转到那个内存地址,我看到了:
CALL 0861BBA1
ADD BYTE PTR [EAX], DH
IN AL, 0
XOR AL, 0
ADD BYTE PTR [EAX], AL
ADD BYTE PTR [EAX], AL
ADD BYTE PTR [EAX], AL
SBB BYTE PTR [EAX], AL
ADD BYTE PTR [EAX], AL
ADD BYTE PTR [EAX], AL
SBB AL, 0
ADD BYTE PTR [EAX], AL
ADD BYTE PTR [EAX], AL
ADD AL, 0
ADD BYTE PTR [EAX], AL
ADD BYTE PTR [EAX], AL
OR AL, FF
ADD EAX, DWORD PTR [EAX]
JE 00617B99
ADD DWORD PTR [EAX], EAX
INSB
INC DWORD PTR [EBX]
ADD BYTE PTR [EAX-1], DH
ADD EAX, DWORD PTR [EAX]
AND BYTE PTR [EAX], AL
ADD BYTE PTR [EAX], AL
ADD BYTE PTR [EAX], AL
ADD EAX, 0
ADD BYTE PTR [EAX-1], AL
ADD DWORD PTR [EAX], EAX
INC ESP
INC DWORD PTR [EBX]
ADD BYTE PTR [EAX-1], BL
ADD AL, BYTE PTR [EAX]
XOR BH, BH
ADD AL, BYTE PTR [EAX]
ADC BH, BH
ADD AL, BYTE PTR [EAX]
INSB
OR AL, 0
OR BYTE PTR [EAX], CL
ADD BYTE PTR [ESI], AL
INC EAX
ADD BYTE PTR [EAX+71], AL
PUSHAD
--
SHL BYTE PTR [EAX-1], 1
PUSH ES
ADD AH, BH
ADC AL, 8
OR BYTE PTR [EAX], AL
MOV DWORD PTR [EAX+6E70AD00], EAX
--
SHL BYTE PTR [EAX-1], 1
POP ES
ADD AH, BH
ADC AL, 8
OR BYTE PTR [EAX], AL
MOV DWORD PTR [EDX+6C70AD00], EAX
JMP FAR FWORD PTR [EBX+6E]
这看起来不像是一个功能,对吗?我对ASM一无所知,但我期待这样的事情:
PUSH EBP
MOV EBP, ESP
SUB ESP, 8
...more stuff here...
RETN
特别是RETN
指令说它是一个函数,对吗?
任何想法我做错了什么?
答案 0 :(得分:0)
在我看来,您的主要错误是认为这应该是x86 CPU代码。相反,VB反编译器获得并显示的代码是一种中间机器字节码,它不是由CPU本身执行,而是由中间解释器执行。 (对不起,如果你已经知道了,但你的问题很不清楚。)这是JVM,.NET运行时等的主要方法。在你的列表中搜索一些单词(FStStrCopy,CBoolVarNull)给出提示这是VB特定的P -码。它显然不会暴露像“mov ebp,esp”或“retn”这样的指令;即使代码以这种方式解码,也会很明显,而不是故意的结果。即使你知道某个东西的入口点,这个入口点也不是由CPU处理,而是由P代码解释器处理。
因此,要解决这个问题,您应该确定在分析的二进制文件中使用p-code的位置以及本机代码应该在哪里(如果应该)。如果您认为它应该是本机代码,那么分析方法和/或编译选项就会出错。