关于hook一段汇编代码的问题

Nancylee121 2010-02-08 09:27:50
目标进程有这样两句汇编。
mov edx,[ebp+20]
mov eax,[ebp+20]
都是为三字节
我现在想hook eax的值。

所以我就想改成

jmp 我的函数地址($9f00000)


9f00000 mov edx,[ebp+20]
mov eax,[ebp+20]
mov [我的地址],eax


我的代码如下。

Function myfun;
asm
mov edx,[ebp+$20]
mov eax,[ebp+$20]
mov [我分配的地址],eax
jmp 前面汇编的第三行
end;



type Twrite=packed record
jmp_code:byte;
jmpaddr:integer;
retcode:byte;
end;
begin
Twrt.jmp_code:= $eb;
Twrt.jmpaddr:=integer(@isSelfAddr);
Twrt.retcode:=$90;


edit1.Text:=inttohex(integer(@isSelfAddr),4); //用来查看我的函数的地址




WriteProcessMemory( GetCurrentProcess , pointer($00578c12), @Twrt.jmp_code,1,ret);
WriteProcessMemory( GetCurrentProcess , pointer($00578c12+1), @Twrt.jmpaddr,4,ret);
WriteProcessMemory( GetCurrentProcess , pointer($00578c12+1), @Twrt.nopcode,1,ret);


但结果。edit里面读出来的地址是正确的。我用OD跟进去能看到我的代码。但是我改写的JMP 地址变成4开头的了。这是为什么呢。。。希望有人能帮我解答下。谢谢啦。我试了一天了。也没能搞定。


...全文
209 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuang_bx 2010-02-10
  • 打赏
  • 举报
回复
//远程注入试试

const dwSize=1024;//
var gPRemoteThread: Pointer; //远程线程地址
NumberOfBytesWritten,PHandle: Cardinal;

PHandle:=目标进程句柄

procedure RunAsmThreadCY(); stdcall;
begin
asm

end;
end;

gPRemoteThread := VirtualAllocEx(PHandle, nil, dwSize, MEM_COMMIT + MEM_RESERVE, PAGE_EXECUTE_READWRITE);

WriteProcessMemory(PHandle, gPRemoteThread, @RunAsmThreadCY, dwSize, NumberOfBytesWritten) ;
CreateRemoteThread(PHandle , nil, 0, gPRemoteThread, nil, CREATE_SUSPENDED, NumberOfBytesWritten);
cnzdgs 2010-02-09
  • 打赏
  • 举报
回复
还有,WriteProcessMemory应该用目标进程句柄,如果写本进程的内存,用WriteProcessMemory就没意义了,直接写即可。
cnzdgs 2010-02-09
  • 打赏
  • 举报
回复
表达再清楚一点。

我记得机器码EB是短跳转,只能跳转到该指令的前后256字节范围,段内跳转应该用E9,注意跳转地址是相对地址。
cnzdgs 2010-02-09
  • 打赏
  • 举报
回复
这样试试:
pbyte($45000)^:=$e9;
pint($45000+1)^=integer(@myfun)-$45005;
如果还有问题,再具体描述一下是什么情况。
dd_zhouqian 2010-02-09
  • 打赏
  • 举报
回复
up,楼主精神可嘉啊
Nancylee121 2010-02-09
  • 打赏
  • 举报
回复
如果有个简单的例子。我就好理解点了。
Nancylee121 2010-02-09
  • 打赏
  • 举报
回复
能不能写一个例子给我看一下。谢谢了。我从昨天搞到现在。
cnzdgs 2010-02-09
  • 打赏
  • 举报
回复
跳转地址是相对地址,用你的函数地址减去45005(因为跳转指令长度是5字节)。
Nancylee121 2010-02-09
  • 打赏
  • 举报
回复
我知道。比如

450000 mov eax,[ebp+1024]
mov ecx,eax

这样一个过程。

我想用程序实现HOOK

让他
在汇编代码中变成这样
450000 jmp myfun


在myfun里面。取到eax 的值。
在汇编里面的代码可能是这样
cmp eax,myint
如果不是我的值。就跳回去执行。如果和我的值一样。就被我读出来。并组eax赋值。


现在我碰到的问题如下。。
我直接用指针
pbyte(45000)^:=$e9;
pint($45000+1)^=integer(@myfun);

执行后我用内存查看器看。那个地址变成了jmp xxxx但不是我的函数地址。
dd_zhouqian 2010-02-08
  • 打赏
  • 举报
回复
好复杂啊,友情up一下

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