CFF资源管理器(基本上可以帮助您查看PE头):https://ntcore.com/?page_id=388
截屏:
https://imgur.com/affLCHY
https://imgur.com/1wTQAlX
https://imgur.com/5X3QWSO
非常感谢您的阅读!
#1 楼
代码的基础是代码的开始入口点的地址是可执行文件开始执行的位置(主函数的第一条指令)
它们可以相同也可以不同
这是一个示例,它们都相同
:\>dumpbin /headers funadd.exe | grep -iE "base of code|entry point"
1000 entry point (00401000) _WinMain@16
1000 base of code
,因为主函数没有引用任何其他函数
这样的代码
int main (void) { printf ( "%x\n" , dosomecrap() ); }
然后,在编译主函数时,需要引用dosomecrap()函数,以便编译器将首先编译dosomecrap()并将代码从代码的基础
在这种情况下,main()在代码部分的后面。
,所以它们不会是相同的
入口点的地址将指向main() )
代码库可能指向dosomecrap()的开始
在普通的已编译可执行文件中,main不是第一个被执行的代码
它是cruntime初始化代码像maincrtstartup()或WinMainCrtStartup()
首先执行的
导入节可以合并到文本节
,在这种情况下,已解析的导入从代码的基础开始
您可以编写这样的代码并将数据节合并到.text节中,在这种情况下,嵌入式字节将是代码基数的第一个字节
#include <windows.h>
int p[] = { '\x90\x90\x90\x90' };
int funAdd() {
int myvar = 2;
return myvar + p[0];
}
int CALLBACK WinMain(_In_ HINSTANCE,_In_opt_ HINSTANCE,_In_ LPSTR,_In_ int) {
funAdd();
}
您用
cl /Zi /W4 /analyze /EHsc /Od /nologo funadd.cpp /link /release /subsystem:windows /entry:WinMain /nologo /merge:.data=.text
进行编译,并检查是否可以看到代码的基址入口点的地址不同
入口点的地址已移位了16个字节或0x10个字节(对齐要求说代码应与16个字节边界对齐)
:\>dumpbin /headers funadd.exe | grep -iE "base of code|entry point"
1010 entry point (00401010) _WinMain@16
1000 base of code
您可以看到如下所示的0x90
:\>dumpbin /disasm /range:0x401000,0x401016 funadd.exe
Microsoft (R) COFF/PE Dumper Version 14.14.26430.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file funadd.exe
File Type: EXECUTABLE IMAGE
?p@@3PAHA:
00401000: 90 90 90 90 ....
00401004: 00 00 00 00 00 00 00 00 00 00 00 00 ............
_WinMain@16:
00401010: 55 push ebp
00401011: 8B EC mov ebp,esp
00401013: E8 08 00 00 00 call ?funAdd@@YAHXZ
Summary
1000 .text
评论
很好的解释!但是我在这里有2个问题:1.如您所述,变量p(\ x90 \ x90 \ x90 \ x90)的数据位于.text部分。但是,我们应该怎么做使其显示在.idata节中?我的意思是应该将其放置在数据部分中更可取吗? :) 2.为什么应该有400000字节的图像库。有什么目的吗?根据msdn,这是映像的第一个字节的首选地址,当加载到内存中时。但是为什么需要这样做呢?它会提高加载效率吗?
– Mod Coc
19年5月14日下午14:36
评论
在IDA中打开应用程序时,该应用程序会自动加载到通常是随机的地址中。您可以将其重新设置为其他地址(edit-> segments-> rebase)。要查看不同的细分,请转到视图->打开子视图->细分,或按Shift + F7。我不知道CFF资源管理器中是否有变基功能。您的问题有点混乱。您介意重写它以便更清楚吗?