编写自定义PE结构的程序(如何手写一个PE,高级编译器都是编译好的PE头部,例如MASM,TASM等,NASM,FASM是低级编译器.可以自定义结构)
正在学PE结构...感谢个位大哥的文章和资料...这里先说声谢谢
一般高级编译器都是编译好的PE头部,例如MASM,TASM等
一直都说NASM,FASM是低级编译器.可以自定义结构
但是苦于无人发布相关文章说明..我这里就简单的用NASM写一下
由于刚学PE结构许多东西都不太懂希望个位大侠指点
如何打造一个迷你的PE结构..我暂只只能作到617字节
下面随着学习的深入...还有更迷你的PE出现...
代码可以直接编译..
编译参数:nasmw -fbin MsgBoxA.asm -o MsgBoxA.exe
请下载最新的NASM for Win32编译器
当前最新版本:NASM 0.98.39
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;Small PE Header Demo For NASM;Email:Anskya@Gmail.com;;代码说明:NASM 编写迷你PE代码.(C) 2006.3.20;1.自构造PE头部;2.自构造导入表结构;;Thank:Vecna[29A],Nguga aka PedroGC Made NAGOA+.INC;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[BITS 32]%define CODE_BASE 1000h ;代码基址%define RVADIFF 1000h-200h ;计算内存数据与硬盘数据相对便宜%define imagebase 00400000h ;代码基址%define reloc RVADIFF+imagebase ;全局偏移--一个很重要的参数;DOS STUB头部MZ_Header:.magic dw "MZ" ;01 02----DOS STUB标识[关键数据].cblp dw 435Bh ;03 04--[非关键数据].cp dw 415Dh ;05 06--[非关键数据].crlc dw 736Eh ;07 08--这十个字节我们可以写一点自己的个人信息[非关键数据].cparhdr dw 796Bh ;09 10--[非关键数据].minalloc dw 2161h ;11 12--[非关键数据]PE_Header:.Signature dd "PE" ;13 14 | 15 16----PE 头部起始[关键数据].Machine dw 14Ch ;17 18----该文件运行所要求的CPU:IMAGE_FILE_MACHINE_I386[关键数据].NumberOfSections dw 1 ;19 20----文件节数量[关键数据].TimeDateStamp dd 0h ;21 22 | 23 24----文件创建日期和时间[非关键数据].PointerToSymbolTable dd 0h ;25 26 | 27 28----调试信息-[非关键数据].NumberOfSymbols dd 0h ;29 30 | 31 32----调试信息-[非关键数据].SizeOfOptionalHeader dw 0E0h ;33 34----OptionalHeader 结构大小[关键数据].Characteristics dw 103h ;35 36----文件信息的标记:比如文件是exe还是dll[关键数据]Optional_Header:.Magic dw 10Bh ;37 38----[关键数据].MajorLinkerVersion db 0h ;39----[非关键数据].MinorLinkerVersion db 0h ;40----[非关键数据].SizeOfCode dd 0h ;41 42 | 43 44----[非关键数据].SizeOfInitializedData dd 0h ;45 46 | 47 48----[非关键数据].SizeOfUninitialzedData dd 0h ;49 50 | 51 52----[非关键数据].AddressOfEntryPoint dd code+RVADIFF ;53 54 | 55 56----代码基址+RVA=此值---需要计算[关键数据].BaseOfCode dd 0h ;57 58 | 59 60----代码基址[非关键数据];.BaseOfData dd DATA_BASE ;数据基址-被下面的.lfanew替换了~这个数值本身也没有什么用.lfanew dd 0Ch ;61 62 | 63 64----标识.PE头部的起始位置这里写为C-看上面第13字节;DOS STUB部分的最后结尾部分---标识:PE头部的起始位置~他的位置是固定的所以只能写在最后了;align 16, DB 0 .ImageBase dd imagebase;65 66 | 67 68----内存映射基址--默认为00400000h[关键数据].SectionAlignment dd 01000h ;69 70 | 71 72----内存中节对齐--如果该值是1000h那么每节的起始地址必须是4096的倍数,.FileAlignment dd 0200h ;73 74 | 75 76----文件对齐[关键数据]..明白吧.MajorOperSystemVersion dw 0h ;77 78--[非关键数据].MinorOperSystemVersion dw 0h ;79 80--[非关键数据].MajorImageVersion dw 0h ;81 82--win32子系统版本。若PE文件是专门为Win32设计的[非关键数据].MinorImageVersion dw 0h ;83 84--该子系统版本必定是4.0否则对话框不会有3维立体感[非关键数据].MajorSubsystemVersion dw 4 ;85 86--[关键数据].MinorSubsystemVersion dw 0 ;87 88--[关键数据].Reserved1 dd 0 ;89 90 | 91 92----[非关键数据].SizeOfImage dd 2000h ;93 94 | 95 96----内存中整个PE映像体的尺寸,它是所有头和节经过节对齐处理后的大小[关键数据].SizeOfHeaders dd code ;97 98 | 99 100---所有头+节表的大小,也就等于文件尺寸减去文件中所有节的尺寸,可以以此值作为PE文件第一节的文件偏移量[关键数据].CheckSum dd 0h ;101 102 | 103 104----[非关键数据].Subsystem dw 2 ;105 106----PE文件属子系统,2=Win32 GUI,3=Win32 Console[关键数据].DllCharacteristics dw 0 ;107 108----[非关键数据].SizeOfStackReserve1 dd 100000h ;109 110 | 111 112----[关键数据].SizeOfStackCommit1 dd 2000h ;113 114 | 115 116----[关键数据].SizeOfStackReserve2 dd 100000h ;117 118 | 119 120----[关键数据].SizeOfStackCommit2 dd 2000h ;121 122 | 123 124----[关键数据].LoaderFlags dd 0h ;125 126 | 127 128----[非关键数据].NumberOfRvaAndSizes dd 10h ;129 130 | 131 132----[关键数据]Data_Directories:.ExportRva dd 0h ;133 134 | 135 136----导出表虚拟偏移[非关键数据].ExportSize dd 0h ;137 138 | 139 140----导入表长度[非关键数据].ImportRva dd import+RVADIFF ;141 142 | 143 144----导入表虚拟偏移[关键数据].ImportSize dd code_end-import ;145 146 | 147 148----导入表长度[关键数据];导入表结构部分~这个地方需要仔细构造[尚未研究彻底];.misc_sectionz times 28 dd 0 ;其他部分~对于我们完全没用的.ResourceRva dd 0h ;资源表虚拟偏移[非关键数据].ResourceSize dd 0h ;资源表长度[非关键数据].ExceptionRva dd 0h ;没玩过这东东[非关键数据].ExceptionSize dd 0h ;没玩过这东东[非关键数据].CertificateRva dd 0h ;没玩过这东东[非关键数据].CertificateSize dd 0h ;没玩过这东东[非关键数据].BaseRelocationRva dd 0h ;基址重定位表虚拟偏移[非关键数据].BaseRelocationSize dd 0h ;基址重定位表长度[非关键数据].DebugRva dd 0h ;调试信息虚拟偏移[非关键数据].DebugSize dd 0h ;调试信息长度[非关键数据].DescriptionRva dd 0h ;没玩过这东东[非关键数据].DescriptionSize dd 0h ;没玩过这东东[非关键数据].MachineRva dd 0h ;没玩过这东东[非关键数据].MachineSize dd 0h ;没玩过这东东[非关键数据].TLSRva dd 0h ;线程处理数据[关键数据].TLSSize dd 0h ;线程处理数据长度[关键数据].LoadConfigRva dd 0h ;没玩过这东东[关键数据].LoadConfigSize dd 0h ;没玩过这东东[关键数据].BoundImportRva dd 0h ;绑定导入表数据[关键数据].BoundImportSize dd 0h ;绑定导入表数据长度[关键数据].IATRva dd 0h ;没玩过这东东[关键数据].IATSize dd 0h ;没玩过这东东[关键数据].DelayImportDescriptor1 dd 0h ;没玩过这东东[非关键数据].DelayImportDescriptor2 dd 0h ;没玩过这东东[非关键数据].COMRuntimeHeader1 dd 0h ;COM+ 时间连接库虚拟偏移地址[非关键数据].COMRuntimeHeader2 dd 0h ;COM+ 时间连接库长度[非关键数据].Reserved1 dd 0h ;这东东就真的没听说过了[非关键数据].Reserved2 dd 0h ;这东东就真的没听说过了[非关键数据];以上乃~~PE结构头部信息~请按照说明进行修改---谢谢我自己sections:.SectionName db ".Anskya",0.VirtualSize dd CODE_BASE ;虚拟体积.VirtualAddress dd CODE_BASE ;虚拟地址.SizeOfRawData dd code_end-code;数据体积.PointerToRawData dd code ;数据偏移.PointerToRelocations dd 0.PointerToLinenumbers dd 0.NumberOfRelocations dw 0.NumberOfLinenumbers dw 0.Characteristics dd 0E0000060h ;段属性...不用说了吧align 200h, DB 0 ;对齐0x200code: pushad sub eax,eax push eax ;0 push 00400105h ;把节名称压入堆栈 push 00400002h ;把MZ后面的个人信息压入堆栈 push eax ;MB_OK call [MessageBoxA] ;调用导入表地址 popad ret align 16, DB 0;以下导入表部分....仅仅为了演示就没有写导出表部分...具体参见<<软件加密技术内幕>>import dd 0 dd 0 dd -1 dd dll001+RVADIFF dd api001+RVADIFF times 5 dd 0 ;空处4*5个00的空位 dll001 db 'USER32.DLL',0 ;导入DLL名称api001 dd api101+RVADIFF ;计算导入表的内存地址 dd 0 api101 dw 0 db 'MessageBoxA',0 ;导入函数 MessageBoxA equ api001+reloc+4*0 ;函数地址声明...如有多余的函数请api00N+reloc+4*Ncode_end: |
相关代码见附件...
https://bbs.pediy.com/thread-28316.htm
编写自定义PE结构的程序(如何手写一个PE,高级编译器都是编译好的PE头部,例如MASM,TASM等,NASM,FASM是低级编译器.可以自定义结构)的更多相关文章
- 放弃antd table,基于React手写一个虚拟滚动的表格
缘起 标题有点夸张,并不是完全放弃antd-table,毕竟在react的生态圈里,对国人来说,比较好用的PC端组件库,也就antd了.即便经历了2018年圣诞彩蛋事件,antd的使用者也不仅不减,反 ...
- 只会用就out了,手写一个符合规范的Promise
Promise是什么 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息.Prom ...
- 手把手教你手写一个最简单的 Spring Boot Starter
欢迎关注微信公众号:「Java之言」技术文章持续更新,请持续关注...... 第一时间学习最新技术文章 领取最新技术学习资料视频 最新互联网资讯和面试经验 何为 Starter ? 想必大家都使用过 ...
- 手写一个springboot starter
springboot的starter的作用就是自动装配.将配置类自动装配好放入ioc容器里.作为一个组件,提供给springboot的程序使用. 今天手写一个starter.功能很简单,调用start ...
- 看年薪50W的架构师如何手写一个SpringMVC框架
前言 做 Java Web 开发的你,一定听说过SpringMVC的大名,作为现在运用最广泛的Java框架,它到目前为止依然保持着强大的活力和广泛的用户群. 本文介绍如何用eclipse一步一步搭建S ...
- 摊牌了!我要手写一个“Spring Boot”
目前的话,已经把 Spring MVC 相关常用的注解比如@GetMapping .@PostMapping .@PathVariable 写完了.我也已经将项目开源出来了,地址:https://gi ...
- 浅析MyBatis(二):手写一个自己的MyBatis简单框架
在上一篇文章中,我们由一个快速案例剖析了 MyBatis 的整体架构与整体运行流程,在本篇文章中笔者会根据 MyBatis 的运行流程手写一个自定义 MyBatis 简单框架,在实践中加深对 MyBa ...
- 『练手』手写一个独立Json算法 JsonHelper
背景: > 一直使用 Newtonsoft.Json.dll 也算挺稳定的. > 但这个框架也挺闹心的: > 1.影响编译失败:https://www.cnblogs.com/zih ...
- 教你如何使用Java手写一个基于链表的队列
在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...
随机推荐
- 算法复习——半平面交(bzoj2618凸多边形)
讲解: 这里套用wuvin神犇的ppt,附上友情链接:http://blog.leanote.com/wuvin 半平面交: 算法流程: 注意事项: 例题: Description 逆时针给出n个凸多 ...
- Aragorn's Story(hdu3966)
题意:给一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路径上的所有点权值加上K D C1 C2 K:把C1与C2的路径上的所有点权值减去K Q C:查询节点编号为C ...
- linux的crontab定时任务命令
linux的crontab定时任务命令 cron是一个linux下的定时执行工具. 启动.停止.重启.重新载入配置/sbin/service crond start|stop|restart|relo ...
- centos7 搭建hadoop
参考文档:http://blog.csdn.net/xiaoxiangzi222/article/details/52757168 https://waylau.com/centos-7-instal ...
- ci框架——修改分页的显示样式
修改ci框架分页的显示样式 用过ci框架的都知道,ci框架自带的分页样式是1,2下一页,在最开始刷新页面现实的时候如果页面不够多的话,那么首页和末页是不显的,这是ci框架的一个缺点, 这个时候需要我们 ...
- win10+Linux18.04双系统安装
给好多可爱的妹子重装了那么多次电脑,懒得码过程,因为我一般每次都要查一查...这次来个综合版吧,超简单,无脑操作. 首先说一下我的电脑Thinkpad + 500G 硬盘 (2014年买的老电脑) 首 ...
- #ifdef #endif #if #endif
c语言里所有以#开头的都是预编译指令,就是在正式编译之前,让编译器做一些预处理的工作. #ifdef DEBUG printf("variable x has value = %d\n&qu ...
- avi视频文件提取与合并
最近在做一个avi视频文件的提取与合并,花了几天熟悉avi文件格式.制作了一个提取与合并的动态库,不过仅限于提取视频,视频的合并还没添加一些额外判断,可能导致不同分辨率的视频文件合成后不能播放.欢迎大 ...
- Codeforces #471
C(分段) 题意: 分析: 我们分别考虑p=2和p>=3的情况 当p=2的时候,个数明显是[L,R]内完全平方数的个数 当p>=3的时候,我们注意到这样的数字个数是1e6级别的,且a最多也 ...
- 电音中DJ/Producer/MC/EDM/Remix/Mix的名词解释(转)
DJ DJ是Disc Jockey的缩写,是电音圈子里的一种热门职业,一般大家在夜店或者酒吧看到的站在台上甩着膀子拧着按钮或者使劲儿搓碟的就是DJ啦. DJ的主要工作一般就是在现场用打碟机和混音台把许 ...