首页
社区
课程
招聘
[求助]我手写的一个PE,OD不能载入提示无法启动文件,直接运行提示不是有效的win32位应用程序,W32Dasm可以正常分析,自己实在是看不出哪错了,求指点
发表于: 2012-5-20 19:00 16449

[求助]我手写的一个PE,OD不能载入提示无法启动文件,直接运行提示不是有效的win32位应用程序,W32Dasm可以正常分析,自己实在是看不出哪错了,求指点

2012-5-20 19:00
16449
dos头、nt头和节表在LordPE中的显示:
->DOS Header
   e_magic:     0x5A4D
   e_cblp:      0x0090
   e_cp:        0x0003
   e_crlc:      0x0000
   e_cparhdr:   0x0004
   e_minalloc:  0x0000
   e_maxalloc:  0xFFFF
   e_ss:        0x0000
   e_sp:        0x00B8
   e_csum:      0x0000
   e_ip:        0x0000
   e_cs:        0x0000
   e_lfarlc:    0x0040
   e_ovno:      0x0000
   e_res:       0x0000000000000000
   e_oemid:     0x0000
   e_oeminfo:   0x0000
   e_res2:      0x0000000000000000000000000000000000000000
   e_lfanew:    0x000000D0

->File Header
   Machine:               0x014C  (I386)
   NumberOfSections:      0x0003
   TimeDateStamp:         0x47D4FC40  (GMT: Mon Mar 10 09:15:44 2008)
   PointerToSymbolTable:  0x00000000
   NumberOfSymbols:       0x00000000
   SizeOfOptionalHeader:  0x00E0
   Characteristics:       0x010F
                          (RELOCS_STRIPPED)
                          (EXECUTABLE_IMAGE)
                          (LINE_NUMS_STRIPPED)
                          (LOCAL_SYMS_STRIPPED)
                          (32BIT_MACHINE)

->Optional Header
   Magic:                        0x010B  (HDR32_MAGIC)
   MajorLinkerVersion:           0x06
   MinorLinkerVersion:           0x00  -> 6.00
   SizeOfCode:                   0x00003000
   SizeOfInitializedData:        0x00003000
   SizeOfUninitializedData:      0x00000000
   AddressOfEntryPoint:          0x00001000
   BaseOfCode:                   0x00001000
   BaseOfData:                   0x00004000
   ImageBase:                    0x00400000
   SectionAlignment:             0x00001000
   FileAlignment:                0x00001000
   MajorOperatingSystemVersion:  0x0004
   MinorOperatingSystemVersion:  0x0000  -> 4.00
   MajorImageVersion:            0x0000
   MinorImageVersion:            0x0000  -> 0.00
   MajorSubsystemVersion:        0x0004
   MinorSubsystemVersion:        0x0000  -> 4.00
   Win32VersionValue:            0x00000000
   SizeOfImage:                  0x0009E000
   SizeOfHeaders:                0x00001000
   CheckSum:                     0x00000000
   Subsystem:                    0x0002  (WINDOWS_GUI)
   DllCharacteristics:           0x0000
   SizeOfStackReserve:           0x00100000
   SizeOfStackCommit:            0x00001000
   SizeOfHeapReserve:            0x00100000
   SizeOfHeapCommit:             0x00001000
   LoaderFlags:                  0x00000000
   NumberOfRvaAndSizes:          0x00000010

   DataDirectory (16)            RVA        Size
   -------------                 ---------- ----------
   ExportTable                   0x00000000 0x00000000
   ImportTable                   0x0000400C 0x00000028  (".rdata")
   Resource                      0x00000000 0x00000000
   Exception                     0x00000000 0x00000000
   Security                      0x00000000 0x00000000
   Relocation                    0x00000000 0x00000000
   Debug                         0x00000000 0x00000000
   Copyright                     0x00000000 0x00000000
   GlobalPtr                     0x00000000 0x00000000
   TLSTable                      0x00000000 0x00000000
   LoadConfig                    0x00000000 0x00000000
   BoundImport                   0x00000000 0x00000000
   IAT                           0x00004000 0x0000000C  (".rdata")
   DelayImport                   0x00000000 0x00000000
   COM                           0x00000000 0x00000000
   Reserved                      0x00000000 0x00000000

