|
本帖最后由 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?
想来想去感觉不对,能否请老师解答一下?万分感谢!!!!!!
|
|