首页
社区
课程
招聘
[求助]Delphi中线程插入的几个问题
发表于: 2008-4-27 16:08 4631

[求助]Delphi中线程插入的几个问题

2008-4-27 16:08
4631
我的任务:在目标进程内申请内存,写入我的函数,修改目标进程的一个call来调用我写入的函数

但是碰到了几个问题,很烦恼

1.怎么指定VirtualAllocEx申请的地址?怎样查看什么地址有效?我一指定地址就返回0

2.写入的函数是不是只能用汇编代码?如asm....end这样的形式

3.如果只能用汇编代码的话,怎么在delphi中的汇编里声明一个字符串变量呢?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
2
如果那个地址已经被原进程的内容占据了,你就申请不到准确的地址。但是不指定地址的话,拷贝过去的远程代码又存在重定位的问题(一般需内嵌汇编)。
有一个取巧的方法,就是改一下基址,如在源文件中指定:
{$IMAGEBASE $13150000}//换基址
这样编译后的基址就是13150000,而不是通常的00400000。而在一般的以00400000为基址的程序中,进程空间13150000处通常不会有内容占据。这样你申请到准确地址成功的机会就大多了。很多通过注入IE进程进行工作的木马下载器,都采用这样的方法。这样避免了使用内嵌汇编和重定位的麻烦,你可以把自己的程序内存映像整个拷贝到目标进程空间。

如果不这么做,也就是不申请确定的内存空间的话,那么就面临重定位问题,比如对API的调用。
这样的实现方法也有多种,需要内嵌汇编,在注入的代码内进行处理,如:
1. 完全利用汇编的特点自己重定位,而且自己通过PEB等方式搜索API地址。这跟shellcode没有什么区别了。
2. 由于kernel32.dll、ntdll.dll等系统dll,在系统所有进程中默认加载到同一基址,所以可以将自身进程中获得的API函数地址保存在远程代码中,远程代码再从中取得;或者作为CreateRemoteThread中的远程线程输入参数传递(不过对于楼主用修改call来进入的方法,就不能作为参数传递了)。

Delphi中内嵌汇编,字符串的定义和汇编没有什么区别,当然也涉及重定位的问题。
比如:
asm
……
call @n1
db 'GetProcAddress',0
@n1:
pop eax; 这样就得到了'GetProcAddress'这个字符串的地址
……
end;
2008-4-27 20:22
0
雪    币: 319
活跃值: (1051)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
谢谢你的回复,问题已经解决了,声明一下基址就可以了,函数地址不会再变了
2008-4-28 16:04
0
游客
登录 | 注册 方可回帖
返回
//