我做了一个随机的控制台应用程序,并加载到IDA中。所示的.text部分的开头是00BA1000。然后我将应用程序加载到CFF资源管理器中。入口点的地址为000110AA。它是函数的偏移量吗?如果是,是原始偏移量(在exe文件中)还是虚拟偏移量(在exe加载到内存中之后)?然后我看到有一个名为“代码基础”的钥匙。为什么addressofentrypoint不与代码库相同?我的意思是,它们是文本部分的开头,对吗?使用IDA,我可以知道.text节的开头是00BA1000。但是,如何使用CFF资源管理器知道它?使用CFF,我可以知道文本部分的虚拟地址是00011000。因此,当程序加载到内存中时,文本部分的开始应该是imagebase + 00011000对吗?使用ollydbg,我可以知道它的错误。计算出的地址不是正确的地址,但IDA中显示的地址是正确的。这些问题把我搞砸了。希望您能帮助我!!!

CFF资源管理器(基本上可以帮助您查看PE头):https://ntcore.com/?page_id=388

截屏:
https://imgur.com/affLCHY

https://imgur.com/1wTQAlX

https://imgur.com/5X3QWSO

非常感谢您的阅读!

评论

在IDA中打开应用程序时,该应用程序会自动加载到通常是随机的地址中。您可以将其重新设置为其他地址(edit-> segments-> rebase)。要查看不同的细分,请转到视图->打开子视图->细分,或按Shift + F7。我不知道CFF资源管理器中是否有变基功能。

您的问题有点混乱。您介意重写它以便更清楚吗?

#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