->Section Header Table
   1. item:
    Name:                  .text
    VirtualSize:           0x00000008
    VirtualAddress:        0x00001000
    SizeOfRawData:         0x00003000
    PointerToRawData:      0x00001000
    PointerToRelocations:  0x00000000
    PointerToLinenumbers:  0x00000000
    NumberOfRelocations:   0x0000
    NumberOfLinenumbers:   0x0000
    Characteristics:       0x60000020
    (CODE, EXECUTE, READ)

   2. item:
    Name:                  .rdata
    VirtualSize:           0x0000006C
    VirtualAddress:        0x00004000
    SizeOfRawData:         0x00003000
    PointerToRawData:      0x00004000
    PointerToRelocations:  0x00000000
    PointerToLinenumbers:  0x00000000
    NumberOfRelocations:   0x0000
    NumberOfLinenumbers:   0x0000
    Characteristics:       0x40000040
    (INITIALIZED_DATA, READ)

   3. item:
    Name:                  .data
    VirtualSize:           0x00096A38
    VirtualAddress:        0x00007000
    SizeOfRawData:         0x00097000
    PointerToRawData:      0x00007000
    PointerToRelocations:  0x00000000
    PointerToLinenumbers:  0x00000000
    NumberOfRelocations:   0x0000
    NumberOfLinenumbers:   0x0000
    Characteristics:       0xC0000040
    (INITIALIZED_DATA, READ, WRITE)

代码在第1个节,只有两句,push 0和调用输入表中的ExitProcess退出,下面是W32Dasm的显示:
Disassembly of File: 1.exe
Code Offset = 00001000, Code Size = 00003000
Data Offset = 00007000, Data Size = 00097000

Number of Objects = 0003 (dec), Imagebase = 00400000h

   Object01: .text    RVA: 00001000 Offset: 00001000 Size: 00003000 Flags: 60000020
   Object02: .rdata   RVA: 00004000 Offset: 00004000 Size: 00003000 Flags: 40000040
   Object03: .data    RVA: 00007000 Offset: 00007000 Size: 00097000 Flags: C0000040

+++++++++++++++++++ MENU INFORMATION ++++++++++++++++++

        There Are No Menu Resources in This Application

+++++++++++++++++ DIALOG INFORMATION ++++++++++++++++++

        There Are No Dialog Resources in This Application

+++++++++++++++++++ IMPORTED FUNCTIONS ++++++++++++++++++
Number of Imported Modules =    1 (decimal)

   Import Module 001: KERNEL32.dll

+++++++++++++++++++ IMPORT MODULE DETAILS +++++++++++++++

   Import Module 001: KERNEL32.dll

Addr:0000404E hint(036A) Name: VirtualAlloc
Addr:0000405E hint(00B7) Name: ExitProcess

+++++++++++++++++++ EXPORTED FUNCTIONS ++++++++++++++++++
Number of Exported Functions = 0000 (decimal)

+++++++++++++++++++ ASSEMBLY CODE LISTING ++++++++++++++++++
//********************** Start of Code in Object .text **************
Program Entry Point = 00401000 (1.exe File Offset:00005000)

//******************** Program Entry Point ********
:00401000 6A00                    push 00000000

* Reference To: KERNEL32.ExitProcess, Ord:00B7h
                                  |
:00401002 FF1504404000            Call dword ptr [00404004]

输入表在第2个节开头,剩下的包括第3个节在内全部都是0。
反复看了很久实在是不知道哪错了,请帮忙看看。
文件在附件中:

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 999
活跃值: (1186)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
楼主应该修正文件虚拟大小,修改了两个,虚拟地址大小,
上传的附件:
2012-5-20 20:22
0
雪    币: 480
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
真的可以运行了,非常感谢daohaodaye。

