编写自定义PE结构的程序

PE文件结构简述 简述: PE文件结构分为五个部分: DOS文件头 DOS加载模块 PE文件头 区段表 区段 PE文件中显示的所有地址基本都是RVA,倘若想要换算成VA一般需要加上基地址ImageBase与文件偏移地址RVA。 虚拟地址(VA=virtual address):每个32位PE文件被加载到内存的时候都会被分配4GB的虚拟内存,虚拟地址等于“程序的相对虚拟地址+基地址”。 相对虚拟地址(RVA=relatively virtual address):相对虚拟地址是相比较于文件开头的地 阅读详情
一般高级编译器都是编译好的PE头部,例如MASM,TASM等
一直都说NASM,FASM是低级编译器.可以自定义结构
但是苦于无人发布相关文章说明..我这里就简单的用NASM写一下
由于刚学PE结构许多东西都不太懂希望个位大侠指点
如何打造一个迷你的PE结构..我暂只只能作到617字节
下面随着学习的深入...还有更迷你的PE出现...

代码可以直接编译..
编译参数:nasmw -fbin MsgBoxA.asm -o MsgBoxA.exe

请下载最新的NASM for Win32编译器
当前最新版本:NASM 0.98.39

代码:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;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            ;对齐0x200

code:
  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*N

code_end:
关于PE病毒编写的学习(六)——关于PE文件结构操作的程序编写   对PE文件结构的各个值定义和作用,这里不提了,网上资源很多,百度一下就好了。所以,本章只说一下,作为代码编写者对PE文件结构操作的方法和技巧。还是通过改进代码,来体会一下吧。  你应该记得前面的BOOL IsPEFile(HANDLE hFIle) 这个函数吧,它的作用是判断文件是否为PE格式文件。它把文件句柄作为参数,虽然许多函数需要文件句柄这个参数,但是作为对PE文件结构操作的函数,这样做是不恰当的,因为如果这样做就要频繁的使用SetFilePointer()、ReadFile()、WriteFil 阅读详情

相关推荐

PE文件结构

PE文件是Windows下可执行文件的总称,英文全称PortableExecutable可移植的可执行文件,常见的有exe、dll、sys、com、ocx对于了解(木马、免杀、病毒、外挂、内核),了解PE文件结构是非常有必要且非常重要的!代码段:可读可执行不可写数据段:可读可写不可执行资源段:可读不可执行不可写导入表(.idata):简称IAT表ImportAddressTable。

UE星空 1709

PE系统DIY-定制自己专属PE(附视频)

PE维护系统五花八门,层出不穷。某些pe系统自带后门,推广软件,插件,广告,很不利于长期稳定使用。因此,通过DIY某些相对可靠、成熟、纯净的PE系统,用于打造一个专属自己使用的PE维护系统。

u014588173的博客 2万+

【逆向工程】QT编写PE结构分析工具 附源码

最近连肝几日,把PE结构学了点毛皮,想自己编写一个PE结构的分析工具,这对理解PE格式和相关的PE编程还是大有脾益滴,因此就不使用微软的ImageHlp库提供的API了。 框架还是采用QT框架。 PE结构分析工具最终效果二级目录三级目录 最终效果 二级目录 三级目录 ...

L2510408497的博客 1661

如何制作一个自定义的winpe?

当我们想修改原ISO时我们可以使用wimTool工具,我们可以使用管理员身份打开wimtool。

a1309525802的博客 3310

DIYpe(自定义pe)

本教程是一个压缩包,里面讲解了如何自定义winpe

CMU动作捕捉数据集实战:从AMC文件到Python可视化的完整流程

本文提供了CMU动作捕捉数据集的完整实战指南,详细解析了AMC文件格式,并对比了MATLAB转换、Python原生解析及转换为BVH格式三种数据解析策略。重点介绍了如何构建Python数据处理与可视化管道,包括将数据转换为Pandas DataFrame、绘制时间序列与相关性热力图,以及实现3D骨架动画,帮助开发者高效利用这一经典动作捕获数据集进行运动分析与模型训练。

