Assembly 功能存储器地址(ASM)

Assembly 功能存储器地址(ASM),assembly,vb6,x86,disassembly,Assembly,Vb6,X86,Disassembly,我用VB反编译器反编译了一个程序,它说我的目标函数(我想看到代码的那个)位于地址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

我用VB反编译器反编译了一个程序,它说我的目标函数(我想看到代码的那个)位于地址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
指令说它是关于函数的,对吗


知道我做错了什么吗?

在我看来,您的主要错误是认为这应该是x86 CPU代码。相反,VB反编译器得到并显示的代码是一种中间机器字节码,它不是由CPU本身执行的,而是由中间解释器执行的。(如果您已经知道了,很抱歉,但是您的问题还不清楚。)这是JVM、.NET运行时等的主要方法。通过谷歌搜索列表中的一些单词(FStStrCopy、CBoolVarNull)会给出提示,这是特定于VB的P代码。而且它显然不会公开像“mov ebp,esp”或“retn”这样的指令;即使一个代码是这样解码的,这也将是显而易见的,而不是故意的结果。即使您知道某个东西有一个入口点,这个入口点也不是由CPU处理的,而是由P代码解释器处理的


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

您可以显示可执行文件反汇编的相关部分吗?内存区域的反汇编几乎肯定是数据,因此不打算执行。反编译的代码也是。
add[eax],al
为0。你拆错东西了。对不起,我还不明白。拆卸的相关部分有哪些?当我在第一个ASM行>选择函数中右键单击时,该代码是MHS6.1自动选择的代码。您说您已使用VB decompiler进行反编译。您确定您的可执行文件是用VB语言编写的吗?是的,100%确定。vbdecompiler可能为函数显示了错误的地址?您好,谢谢您的回答。我不希望VBDecompiler向我显示“mov ebp、esp”或“retn”之类的指令。我希望拆解能让我明白这一点。第一个代码是反汇编代码,最后一个是P代码,它为我提供了VBDecompiler。正如我在其他评论中所说,在反编译其他程序时,我只需复制VBDecompiler中显示的地址,然后转到反汇编程序获取该地址;在那里,它向我展示了我所期望的
mov-ebp、esp
以及最后的
retn
指令。我不明白为什么在一些节目中它向我展示了我的期望,而在其他节目中却没有