有些疑问,VirtualSize在《Microsoft可移植可执行文件和通用目标文件格式文件规范v8.1》中的解释是:VirtualSize 当加载进内存时这个节的总大小。如果此值比SizeOfRawData大,那么多出的部分用0填充。

我的理解VirtualSize应该就是这个节中所有数据的真实字节大小,而我生成的文件也是这样设置的,却不能运行,全部清零反而可以运行了,这是为什么?
而且我看其他的手工生成PE文章也都是设的真实字节大小,还有我看VC6生成的文件也都是设置的真实大小。
迷惑不解中。
2012-5-20 20:45
0
雪    币: 999
活跃值: (1186)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
楼上大牛,这个问题我无法解释,表示惭愧。我只知道虚拟大小不能小于物理大小,但不能超过物理大小太多,超过太多的话,覆盖到下一区段也是无法运行。
2012-5-20 21:17
0
雪    币: 480
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我也是菜鸟。

又试了大量的值,结果:
1.貌似必须第1个节和第2个节的VirtualSize同时改才行,只改其中一个还是不能运行,OD不能载入。
2.VirtualSize的值只能是0或是和SizeOfRawData一样的值才行,其他的不管是大于还是小于SizeOfRawData都不行。

晕了。
2012-5-20 21:23
0
雪    币: 2815
活跃值: (2608)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
6


根据经验,除了最后一个区段,其他都得对齐

你的对齐:
   SectionAlignment:             0x00001000
   FileAlignment:                0x00001000
2012-5-20 22:06
0
雪    币: 480
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我的文件是对齐过的,需要对齐到段或文件对齐的域:
SizeOfImage 段
SizeOfHeaders 文件
节表中需要对齐到文件对齐的是SizeOfRawData不是VirtualSize。
2012-5-20 23:31
0
雪    币: 2815
活跃值: (2608)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
8
FileAlignment对应SizeOfRawData
SectionAlignment对应VirtualSize
你只对齐了前者,后者没有对齐

相关链接:http://bbs.pediy.com/archive/index.php?t-2749.html
2012-5-20 23:41
0
雪    币: 480
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼上给的链接中说的很对啊,跟我理解的一样,SizeOfRawData是需要对齐的VirtualSize是不需要对齐的。

这里要怪就怪微软,微软的文档对VirtualSize的描述只有可怜的一句话,还说的不明不白,不过可以用PE工具对照着其他编译好的程序看,例如VC6编译的程序就是不对齐的,VirtualSize中储存的是节中所有数据的真实字节大小。

不过也有例外,windows操作系统文件的代码节VirtualSize都是大于SizeOfRawData的,这应该是为了反病毒,使病毒不知道代码节真实大小,无法把代码直接插入代码节,这应该是微软经过特殊设置的,其他的编译器编译出来的文件,除非理解错误,否则正常的都应该是VirtualSize小于等于SizeOfRawData。
2012-5-21 00:01
0
雪    币: 480
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
终于找到原因了,VirtualSize的值和SizeOfRawData的值相差必须在1个FileAlignment大小以内!

看了这么多PE相关文章,以前还真没看到过有人提到过这个限制,估计是因为没人碰到过,因为编译器生成的文件肯定是正确设置的,而手工生成的文件一般都很小,我这个文件比较大,第1个节和第2个节的VirtualSize都比较小,而最后一个节第3个节的SizeOfRawData是按VirtualSize对齐生成的,所以第3个节的VirtualSize值肯定是正确的。所以就造成了第1个节和第2个节的VirtualSize值是错误的,而第3个节的VirtualSize值是正确的。

还有一点特例,就是VirtualSize如果设为0,也是可以正常运行的,VirtualSize等于0的情况下,windows加载器会用SizeOfRawData的值代替VirtualSize的值,也就是如果VirtualSize等于0则加载器会把节中全部数据都读入内存,所以VirtualSize的值设为0也可以正常运行。
2012-5-21 18:04
0
游客
登录 | 注册 方可回帖
返回
//