【Exe結構分析】

 5A 50 00 02 00 00 00   04 00 0F 00 FF FF 00 00
B8 00 00 00 00 00 00 00   40 00 1A 00 00 00 00 00
00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00   00 00 00 00 00 01 00 00  
BA 10 00 0E 1F B4 09 CD   21 B8 01 4C CD 21 90 90   //从这行开始是DOS Stub
54 68 69 73 20 70 72 6F   67 72 61 6D 20 6D 75 73    // This program mus
74 20 62 65 20 72 75 6E   20 75 6E 64 65 72 20 57
69 6E 33 32 0D 0A 24 37   00 00 00 00 00 00 00 00   // 24就是'$'
00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
------------------------------------------------------------------------------------------------------
     我很早就有这个想法,但是直到今天还是没解决这个问题。很多人连我自己都认为我在干一件很蠢的事情,但是这个问题不解决就一直压在我心里,真不好受啊?
    
    上面那个是Delphi编译出的默认头部,我用Debug 1.exe再用U命令查看到
0B8D:0000 BA1000        MOV     DX,0010
0B8D:0003 0E            PUSH    CS
0B8D:0004 1F            POP     DS
0B8D:0005 B409          MOV     AH,09
0B8D:0007 CD21          INT     21
0B8D:0009 B8014C        MOV     AX,4C01
0B8D:000C CD21          INT     21

Dos Stub中真正有价值的命令就这几条,但是问题是运行此命令的硬件(寄存器、内存等)环境怎么提取出来,在DOS MZ Head块的那些信息好像帮不上我。我是XP时代接触电脑的,请各位高手帮帮我!

=======================================
你提取后, 前6个byte改为如下, 试试

4D 5A 00 01 01 00

