能力值:
( 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;
|
能力值:
( LV7,RANK:100 )
|
-
-
3 楼
谢谢你的回复,问题已经解决了,声明一下基址就可以了,函数地址不会再变了
|
|
|