如何从编译的代码中更改x86操作码

时间:2015-08-19 08:45:01

标签: delphi x86 reverse-engineering

以下是我正在撤消的应用程序代码块 请原谅我,我对倒车世界不熟悉,但我发现这里发生了一些事情,我认为我必须将je更改为jmp,但我不确定它是否正确。

_unit34::TApplication.Run

     Push ebp  
     ebp,esp  
     ecx  
     Push ebx  
     Push esi  
     Push edi  
     Mov  dword ptr [ebp-4],eax  
     Mov. Eax,dword ptr [ebp-4]  
     Mov  byte ptr [eax+0AD],1  
     XOR  edx,edx  
     Push  ebp  
     Push. 4E2B09  
     Push  dword ptr fs:[edx]  
     Mov   dword ptr fs:[edx],esp  
     Mov   Eax,4D6574; DoneApplication  
     Call    AddExitProc
     Mov  eax, dword ptr [ebp-4]
     Mov  eax, dword ptr [ebp+44]
     Test  eax,eax
     Je    004E2AF1

有人能解释一下那里发生了什么吗? 如何使用Interactive Delphi重构器将je更改为jmp

1 个答案:

答案 0 :(得分:0)

  

有人能解释一下那里发生了什么吗?

 Push ebp  
 mov ebp,esp  

设置堆栈帧。

 ??? ecx  
 Push ebx  
 Push esi  
 Push edi

保存非易失性寄存器

 Mov  dword ptr [ebp-4],eax

保存自我指针

 Mov. Eax,dword ptr [ebp-4]  

不幸的堆栈垃圾: - (

 Mov  byte ptr [eax+0AD],1

Self.SomeBoolean:= true

 XOR  edx,edx  
 Push  ebp  
 Push. 4E2B09  
 Push  dword ptr fs:[edx]  
 Mov   dword ptr fs:[edx],esp

try

 Mov   Eax,4D6574; DoneApplication  
 Call    AddExitProc
 Mov  eax, dword ptr [ebp-4]

设置应用程序的退出过程

 Mov  eax, dword ptr [ebp+44]

SomeObject:= somevar

 Test  eax,eax
 Je    004E2AF1

If (Assigned(SomeObject)) then .....

  

如何使用Interactive Delphi重构器将je改为jmp?

这个特定的改变在这里没有意义,因为它会调用异常。当对象为零时调用je。这是错误情况。您将更改程序以始终崩溃并显示错误。

但是,如果你绝对必须这样做,只需将操作码从$ 74更改为$ EB(对于字节偏移量跳转)或从$ 0F84更改为$ 90E9(对于长跳跃)。
我使用十六进制编辑器。

除非您确切知道自己在做什么,否则这些变化都不会有令人满意的结果。

从哪里开始
获得Delphi编码方面的专业知识并查看大量CPU输出 按 Ctrl + Alt + C 查看Delphi生成的代码。
然而,掌握这将需要几个月到几年的时间。

关于倒车
如果你想进行倒车IDA pro是一个更好的工具 它有一个免费版本,你可以开始。