设为主页 | 加入收藏 | 繁體中文

PE学习

  Luevelsmeyer 的pe.txt总算是看完了,谢谢ah007的翻译。
  最后译者说道英华在于附录中,我略作修正重修一个文件,但不管怎样调,都无法运行。
  一开始还以为是什么中央没有写对,可运行附的hello.exe也是报错。
  看来用0x20对齐在XP下是不行的。这篇附录中就是太老了...
  我来说说我改写的历程吧。
  1.先写一段简单的代码
  ;MASMPlus 代码模板 - 普通的 Windows 步伐代码
  .386
  .Model Flat, StdCall
  Option Casemap :None
  Include user32.inc
  Include kernel32.inc
  IncludeLib user32.lib
  IncludeLib kernel32.lib
  .data
  MsgBoxText db "Hello.",0
  MsgCaption db "Test",0
  .CODE
  START:
  invoke MessageBox, NULL,addr MsgBoxText, addr MsgCaption, MB_OK
  invoke ExitProcess,NULL
  END START
  趁便提一下,我用的是MASMPlus,可以在http://www.aogosoft.com/下载。
  2.编译完之后用OD看一看
  00401000 >/$  6A 00      push    0                  ; /Style = MB_OK|MB_APPLMODAL
  00401002  |.  68 07304000    push    00403007              ; |Title = "Test"
  00401007  |.  68 00304000    push    00403000              ; |Text = "Hello."
  0040100C  |.  6A 00      push    0                  ; |hOwner = NULL
  0040100E  |.  E8 07000000    call          ; \MessageBoxA
  00401013  |.  6A 00      push    0                  ; /ExitCode = 0
  00401015  \.  E8 06000000    call          ; \ExitProcess
  0040101A   $- FF25 08204000  jmp     dword ptr [<&user32.MessageBoxA>>  ;  user32.MessageBoxA
  00401020   .- FF25 00204000  jmp     dword ptr [<&kernel32.ExitProces>  ;  kernel32.ExitProcess
  不错,以子女码照这个抄就可以了。
  发明用到了两个DLL的函数,稍微复杂了一点。
  再看看原文中的代码
  6A 00          ; push      0x00000000
  68 d0 01 10 00      ; push      offset _written
  6A 0D          ; push      0x0000000d
  68 c0 01 10 00      ; push      offset hello_string
  6A F5          ; push      0xfffffff5
  2E FF 15 28 02 10 00  ; call      dword ptr cs:__imp__GetStdHandle@4
  50      &nbsp;   ; push      eax
  2E FF 15 24 02 10 00  ; call      dword ptr cs:__imp__WriteConsoleA@20
  C3          ; ret
  注意两个call对应的机器码:E8和2E的不同,看来E8后面跟的是一个偏移量,
  0040101A   $- FF25 08204000  jmp     dword ptr [<&user32.MessageBoxA>>  ;  user32.MessageBoxA
  这条下令算是跳板的跳板。不想这样写,照旧用2E FF 15 。
  预算一下,代码长度在0x20之内。
  3.建一个Hello.exe,用WinHex来改。
  a)  先大约有个思路。
  文件对齐  0x00 00 02 00;
  区段对齐  0x00 00 10 00;
  ImageBase  0x00 40 00 00;
  只需两个段,一个代码段(Raw:0x200 / Rva:0x1000),把上面的代码放出来就可以了;
  一个数据段(Raw:0x400 / Rva:0x2000),一下去先放两个字符串,然后是输入目录。
  这样看来最多0x600个字节就可以搞定了,打开WinHex,加这么多的0。
  然后就可以开始改了。
  b)Dos Stub 这部分很简单,只需有MZ,然后设一下e_lfanew就可以了。
  00000000   4D 5A 00 00 00 00 00 00  00 00 00 00 00 00 00 00   MZ..............
  00000010   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
  00000020   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
  00000030   00 00 00 00 00 00 00 00  00 00 00 00 40 00 00 00   ............@...
  c)NT Header 部分这样看一定一头雾水...
  00000040   50 45 00 00 4C 01 02 00  00 00 00 00 00 00 00 00   PE..L...........
  00000050   00 00 00 00 E0 00 02 01  0B 01 00 00 20 00 00 00   ....?...... ...
  00000060   D0 00 00 00 00 00 00 00  00 10 00 00 00 10 00 00   ?..............
  00000070   00 20 00 00 00 00 40 00  00 10 00 00 00 02 00 00   . ....@.........
  00000080   04 00 00 00 00 00 00 00  04 00 00 00 00 00 00 00   ................
  00000090   00 30 00 00 00 02 00 00  00 00 00 00 02 00 00 00   .0..............
  000000A0   00 00 10 00 00 10 00 00  00 00 10 00 00 10 00 00   ................
  000000B0   00 00 00 00 10 00 00 00  00 00 00 00 00 00 00 00   ................
  000000C0   20 20 00 00 B0 00 00 00  00 00 00 00 00 00 00 00     ..?..........
  000000D0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
  000000E0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
  000000F0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
  00000100   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
  00000110   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
  00000120   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
  00000130   00 00 00 00 00 00 00 00  2E 63 6F 64 65 00 00 00   .........code...
  00000140   00 00 00 00 00 10 00 00  20 00 00 00 00 02 00 00 &nbsp; ........ .......
  00000150   00 00 00 00 00 00 00 00  00 00 00 00 20 00 00 60   ............ ..`
  00000160   2E 64 61 74 61 00 00 00  00 00 00 00 00 20 00 00   .data........ ..
  00000170   C0 00 00 00 00 04 00 00  00 00 00 00 00 00 00 00   ?..............
  00000180   00 00 00 00 40 00 00 C0                                                ....@..
  具体说一下:
  Signature          0x4550    ;间接在左边输入PE就可以了
  文件头部分:
  Machine            0x14c    ;Intel 386
  NumberOfSections      0x2      ;2个区段
  TimeDateStamp        0x0
  PointerToSymbolTable      0x0
  NumberOfSymbols      0x0
  SizeOfOptionalHeader      0xe0    ;可选头大小,永远是0xe0
  Characteristics        0x102    ;具体看pe说明
  ----------------------------------------
  可选头部分:
  Magic            0x10b    ;32-位
  MajorLinkerVersion      0x0
  MinorLinkerVersion      0x0
  SizeOfCode          0x20    ;任意写 0x0~0xFF FF FF FF都可以
  SizeOfInitializedData      0xd0    ;任意写 0x0~0xFF FF FF FF都可以
  SizeOfUninitializedData    0x0
  AddressOfEntryPoint      0x1000    ;入口,这里就是代码段开头处的Rva
  BaseOfCode          0x1000    ;代码段开头处的Rva
  BaseOfData          0x2000    ;数据段开头处的Rva
  ImageBase          0x400000  ;写代码是要注意把Base加上
  SectionAlignment        0x1000    ;区段对齐
  FileAlignment        0x200    ;文件对齐
  MajorOperatingSystemVersion  0x4      ;NT 4.0
  MinorOperatingSystemVersion   0x0
  MajorImageVersion      0x0
  MinorImageVersion      0x0
  MajorSubsystemVersion    0x4      ;Win32 4.0
  MinorSubsystemVersion    0x0
  Reserved1          0x0
  SizeOfImage          0x3000    ;请看下面的话
  SizeOfHeaders        0x200    ;文件中第一个区段的偏移量
  /*
  这里插段话,在原文的附录中,关于这两个字段是这描述的。
  SizeOfImage                 c0 00 00 00 ; sum of all section sizes
  SizeOfHeaders               a0 01 00 00 ; offset to 1st section
  这个描述很欠好,起首all section是包括Headers这个Section的
  但下面的1st section,显然指的是Headers后的第一个区段。
  这两个section含义纷歧致。
  我就被误导了,一开始这里填了0x2000,就没有通过。
  实在原文前面的表明比较清楚:
  ...它就是全部头和节的长度的总和。
  */
  CheckSum          0x0
  Subsystem          0x2      ;Win GUI
  DllCharacteristics        0x0
  SizeOfStackReserve      0x100000  ;就这样写吧


    文章作者: 福州军威计算机技术有限公司
    军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。

TAG:
评论加载中...
内容:
评论者: 验证码: