注册 登录
编程论坛 汇编论坛

罗云彬win32第chapter17\在PE文件上附加可执行代码的例子看不懂的几句代码

发布于 2010-04-27 09:34, 1126 次点击
各位大侠:
我是菜鸟,拜读《琢石成玉》第chapter17\在PE文件上附加可执行代码的例子\_ProcessPeFile.asm\(part 2)中代码有不理解的地方,盼指点:
Mov esi,_lpPeHead
Assume esi:IMAGE_NT_HEADERS,edi:IMAGE_NT_HEADERS
Invoke GlobalAlloc,GPTR,[esi].OptionalHeader.SizeOfHeaders
Mov edi,eax
Invoke RtMoyeMemory,edi,_lpFile,[esi]. OptionalHeader.SizeOfHeaders
Mov @lpMomery,eax
Mov edi,eax
Add edi,esi
Sub edi,_lpFile
倒数四行似乎实现以下公式edi=eax(@lpmemory)+esi-_lpfile
其中eax(@lpmemory)应该指向新PE文件头在内存中的地址,那么edi指向何处?这个公式又是什么含义?求大侠点拨。
4 回复
#2
ONEPROBLEM2010-04-28 00:01
看了LZ的问题,偶都不敢回答啊,一来偶不是大侠,二来对于PE我可不懂啊.但我喜欢学习,就和LZ交流一下吧.
1.LZ的代码好像与书上略有出入,应该是这样?
mov    esi,_lpPeHead
assume    esi:ptr IMAGE_NT_HEADERS,edi:ptr IMAGE_NT_HEADERS
invoke    GlobalAlloc,GPTR,[esi].OptionalHeader.SizeOfHeaders
mov    @lpMemory,eax
mov    edi,eax
invoke    RtlMoveMemory,edi,_lpFile,[esi].OptionalHeader.SizeOfHeaders
add    edi,esi
sub    edi,_lpFile

2.edi=eax(@lpmemory)+esi-_lpfile这公式我觉得正确,是这么理解的.
这里的eax(@lpmemory)是指向新PE文件头在内存中的地址,而esi则指向原PE文件的NT头(或称PE头),_lpfile则是原PE文件在其内存中的首址.
现在,新的PE文件是从原PE文件复制过来的(用RtlMoveMemory),再经过一加一减,实质上是,eax(@lpmemory)+(esi-_lpfile)得到了新的edi,此括号中原NT头减去原文件首址,得到的是DOS部分的长度!而edi本来是新文件的首址,现在加上了DOS部分,新的edi正好指向了新的文件的NT头!

我是这么理解的,也许不正确啊.


[ 本帖最后由 ONEPROBLEM 于 2010-4-28 00:44 编辑 ]
#3
ONEPROBLEM2010-04-28 00:10
上面的红色括号中,改成这样更好理解:
edi=eax(@lpmemory)+(esi-_lpfile)
这样,最后edi是指向是新文件的NT头了.
#4
2010-04-28 09:10
谢谢回答,又有困惑
谢谢回答,又有困惑:
Invoke GlobalAlloc,GPTR,[esi].OptionalHeader.SizeOfHeaders
这一句应该是在分配SizeOfHeaders大小的内存,它包括节表在内吗?如果不包括,以下(part3)对节表的操作如何完成?
#5
2010-04-28 09:18
明白了,包括节表
1