首页 > 代码库 > 进程启动分析

进程启动分析

VS2013编译以下代码:

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    int test = 1;
    test = 2;

    return 0;
}

使用CFF Explorer或者PEID打开编译后生成的exe文件,查看imageBase和OEP,如下所示:

OEP:  0x00011073

技术分享

ImageBase:0x00400000

技术分享

所以该程序的启动点在:0x00411073

该程序的区段信息如下所示:

技术分享

将其载入OD,其载入地址并非00400000,所以载入OD后,alt+e,先看看主模块的载入地址:

技术分享

一般进程运行时都是先载入该exe文件,所以exe总能以其imagebase载入,但这里不知这个是为什么,这里可以不用管这个,直接以其载入地址0x00390000进行后面的分析,但是鄙人有强迫症,总想搞清楚这是为什么,所以先来看下为什么不能以imagebase载入。

联想到安全机制ASLR,难道是这个原因?多次载入,果然发现多次载入时主模块的载入地址每次都不同。。。

隐约记得VC6.0是不支持ASLR的,所以下面用VC6.0重新编译以下代码
#include "stdafx.h"

int main(int argc, char* argv[])
{
    printf("Hello World!\n");
    return 0;
}

果然,每次载入地址都是00400000,那么VS2013的ASLR是不是也可以关闭呢?记得好像哪里有说过可以关闭,找一找。。。

强大的网友:

---------------------------------------------------------------------------------------------------

通过加载程序时候不再使用固定的基址加载,从而干扰shellcode定位的一种保护机制

windows Vista出现后,ASLR 才真正开始发挥作用

VS2005 添加 /dynmicbase 就可以支持 ASLR

VS2008 linker->Randomized Base Address 设置

包含 映像随机化,堆栈随机化,PEB+TEB随机化

---------------------------------------------------------------------------------------------------

技术分享

果然,将其关闭,再次测试

备注:关闭后,少了一个区段reloc,这个此处不分析为什么

技术分享

搞定,此处只是为了便于多次分析,所以关闭ASLR,正常情况,为了安全还是要将ASLR打开的

---------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------

下面从基地址(0x00400000)开始分析,如下所示:

我们知道PE文件在内库中是以1000h(一页)对其,所以先看该页:

技术分享

。。。。。。

技术分享

。。。。。。

end

这部分数据全是PE文件的结构数据,各种头部,区段数据等,和本主题没关系,继续向下第二页:

0x00401000,PEID和OD都可以知道这部分数据是.textbbs,

技术分享

0x00401000---0x00402000这一页内存,结果全是0,《程序员的自我修养》中说“.bbs”段存放的是为初始化的全局变量和局部静态变量,这里没有用到未初始化的全局变量和局部静态变量,所以全是0.

下一个区段:.text(0x00411000

明天再分析,先睡觉了

进程启动分析