滴水逆向联盟

标题: 在逆DbgkCreateThread过程中碰到的一处PE问题 [打印本页]

作者: xiaomingerniu    时间: 2024-6-24 23:41
标题: 在逆DbgkCreateThread过程中碰到的一处PE问题
本帖最后由 xiaomingerniu 于 2024-6-24 23:43 编辑

如题
在逆到其中Call _RtlImageNtHeader@4后,判断出:
若RtlImageNtHeader函数调用成功,eax为第1个_IMAGE_SECTION_HEADER在内存中的线性地址
ntdll!_IMAGE_SECTION_HEADER
   +0x000 Name             : [8] UChar
   +0x008 Misc             : __unnamed
   +0x00c VirtualAddress   : Uint4B
   +0x010 SizeOfRawData    : Uint4B
   +0x014 PointerToRawData : Uint4B
   +0x018 PointerToRelocations : Uint4B
   +0x01c PointerToLinenumbers : Uint4B
   +0x020 NumberOfRelocations : Uint2B
   +0x022 NumberOfLinenumbers : Uint2B
   +0x024 Characteristics  : Uint4B

可见_IMAGE_SECTION_HEADER大小为0x28字节,
那么后续mov ecx, [eax+34h]中,我认为ecx就应该是第2个节表头中偏移0xC位置的值,即VirtualAddress,也就是第2个节表相对于ImageBase的RVA
自认为到这都没问题

问题出在后面的一行指令:
add     ecx, [eax+28h]
硬编码:03 48 28
那就是:add ecx,dword ptr ds:[eax+0x28]
eax+28h应该是第2个节表头的首地址吧?那也就是Name这个8字节数组的首地址?
dword ptr ds:[eax+0x28],取第2个节表头Name区域前4字节的值?
再加上第2节的RVA赋给ecx?

想来想去感觉不对,能否请老师解答一下?万分感谢!!!!!!



作者: xiaomingerniu    时间: 2024-6-27 19:37
原来是我弄错了,在RtlImageNtHeader内部的确判断了_IMAGE_SECTION_HEADER地址是否有效,但返回值仍然是_IMAGE_NT_HEADERS的首地址。。。。
ntdll!_IMAGE_NT_HEADERS
   +0x000 Signature        : Uint4B
   +0x004 FileHeader       : _IMAGE_FILE_HEADER
   +0x018 OptionalHeader   : _IMAGE_OPTIONAL_HEADER
   +0x000 Magic            : Uint2B
   +0x002 MajorLinkerVersion : UChar
   +0x003 MinorLinkerVersion : UChar
   +0x004 SizeOfCode       : Uint4B
   +0x008 SizeOfInitializedData : Uint4B
   +0x00c SizeOfUninitializedData : Uint4B
   +0x010 AddressOfEntryPoint : Uint4B
   +0x014 BaseOfCode       : Uint4B
   +0x018 BaseOfData       : Uint4B
   +0x01c ImageBase        : Uint4B

......

所以:
mov ecx, [eax+34h],ecx就是ImageBase
add     ecx, [eax+28h]中,ecx就是ImageBase + AddressOfEntryPoint,就是OEP的地址
惭愧惭愧




欢迎光临 滴水逆向联盟 (http://dtdebug.com/) Powered by Discuz! X3.2