PE3-18 在任意代码空白区添加代码
计算NewBuffer的大小可以通过最后一个节表的信息知道最后一个节表的偏移地址+ImageBase+节的大小,就是NewBuffer的大小
Work参考代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 ...
PE3-17 代码节空白区添加代码
硬编码:E8 和 E9 指令E8 和 E9 是 call 和 jmp 指令的操作码,后面跟的并不是直接的小端序地址。关键是如何计算跳转的地址。
call 例子:
12call 0x77E5425FE8 5F 42 E5 77 (这是错的)
jmp 例子:
12jmp 0x2345678E9 2B 2B 00 00
从这个例子可以看出,E8 和 E9 后面的地址不是直接的小端序转换。要理解如何生成这些字节,我们需要用一个公式来计算。
跳转地址的计算方式真正要跳转的地址 = E8 或 E9 指令的下一条指令的地址 + X
其中:
X = 真正要跳转的地址 - E8 或 E9 指令的下一条指令的地址
具体例子12345678func();00A825E1 E8 62 ED FF FF call func (0A81348h) return 0;00A825E6 33 C0 xor eax,eax 00A825E8 5F pop edi ...
PE3_16 FileBuffer->ImageBuffer
前面提到过,文件从硬盘加载到内存运行时会经过“拉伸”操作,那么在经过简单拉伸之后,程序是否就可以运行呢?答案是否定的。在完成基本拉伸操作后,程序还不能立即运行,还需要进行一些额外的处理。不过此时已经非常接近能够运行了。
Misc.VirtualSize 和 SizeOfRawData 的大小对比在内存中的节有一个 Misc.VirtualSize 属性,表示在内存中拉伸后的实际大小;而 SizeOfRawData 则表示文件在磁盘上的大小。
这两者的大小通常不同,因为内存中可能包含一些未初始化的数据,而这些数据不会在文件中实际保存,但在加载到内存时会被计算并为其预留空间。因此,通常情况下,Misc.VirtualSize 会大于 SizeOfRawData。
总结:
Misc.VirtualSize 是加载到内存中时的实际大小,且它是加载之前未对齐的大小。
SizeOfRawData 是磁盘文件中已对齐的数据大小。
拷贝文件内容到内存时,应该以两者中较小的数值为准。
如何算出内存中节存储的某个地址在文件中对应的地址举个例子,假设在某个节中有一个内存地址是 0x501234。
首 ...
PE3_13 节表
联合体1234union TestUnion { char x; int y;};
特点:
共享空间:联合体的所有成员共享同一内存空间。
内存大小:联合体的大小由最大成员的大小决定。例如,以上例子中,联合体的大小为4字节(int类型)。
有效性:联合体中最多只有一个成员是有效的,但仍然可以访问所有成员。
123456789union TestUnion { char x; int y;};union { char x; int y;} TestUnion;
节表(Section Table)节表是Windows PE/COFF格式可执行文件中的一个重要数据结构,记录了各个代码段、数据段、资源段、重定向表等在文件中的位置和大小信息。操作系统通过节表进行各个段的映射和初始化。
在执行PE文件时,Windows不会立即将整个文件读入内存,而是由PE装载器建立虚拟地址与PE文件之间的映射关系。只有当执行到某个内存页中的指令或访问页中的数据时,才会将该页面从磁盘加载到内存。这种机制极 ...
PE3_12 PE头字段说明
文件对齐与内存对齐程序最初存储在硬盘上,运行时需要加载到内存中。在加载过程中,文件的不同部分会进行重新排列和对齐,以便能够正确运行。视频中硬盘的对齐单位为0x200h,而内存中的对齐单位为0x1000h。这种对齐的差异导致文件在加载到内存中时需要进行“拉伸”处理,使文件能够符合内存的对齐要求,从而正确执行。
内核重载与虚拟地址程序一般从0x40000的虚拟地址开始执行,这个地址留给系统,增加了程序的安全性。虚拟地址由操作系统映射到实际的物理地址。
然后关于为什么程序一般从0x40000开始呢,视频里说是因为留出空间,如果访问这个内存就会报错,因为这是系统的空间,增加代码的安全性。
内核在加载程序时,会将程序的虚拟地址映射到实际的物理地址。常见的程序起始虚拟地址为0x40000,保留了前面的地址空间用于系统,这样当指针错误时不会访问系统关键区域。
部分PE结构解析:DOS头
WORD e_magic: 固定值为“MZ”,标识这是一个可执行文件。
DWORD e_lfanew: PE头相对于文件起始位置的偏移,用于定位PE头的位置。
标准PE头
WORD Machine: 表示运行该程 ...
PE3_11 PE头_解析手动
内存对齐在硬盘和内存中的程序数据可能会有所不同,原因是内存对齐。对齐的作用在于加快内存访问的速度。
文件在内存中的分节存储
程序文件在内存中被分为不同的段(sections)存储。
不同段之间通常有填充字节(例如0),但有些段可以被多个程序共享,以节省内存资源。
可以看到段与段之间有很多0填充,比如说数据段,但是有些段可以共用,比如多开程序,共享一个数据区域,节省内存
程序运行时的变化
从硬盘加载到内存时,程序会根据文件格式进行相应的布局变化。硬盘中的文件格式与内存中的程序结构并不完全相同,内存对齐会造成某些数据的拉伸和填充。
需要记住的关键结构
DOS头
MZ标志位(程序以“MZ”开头)
PE标识偏移(指向PE头的偏移)
标准PE头
PE标识位:PE\x00\x00
目标处理器类型(CPU类型)
区段数(Section数量)
选项头大小(Optional Header Size)
特征值(文件属性标志)
可选PE头
标志位
所有代码区块总大小
所有初始化数据区段总大小
所有未初始化区块总大小
程序入口点(OEP, Original Entry Point)
代 ...
ASM32 11 计算机
代码实现新建空白工程
在工程处新建菜单
打开Res文件夹
在文件名处输入MENU1后保存
选择确定
完成后资源处会增加菜单
点击打开菜单编辑器然后输入标题选择插入然后确定
插入成功后发现新建的菜单资源已成功写入
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990.386.model flat,stdcalloption casemap:noneinclude windows.incinclude user32.incinclude kernel32.incinclude gdi32.incincludelib user32.libincludelib kernel32.libincludelib gdi32.libIDR_MENU EQU 10000.constASM_MENU_NA ...
ASM32 9-10 反汇编代码和函数
反汇编代码根据CPU指令表找到对应的汇编代码
32位反汇编的默认操作数大小为32,若前面加了66前缀可以减小为16,即把eax改为ax;而如果加67可以前缀可以增大大小,但若本来就为eax则没有作用,反而可能使编译出错
示例
1234567896A 00 push 0E8 7C 00 00 00 call 81A3 00 30 40 00 mov dword ptr[00403000],eaxE8 B4 00 00 00 call b96A 00 push 068 EF 11 40 00 push 0x004011ef6A 00 push 06A 65 push 65FF 35 00 30 40 00 push dword ptr [00403000]
6A 00 — push 0
6A 是 push 指令的操作码,用于将一个字节大小的立即数压入堆栈。
00 是立即数,表示将 0 压入堆栈。
E8 7C 00 00 00 — call 81
E8 是 call 指令的操作码,用于调用一个相对的函数地址,地址是相对当前指令指针(EIP)的偏移。 ...
ASM32 7 DLL注入测试
代码示例MyTest.inc
1234567891011121314151617181920212223242526272829303132333435include windows.incinclude kernel32.incinclude user32.incinclude Comctl32.incinclude shell32.incinclude msvcrt.incinclude psapi.incincludelib kernel32.libincludelib user32.libincludelib Comctl32.libincludelib shell32.libincludelib msvcrt.libincludelib psapi.libDlgProc PROTO :HWND,:UINT,:WPARAM,:LPARAM.constMY_MSG db "click",0MY_WND_NAME db "计算机",0MY_USER32 db "USER32.dll",0MY_MSGBOX ...
ASM32 6 RadASM的使用
RadASM配置及应用RadASM配置参考 https://blog.csdn.net/2301_79113923/article/details/135665466
在路径设置中设置为自己的masm32和Ollydbg的路径
代码测试1
MyTest.inc1234567891011121314151617181920212223242526include windows.incinclude kernel32.incinclude user32.incinclude Comctl32.incinclude shell32.incincludelib kernel32.libincludelib user32.libincludelib Comctl32.libincludelib shell32.libDlgProc PROTO :HWND,:UINT,:WPARAM,:LPARAM.constMY_MSG db "click",0IDD_DIALOG1 equ 101BTN_BUTTON1 equ 1001;#################### ...