【问题标题】:Function memory address (ASM)函数内存地址 (ASM)
【发布时间】:2014-01-03 07:18:31
【问题描述】:

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

任何想法我做错了什么?

【问题讨论】:

  • 可以显示可执行文件的反汇编的相关部分吗? 内存区域的反汇编几乎可以肯定是数据,因此不打算执行。还有反编译的代码。
  • add [eax], al 为 0。你在反汇编一个错误的东西。
  • 抱歉,我还不懂 ASM。拆解的相关部分有哪些?当我在第一条 ASM 行中单击鼠标右键 > 选择函数时,该代码是 MHS6.1 自动选择的代码。
  • 你说你用VB反编译器反编译过。你确定你的可执行文件是用 VB 语言编写的吗?
  • 是的,100% 确定。可能是vbdecompiler显示函数地址错误?

标签: assembly vb6 x86 disassembly


【解决方案1】:

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

因此,为了解决这个问题,您应该确定在分析的二进制文件中使用 p 代码的确切位置以及本机代码应该在哪里(如果应该)。如果您认为它应该是本机代码,则说明您的分析方法和/或编译选项有问题。

【讨论】:

  • 您好,感谢您的回答。我不希望 VBDecompiler 向我显示“mov ebp,esp”或“retn”之类的指令。我希望反汇编向我展示了这一点。第一个代码是反汇编代码,最后一个是给我 VBDecompiler 的 P 代码。正如我在其他评论中所说,在反编译其他程序时,我只需复制 VBDecompiler 中显示的地址,然后转到该地址的反汇编程序;它向我展示了我对mov ebp, esp 的期望以及最后的retn 指令。我不明白为什么在某些程序中它显示了我的期望而在其他程序中却没有
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多