android的专栏 716

DIY自己的超级PE

利用雷电PE做框架,改造并自定义一个独属于自己,且稳定好用的PE #WINPE #windowspe

wanghanduo491的博客 1万+

FPGA图像处理之直方图均衡实现

直方图均衡的基本原理,就是对在图像中像素个数多的灰度值(即对画面起主要作用的灰度值)进行拉伸,而对像素个数较少的灰度值(即对画面不起主要作用的灰度值)进行合并,从而提高对比度,使图像清晰,达到增强的目的。综合以上两个条件,累积分布函数是个好的选择,因为累积分布函数是单调增函数(控制大小关系),并且值域是0到1(控制越界问题),所以直方图均衡化中使用的是累积分布函数。

FZWzsl的博客 1429

实验五——手工编写PE文件

【实验名称】 手工编写PE文件 【实验目的】 1.了解PE文件的概念、结构 2.熟悉PE编辑查看工具,详细了解PE文件格式 3.重点分析PE文件文件头、引入表、引出表,以及资源表 【实验原理】 1.PE文件概述 PE文件的全称是Portable Executable,意为可移植的可执行的文件,常见的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL) 2.PE文件结构 3.PE文件各部分描述 MS-DOS

Onlyone_1314的博客 8927

从采集到播放:RV1106+H264全链路开发避坑指南(含FFmpeg转码技巧)

本文详细解析了基于Rockchip RV1106芯片构建H.264视频从采集到播放全链路的开发实践。内容涵盖RKMPI框架设计、VI/VENC模块配置、内存泄漏排查及FFmpeg高效转码技巧,旨在帮助嵌入式开发者规避常见陷阱,实现稳定高效的低延迟视频处理流水线。

weixin_29189377的博客 662

鲸鱼优化算法(WOA)与门控循环单元(GRU)结合的预测模型(WOA-GRU)及其Python和MATLAB实现

Python和MATLAB的实现均突出模型结构和优化过程。2. **全局搜索与局部搜索结合**:WOA在寻优时,既有全局搜索的能力,又具备局部精准搜索的能力,能有效避免陷入局部最优解。2. **简化结构**:与长短期记忆(LSTM)相比,GRU的结构更为简化,避免了多层细胞结构,提高了计算效率。4. **使用WOA进行优化**:通过WOA迭代优化GRU模型中的参数,如学习率、批量大小和GRU单元的权重。3. **良好的表现**:GRU在多个时序数据序列的预测任务中表现优异,特别是在较短的数据序列中。

qq_45441438的博客 1326

创建自定义 Windows PE 映像的过程

一、准备 到微软下载AIK,并安装。我用的是6001.18000.080118-1840-kb3aik_cn.iso 二、创建自定义 Windows PE 映像的过程 0、使用copype.cmd创建本地 Windows PE 构建环境 copype.cmd x86 c:\winpe_x86 1、使用 ImageX 将基本映像 (Winpe.wim) 应用到本地共享目录。例如, ...

子曰小玖的博客 2273

vllm运行过程中出现cuda out of memory

将长序列分解为多个小块,每个块分别处理。这样可以减少单次 Prefill 的计算量和显存占用,从而优化 TTFT 和显存使用效率。考虑使用 CPU 卸载(如 --cpu-offload-gb),将部分缓存卸载到 CPU 内存中,扩展 GPU 的虚拟内存。在大语言模型中,当输入序列很长(例如超过 1024 个 Token)时,Prefill 阶段的计算量会非常大。最后增加了enable-chunked-prefill参数和max_num_batched_tokens解决了问题。参数来进一步优化性能。

盛世芳华 3518

PE结构、SEH相关知识学习笔记

原文:http://www.pediy.com/kssd/index.html-- 病毒技术 -- 病毒知识 -- Anti Virus专题 PE结构的学习 原文中用fasm自己构造了一个pe,这里贴一个用masm的,其实是使用WriteFile API将编写的PE数据写成文件~也没啥好说的,PE结构在这里没有仔细介绍,需要可以另外查询,剩下要说的的基本都在代码注释里了 参考:点...

