功能存储器地址(ASM)

时间:2013-12-16 00:42:10

标签: assembly vb6 x86 disassembly

我用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指令说它是一个函数,对吗?

任何想法我做错了什么?

1 个答案:

答案 0 :(得分:0)

在我看来,您的主要错误是认为这应该是x86 CPU代码。相反,VB反编译器获得并显示的代码是一种中间机器字节码,它不是由CPU本身执行,而是由中间解释器执行。 (对不起,如果你已经知道了,但你的问题很不清楚。)这是JVM,.NET运行时等的主要方法。在你的列表中搜索一些单词(FStStrCopy,CBool​​VarNull)给出提示这是VB特定的P -码。它显然不会暴露像“mov ebp,esp”或“retn”这样的指令;即使代码以这种方式解码,也会很明显,而不是故意的结果。即使你知道某个东西的入口点,这个入口点也不是由CPU处理,而是由P代码解释器处理。

因此,要解决这个问题,您应该确定在分析的二进制文件中使用p-code的位置以及本机代码应该在哪里(如果应该)。如果您认为它应该是本机代码,那么分析方法和/或编译选项就会出错。