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
00401013 |. 6A 00 push 0 ; /ExitCode = 0
00401015 \. E8 06000000 call
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 ; 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 ........ .......
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:
评论加载中...
|