angbagangzhe065140的博客 326

ubuntu18.04安装xenomai3.1(百分百成功版)

ubuntu18.04安装xenomai3.1(百分百成功版),保姆级教学!!!

h542812556sdu的博客 2065

Android系统编译之Communication error with Jack server (35), try ‘jack-diagnose‘ or see Jack server log

jack server failed场景个人分析网上分析分析1分析2原因1:权限问题原因2:端口占用原因3:删除 TLSv1, TLSv1.1测试结论解决方案说明相关链接 场景 在进行Android系统开发时,在liunx编译时发生问题,描述如下: ninja: build stopped: subcommand failed. build/core/ninja.mk:148: recipe for target 'ninja_wrapper' failed make: *** [ninja_wrapper

weixin_43194854的博客 2401

任意程序添加ShellCode

我先写了一个小程序Test.exe(注意:由于我用的是控制台程序没有导入user32.dll所以我用的直接添加ShellCode是不行的,要么在ShellCode中导入user32.dll要么在程序中Load一下,如果没有以下测试不成功)。 //Test.exe源代码#include <stdio.h> #include <windows.h> ...

365

24、汽车黑客技术全解析:诊断代码、车库创建与系统攻防

本文深入探讨了汽车黑客技术的核心内容,包括诊断代码模式与参数ID、创建开放车库社区、汽车系统相关技术、硬件与软件工具、攻击与防御手段,以及车辆通信与网络安全。无论你是汽车安全研究人员、爱好者还是开发者,都能从中获取全面的技术解析与实践指南。

Apple的专栏 229

PE文件结构详解精华(从头看下去就能大概了解PE文件结构了)

前言 此博客绝大部分内容来自云课堂武大慕课《软件安全-恶意代码机理与防护》。 内容提纲 PE文件及其表现形式 PE文件格式与恶意软件的关系 PE文件格式总体结构 代码节与数据节 引入函数节:PE文件的引入函数机制 引出函数节:DLL文件的函数引出机制 资源节:文件资源索引、定位与修改 重定位节:镜像地址改变后的地址自动修正 PE文件及其表现形式 可移植的可执行文件(PE,Portable...

雨化于画 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

PE结构 ---> 1. 什么是PE 什么是PE结构 什么是windows可执行程序结构

Windows PE文件结构解析 PE(Portable Executable)是Windows平台可执行文件的标准格式,包括.exe、.dll等文件类型。PE文件由DOS头、PE签名、COFF头、可选头、节表和实际数据区组成,每个部分都有严格定义的结构。关键结构包括:DOS头中的e_lfanew指向PE签名;COFF头定义文件基本属性;可选头包含入口点、基址等关键信息;节表描述各节区属性。PE文件通过这种层次化结构,使Windows加载器能准确识别代码、数据和所需资源的位置,确保程序正确加载执行。相比Li

盾悟 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

PE 文件型病毒编写实验(一)

这个学期终于圆了当年来读渣电的网络安全专业的一个梦:PE病毒编写。想起了高中那会儿熬夜看看雪论坛瞎搞什么软件破解,可是搞到后面很多东西不理解做的不深入,所以就先一本心思的考上渣电,然后再来深入的学习一下PE的相关。后面 渣电是考上啦,网络安全专业也考上啦,可是大一到大三虽然偶然零零星星地看了一些PE相关的东西,却一直没有集中化的时间来研究PE,因为总是有其它项目找上自己。这个学期刚好有计算机病毒这门

jmhIcoding 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

windows PE文件结构及其加载机制

1. 概述PE文件的全称是Portable Executable,意为可移植的可执行的文件,常见的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL)。它是1993年Windows NT系统引入的新可执行文件格式,到现在已经经过20多年了。虽然使用PE作为可执行文件格式的Windows操作系统已经更换了很多版本,其结构的变

liuyez123的博客 2万+
上一篇: Sfilter之Windows2000动态加载经验分享
下一篇: XML下载者
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值