=======================================
  1. _IMAGE_DOS_HEADER = packed record      { DOS .EXE header                  }  
  2.     e_magic: Word;                     { Magic number                     }  
  3.     e_cblp: Word;                      { Bytes on last page of file       }  
  4.     e_cp: Word;                        { Pages in file                    }  
  5.     e_crlc: Word;                      { Relocations                      }  
  6.     e_cparhdr: Word;                   { Size of header in paragraphs     }  
  7.     e_minalloc: Word;                  { Minimum extra paragraphs needed  }  
  8.     e_maxalloc: Word;                  { Maximum extra paragraphs needed  }  
  9.     e_ss: Word;                        { Initial (relative) SS value      }  
  10.     e_sp: Word;                        { Initial SP value                 }  
  11.     e_csum: Word;                      { Checksum                         }  
  12.     e_ip: Word;                        { Initial IP value                 }  
  13.     e_cs: Word;                        { Initial (relative) CS value      }  
  14.     e_lfarlc: Word;                    { File address of relocation table }  
  15.     e_ovno: Word;                      { Overlay number                   }  
  16.     e_res: array [0..3of Word;       { Reserved words                   }  
  17.     e_oemid: Word;                     { OEM identifier (for e_oeminfo)   }  
  18.     e_oeminfo: Word;                   { OEM information; e_oemid specific}  
  19.     e_res2: array [0..9of Word;      { Reserved words                   }  
  20.     _lfanew: LongInt;                  { File address of new exe header   }  
  21. end;  

Magic number :用于標識可執行文件的類型,如下常量表示不同的類型

  cDOSMagic = $5A4D;      // magic number for a DOS executable
  cNEMagic = $454E;       // magic number for a NE executable (Win 16)
  cPEMagic = $4550;       // magic nunber for a PE executable (Win 32)
  cLEMagic = $454C;       // magic number for a Virtual Device Driver
Bytes on last page of file : 文件在最后一個頁面的字節數

Pages in file : 文件所占用的頁面數

Relocations : 需要重定位的segment數目

size of header in paragraphs : dos文件頭占用大小

Minimum extra paragraphs needed : 需要額外的最少段數目

Maximum extra paragraphs needed : 需要額外的最大段數目

Initial (relative) SS value : 堆棧段寄存器的初始值

Initial (relative) sp value :堆棧寄存器的初始值

Checksum : 校驗和

   A checksum or hash sum 是固定的值,由任意的一塊數字計算而來。這塊數字用于檢測意外的錯誤。任何時候可以重新計算checksum,然后比對是否一致。更多詳細參考:http://en.wikipedia.org/wiki/Checksum

Initial IP value : 初始的指令寄存器值

File address of relocation table: 重定位表,在早期的16位系統中,為使得尋址能力達到20位,以滿足可訪問更多的空間,搭配使用了段(segment)。這里記錄了指向代碼段(code)、數據段(data)的地址,但這些地址并不是絕對、固定的。因為代碼段和數據段等,只有在被加載到內存時,才能他們的實際地址。當程序被加載到內存後,exe loader會通過重定位表,再修正segment中的相對值(偏移量),以正確定位到代碼段及數據段的真實地址。

   隨著32系統的到來,windows exe被設計為遵循PE的格式,這時的重定位表就不再被使用了。這是因為虛擬地址的出現——在虛擬空間里,Exe可以被加載到任意的地址,程序總是被以虛擬空間的基址加載,所以也就不要調整重定位表了。然而,在dll文件里,重定位表,仍是需要的,因為會被加載到已存在進程地址空間中,不再已既定的基址加載,所以需要矯正表中的偏移值。

++++++++++++++++++++++++++++++++++++

残留的DOS文件头真正有价值的地方是三处,如下:
DOS_HEADER db 'MZ' ; e_magic 证明这是一个可执行文件,且运行在dos或win系统下
......
......
  dw 40h ; e_lfarlc 指向那段小程序,目的是,如果你不小心将这个32为程序运行在
  ; DOS 下出现提示信息:“This program cannot be run in DOS mode.”
  ; 如果这是一个真正的DOS程序,这里就是DOS程序的入口
......
......
  dd offset PE_HEADER ; e_lfanew 指向真正的win32的PE 可执行文件头

你说的什么真正的有用的程序,只不过是一句提示,对于变形类PE可执行文件头,基本都是将段东西直接删除,根本就没有用处,就算你不小心将这样的没有提示的32为程序运行在DOS下,也没有什么,不过是没有提示而已。
这段提示不过是利用DOS中断服务程序 int 21h 的09号功能,显示几个提示字符,然后使用4c号功能直接退到DOS,这段代码完全没有用处,不过你有水平的话,可以将这段东西改为病毒代码,放在那里永远也不运行,假如那天有人不小心运行在DOS下,那么对不起,杀掉你的硬盘(太简单,直接抹去主引导,分区引导和文件分配表),杀掉你的BIOS,(如果是现在的带保护的BIOS无效),然后喇叭里放点难听的东西,哈哈。

分离那个东西很困难吗?看我以前写的书《可执行文件头的变形技术》 http://bbs.pediy.com/showthread.php?t=66180
下面是 IDA 中分析PE可执行文件头的映像:
在IDA中运行我写的IDA描述语言文件 CreatePeHd.idc 就可以得到下面的东西,不管你是delphi还是vc++还是什么其他东西编译链接生成的可执行文件,前提是文件头没有变形。
Assembly code
            
687E0000 HEADER segment page public ' DATA ' use16 687E0000 assume cs: HEADER 687E0000 ; org 687E0000h 687E0000 DOS_HEADER db ' MZ ' ; e_magic 687E0000 dw 90h ; e_cblp 687E0000 dw 3 ; e_cp 687E0000 dw 0 ; e_crlc 687E0000 dw 4 ; e_cparhdr 687E0000 dw 0 ; e_minalloc 687E0000 dw 0FFFFh ; e_maxalloc 687E0000 dw 0 ; e_ss 687E0000 dw 0B8h ; e_sp 687E0000 dw 0 ; e_csum 687E0000 dw 0 ; e_ip 687E0000 dw 0 ; e_cs 687E0000 dw 40h ; e_lfarlc 687E0000 dw 0 ; e_ovno 687E0000 dw 4 dup( 0 ) ; e_res 687E0000 dw 0 ; e_oemid 687E0000 dw 0 ; e_oeminfo 687E0000 dw 0Ah dup( 0 ) ; e_res2 687E0000 dd offset PE_HEADER - offset DOS_HEADER ; e_lfanew 687E0040 ; ----------------------------------------------------------------------- 687E0040 +++++++++++++++++ DOS PROGRAM START ++++++++++++++++ 687E0040 687E0040 ; *************** S U B R O U T I N E *************************************** 687E0040 687E0040 687E0040 ShowInfo proc near 687E0040 push cs 687E0041 pop ds 687E0042 mov dx, (offset szInfo - offset ShowInfo) ; "This program cannot be run in DOS mode."... 687E0045 mov ah, 9 687E0047 int 21h ; DOS - PRINT STRING 687E0047 ; DS:DX -> string terminated by "$" 687E0049 mov ax, 4C01h 687E004C int 21h ; DOS - 2+ - QUIT WITH EXIT CODE (EXIT) 687E004C ; AL = exit code 687E004C 687E004C ShowInfo endp 687E004C 687E004E szInfo db ' This program cannot be run in DOS mode. ' ,0Dh,0Dh,0Ah, ' $ ' 687E004E +++++++++++++++++ DOS PROGRAM END ++++++++++++++ 687E004E ; ======================================================================= 687E0079 db 0 , 0 , 0 , 0 , 0 , 0 , 0 , 81h 687E0079 db 7Bh, 4Ah,0DEh,0C5h, 1Ah, 24h, 8Dh,0C5h 687E0079 db 1Ah, 24h, 8Dh,0C5h, 1Ah, 24h, 8Dh,0C5h 687E0079 db 1Ah, 25h, 8Dh,0F1h, 1Ah, 24h, 8Dh, 9Ch 687E0079 db 39h, 37h, 8Dh,0C3h, 1Ah, 24h, 8Dh,0EFh 687E0079 db 12h, 22h, 8Dh,0C4h, 1Ah, 24h, 8Dh,0C5h 687E0079 db 1Ah, 24h, 8Dh,0C9h, 1Ah, 24h, 8Dh 687E00B0 Rich db ' Rich ' 687E00B4 db 0C5h, 1Ah, 24h, 8Dh, 0 , 0 , 0 , 0 687E00B4 db 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 687E00B4 db 0 , 0 , 0 , 0 687E00C8 ; ======================================================================= 687E00C8 ; **************** IMAGE_NT_HEADERS STRUCTURE START **************** 687E00C8 ; SIGNATURE 687E00C8 PE_HEADER db ' PE ' , 0 , 0 ; Signature 687E00CC ; ----------------------------------------------------------------------- 687E00CC ; IMAGE_FILE_HEADER 687E00CC dw 14Ch ; Machine 687E00CC dw 4 ; NumberOfSections 687E00CC dd 385135B7h ; TimeDateStamp 687E00CC dd 0 ; PointerToSymbolTable 687E00CC dd 0 ; NumberOfSymbols 687E00CC dw 0E0h ; SizeOfOptionalHeader 687E00CC dw 230Eh ; Characteristics 687E00E0 ; ----------------------------------------------------------------------- 687E00E0 ; IMAGE_OPTIONAL_HEADER32 687E00E0 dw 10Bh ; Magic 687E00E0 db 5 ; MajorLinkerVersion 687E00E0 db 0Ch ; MinorLinkerVersion 687E00E0 dd 3200h ; SizeOfCode 687E00E0 dd 3A00h ; SizeOfInitializedData 687E00E0 dd 0 ; SizeOfUninitializedData 687E00E0 dd offset DllEntryPoint - offset DOS_HEADER ; AddressOfEntryPoint 687E00E0 dd 1000h ; BaseOfCode 687E00E0 dd 5000h ; BaseOfData 687E00E0 dd 687E0000h ; ImageBase 687E00E0 dd 1000h ; SectionAlignment 687E00E0 dd 200h ; FileAlignment 687E00E0 dw 5 ; MajorOperatingSystemVersion 687E00E0 dw 0 ; MinorOperatingSystemVersion 687E00E0 dw 5 ; MajorImageVersion 687E00E0 dw 0 ; MinorImageVersion 687E00E0 dw 4 ; MajorSubsystemVersion 687E00E0 dw 0 ; MinorSubsystemVersion 687E00E0 dd 0 ; Win32VersionValue 687E00E0 dd 0B000h ; SizeOfImage 687E00E0 dd 400h ; SizeOfHeaders 687E00E0 dd 13ABFh ; CheckSum 687E00E0 dw 3 ; Subsystem 687E00E0 dw 0 ; DllCharacteristics 687E00E0 dd 40000h ; SizeOfStackReserve 687E00E0 dd 1000h ; SizeOfStackCommit 687E00E0 dd 100000h ; SizeOfHeapReserve 687E00E0 dd 1000h ; SizeOfHeapCommit 687E00E0 dd 0 ; LoaderFlags 687E00E0 dd 10h ; NumberOfRvaAndSizes
 

#4楼 得分:3回复于:2009-08-09 22:53:58
Assembly code
            
687E0140 ; ----------------------------------------------------------------------- 687E0140 ; DATA DIRECTORY 687E0140 ; IMAGE_DIRECTORY_ENTRY_EXPORT 687E0140 dd offset IMAGE_EXPORT_DIRECTORY_PSAPI_DLL - offset DOS_HEADER ; VirtualAddress 687E0140 dd 270h ; Size 687E0148 ; ----------------------------------------------------------------------- 687E0148 ; IMAGE_DIRECTORY_ENTRY_IMPORT 687E0148 dd offset IMPORT_DESCRIPTOR_NTDLL_DLL - offset DOS_HEADER ; VirtualAddress 687E0148 dd 54h ; Size 687E0150 ; ----------------------------------------------------------------------- 687E0150 ; IMAGE_DIRECTORY_ENTRY_RESOURCE 687E0150 dd offset RESOURCE_TABLE - offset DOS_HEADER ; VirtualAddress 687E0150 dd 3A8h ; Size 687E0158 ; ----------------------------------------------------------------------- 687E0158 ; IMAGE_DIRECTORY_ENTRY_EXCEPTION 687E0158 dd 0 ; VirtualAddress 687E0158 dd 0 ; Size 687E0160 ; ----------------------------------------------------------------------- 687E0160 ; IMAGE_DIRECTORY_ENTRY_CERTIFICATE 687E0160 dd 0 ; VirtualAddress 687E0160 dd 0 ; Size 687E0168 ; ----------------------------------------------------------------------- 687E0168 ; IMAGE_DIRECTORY_ENTRY_BASERELOC 687E0168 dd offset BASERELOC_TABLE - offset DOS_HEADER ; VirtualAddress 687E0168 dd 33Ch ; Size 687E0170 ; ----------------------------------------------------------------------- 687E0170 ; IMAGE_DIRECTORY_ENTRY_DEBUG 687E0170 dd offset DEBUG_TABLE - offset DOS_HEADER ; VirtualAddress 687E0170 dd 1Ch ; Size 687E0178 ; ----------------------------------------------------------------------- 687E0178 ; IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 687E0178 dd 0 ; VirtualAddress 687E0178 dd 0 ; Size 687E0180 ; ----------------------------------------------------------------------- 687E0180 ; IMAGE_DIRECTORY_ENTRY_GLOBALPTR 687E0180 dd 0 ; VirtualAddress 687E0180 dd 0 ; Size 687E0188 ; ----------------------------------------------------------------------- 687E0188 ; IMAGE_DIRECTORY_ENTRY_TLS 687E0188 dd 0 ; VirtualAddress 687E0188 dd 0 ; Size 687E0190 ; ----------------------------------------------------------------------- 687E0190 ; IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 687E0190 dd 0 ; VirtualAddress 687E0190 dd 0 ; Size 687E0198 ; ----------------------------------------------------------------------- 687E0198 ; IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 687E0198 dd offset IMAGE_BOUND_IMPORT_DESCRIPTOR_NTDLL_DLL - offset DOS_HEADER ; VirtualAddress 687E0198 dd 38h ; Size 687E01A0 ; ----------------------------------------------------------------------- 687E01A0 ; IMAGE_DIRECTORY_ENTRY_IAT 687E01A0 dd offset _stricmp - offset DOS_HEADER ; VirtualAddress 687E01A0 dd 0BCh ; Size 687E01A8 ; ----------------------------------------------------------------------- 687E01A8 ; IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 687E01A8 dd offset DELAY_IMPORT_TABLE - offset DOS_HEADER ; VirtualAddress 687E01A8 dd 40h ; Size 687E01B0 ; ----------------------------------------------------------------------- 687E01B0 ; IMAGE_DIRECTORY_ENTRY_CLR_RUNTIME 687E01B0 dd 0 ; VirtualAddress 687E01B0 dd 0 ; Size 687E01B8 ; ----------------------------------------------------------------------- 687E01B8 ; IMAGE_DATA_DIRECTORY 687E01B8 dd 0 ; VirtualAddress 687E01B8 dd 0 ; Size 687E01C0 ; **************** IMAGE_NT_HEADERS STRUCTURE END ******************** 687E01C0 ; ======================================================================= 687E01C0 ; ******************** SECTION STRUCTURE START *********************** 687E01C0 687E01C0 ; .text_SECTION_HEADER 687E01C0 db ' .text ' , 0 , 0 , 0 ; Name 687E01C0 dd 3048h ; VirtualSize 687E01C0 dd offset _stricmp - offset DOS_HEADER ; VirtualAddress 687E01C0 dd 3200h ; SizeOfRawData 687E01C0 dd 400h ; PointerToRawData 687E01C0 dd 0 ; PointerToRelocations 687E01C0 dd 0 ; PointerToLinenumbers 687E01C0 dw 0 ; NumberOfRelocations 687E01C0 dw 0 ; NumberOfLinenumbers 687E01C0 dd 60000020h ; Characteristics 687E01E8 ; ----------------------------------------------------------------------- 687E01E8 ; .data_SECTION_HEADER 687E01E8 db ' .data ' , 0 , 0 , 0 ; Name 687E01E8 dd 3178h ; VirtualSize 687E01E8 dd offset Symbol - offset DOS_HEADER ; VirtualAddress 687E01E8 dd 3200h ; SizeOfRawData 687E01E8 dd 3600h ; PointerToRawData 687E01E8 dd 0 ; PointerToRelocations 687E01E8 dd 0 ; PointerToLinenumbers 687E01E8 dw 0 ; NumberOfRelocations 687E01E8 dw 0 ; NumberOfLinenumbers 687E01E8 dd 0C0000040h ; Characteristics 687E0210 ; ----------------------------------------------------------------------- 687E0210 ; .rsrc_SECTION_HEADER 687E0210 db ' .rsrc ' , 0 , 0 , 0 ; Name 687E0210 dd 3A8h ; VirtualSize 687E0210 dd offset RESOURCE_TABLE - offset DOS_HEADER ; VirtualAddress 687E0210 dd 400h ; SizeOfRawData 687E0210 dd 6800h ; PointerToRawData 687E0210 dd 0 ; PointerToRelocations 687E0210 dd 0 ; PointerToLinenumbers 687E0210 dw 0 ; NumberOfRelocations 687E0210 dw 0 ; NumberOfLinenumbers 687E0210 dd 40000040h ; Characteristics 687E0238 ; ----------------------------------------------------------------------- 687E0238 ; .reloc_SECTION_HEADER 687E0238 db ' .reloc ' , 0 , 0 ; Name 687E0238 dd 33Ch ; VirtualSize 687E0238 dd offset BASERELOC_TABLE - offset DOS_HEADER ; VirtualAddress 687E0238 dd 400h ; SizeOfRawData 687E0238 dd 6C00h ; PointerToRawData 687E0238 dd 0 ; PointerToRelocations 687E0238 dd 0 ; PointerToLinenumbers 687E0238 dw 0 ; NumberOfRelocations 687E0238 dw 0 ; NumberOfLinenumbers 687E0238 dd 42000040h ; Characteristics 687E0260 ; ******************** SECTION STRUCTURE END *********************** 687E0260 ; ======================================================================= 687E0260 IMAGE_BOUND_IMPORT_DESCRIPTOR_NTDLL_DLL dd 38175B30h ; TimeDateStamp 687E0260 dw 20h ; OffsetModuleName 687E0260 dw 0 ; NumberOfModuleForwarderRefs 687E0268 IMAGE_BOUND_IMPORT_DESCRIPTOR_KERNEL32_DLL dd 385134FEh ; TimeDateStamp 687E0268 dw 2Ah ; OffsetModuleName 687E0268 dw 1 ; NumberOfModuleForwarderRefs 687E0270 IMAGE_BOUND_FORWARDER_REFNTDLL_DLL dd 38175B30h ; TimeDateStamp 687E0270 dw 20h ; OffsetModuleName 687E0270 dw 0 ; Reserved 687E0278 NULL_IMAGE_BOUND_IMPORT_DESCRIPTOR_ dd 0 ; TimeDateStamp 687E0278 dw 0 ; OffsetModuleName 687E0278 dw 0 ; NumberOfModuleForwarderRefs 687E0280 Ntdll_dll db ' NTDLL.DLL ' , 0 687E028A Kernel32_dll db ' KERNEL32.DLL ' , 0 687E0297 align 2 687E0298 db 168h dup( 0 ), 0C00h dup(?) 687E0298 HEADER ends

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值