看了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 编辑 ]