Delphi + 汇编(100分)

  • 主题发起人 主题发起人 m911
  • 开始时间 开始时间
M

m911

Unregistered / Unconfirmed
GUEST, unregistred user!
004DAFA0 /$ 83EC 14 sub esp, 14
004DAFA3 ¦. 8B4424 18 mov eax, dword ptr [esp+18]
004DAFA7 ¦. 8D5424 01 lea edx, dword ptr [esp+1]
004DAFAB ¦. C64424 00 98 mov byte ptr [esp], 98
004DAFB0 ¦. 2BD0 sub edx, eax
004DAFB2 ¦> 8A08 /mov cl, byte ptr [eax]
004DAFB4 ¦. 880C02 ¦mov byte ptr [edx+eax], cl
004DAFB7 ¦. 40 ¦inc eax
004DAFB8 ¦. 84C9 ¦test cl, cl
004DAFBA ¦.^ 75 F6 /jnz short 004DAFB2
004DAFBC ¦. A1 D00A5B00 mov eax, dword ptr [5B0AD0]
004DAFC1 ¦. 85C0 test eax, eax
004DAFC3 ¦. 74 18 je short 004DAFDD
004DAFC5 ¦. 8D5424 18 lea edx, dword ptr [esp+18]
004DAFC9 ¦. C74424 18 110>mov dword ptr [esp+18], 11
004DAFD1 ¦. 8B08 mov ecx, dword ptr [eax]
004DAFD3 ¦. 52 push edx
004DAFD4 ¦. 8D5424 04 lea edx, dword ptr [esp+4]
004DAFD8 ¦. 52 push edx
004DAFD9 ¦. 50 push eax
004DAFDA ¦. FF51 20 call dword ptr [ecx+20]
004DAFDD ¦> 83C4 14 add esp, 14
004DAFE0 /. C2 0400 retn 4


以上这个call 是我用OD 调试出来的,我已经HOOK到了004DAFA0 位置,当我做完我要做的工作后,如何能够用汇编跳转回call的004DAFA0 原位置 让程序继续正常运行?(我怎么写程序都会崩溃).

HOOK注入部分是这样写的

procedure InjectJmpCode(ADDRS,ADDRD:DWORD);
var
tOldPoint:Cardinal;
begin
VirtualProtect(Pointer(ADDRS), $7, PAGE_READWRITE, tOldPoint); //是不是这里出问题了????

PByte(ADDRS)^:=$E9;
PDWORD(ADDRS+$1)^:=ADDRD-ADDRS-$5; //是不是这里出问题了????
pword(ADDRS+5)^:=$9090; //是不是这里出问题了????
end;

procedure JmpStorage;
begin
asm
......//我需要做的工作

...........//这里该如何写?????

CONST_GET_CKPASS_JMP //跳转
end;
end;

const CONST_JMP=$004DB440;
const CONST_GET_CKPASS_JMP:Integer=$XXXXXX?????;

procedure TFrm_Pop.Button1Click(Sender: TObject);
begin
InjectJmpCode(CONST_JMP, DWORD(@JmpStorage));
end;
 
干完坏事要记得清理现场,不然就,呵呵

你把原来的入口处的5个字节替换了,执行完你的过程后还要恢复原样才能跳回去
 
具体应该怎么来写呢???
 
先保存到别的地方(你自己代码段里的一个5字节变量就行了),然后保存回来
 
你代码通用性不强
 
ypy大侠有何高见呢? 可否留下QQ交流一下?
如果你的代码通用性很强,我可以付一些钱给你的
当然其他朋友有好的 通用性很强的代码也可以联系我
非洲人不要加我哦~~ 呵呵
我的 Q Q 4 9 1 3 8 8 2 4 4
 
程序崩溃是你没有保护好现场。
要想执行原位置代码简单的就是恢复代码,改来改去有点烦。
好一点的用一个反汇编引擎,然后再JUM,因为有些汇编指令不是5字节的
 
一个轻量级的反汇编引擎就够了,目的是得到操作指令的长度
 
后退
顶部