这里说的重定位不是dll里的重定位表,那个不好玩,让windows自己修正去.我说的是远程线程的代码需要重定位,定位什么呢?说白了就是全局变量,什么函数地址拉(所谓的api重定位,是吗?也许是我呆会要说的不重定位),函数名字的字符串啊,只是前者没初始化而已,不管它,全部都要修正地址,简单点讲就是多了个偏移量,每个访问这些变量的代码都要加上个偏移量,这个偏移量的获得就厉害啦,call当前位置,这样这个位置就进堆栈喽~在pop出来,sub之前call的位置,偏移量就完成了,然后所有什么mov啊 call啊的全部得写成[ebx+offset **](偏移量在ebx),**除了变量名还能是啥?这里加不加offset都是一样,结果还是被offset了的,我已经试过了,机器码都一样.为了键盘不磨损我以后再不打offset.
说不重定位之前,阿,本来就是直接定位,重个屁呀.是这样的,你也知道那些api要重新找地址,靠三个函数,GetModuleHandle,LoadLibrary,GetProcAddress,居家旅行必备良函数.这三个函数不也是api嘛,怎么定位呢?方法一,不定.前提是kernel32.dll未被重定位,方法二,这个方法厉害的不得了!竟然需要利用CreateProcess的过程,它在运行的开头竟然push了个地址,然后才jmp到子进程(有点像子程序,虽然进程无法互访,能讲出这种话还不是因为windows权限最大,管他什么进程想访就访).然后子进程ret的话,就运行到push的地址中,哇竟然是ExitThread.不管这个先,我们能用的就是这个ret回来的地址,就是这个地址打通了我们找api的狗洞.你知道地址在kernel32.dll模块中,所以好戏开始上演.
说详细点吧,不然你听了没意思.适时用[esp]就得到地址了,从这个地址往回找页对齐的地址,找那个'MZ',懂吧,dos头,就是文件头嘛,算了说快点了,反正你可以查MSDN,我是说相应的结构体,MSDN才不会教你耍这种把戏,
[esi]->dos头->可选头(这只是个名字,你知道的)->数据目录->导出表->扫描名表,保存索引,在地址表取你要的.
真的,罗文彬你呀就是一大帅哥,都不知道你从哪研究出来的,真的是非常精彩,人类社会没见几个有这么精彩的办法了.
对了,关于导入导出表我画了两张图,对着内存里的数据画的,把那些七七八八名表地址表指来指去的位置和普遍取值都列出来了,有机会上传一下,我这辈子都没画过这么有价值的图,在我眼里他们已经是藏宝图了