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;#################### ...
ASM32 5 使用C库函数和调用对话框
使用C库函数示例代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354.386.model flat,stdcallOPTION CASEMAP:noneinclude msvcrt.incinclude kernel32.incincludelib user32.libincludelib kernel32.libincludelib msvcrt.lib;包含动态库;includelib libc.lib;包含静态库.constMY_STRING db "51asm51asm:%d",0dh,0ah,0MY_PAUSE db "pause",0;代码区.codemyadd proc retmyadd endpstrlen proto c:dwordprintf proto c:VARARGSTART proc ;C库的使用 c调用约定 local buf1[10]:byte local buf2[ ...
ASM32 4 masm32汇编环境配置和简单代码示例
masm32汇编环境配置下载并安装masm32打开http://www.masm32.com/download/masm32v11r.zip
下载masm32,并将压缩包解压,解压完成后,运行安装文件install.exe,具体安装步骤除了指定路径,就一路YES|OK就可以。
然后在这两处添加masm32中lib和include文件夹的地址
容易出现的问题可能在编译的时候出现错误:A2026 constant expected
解决方案:https://blog.csdn.net/weixin_50836014/article/details/124880063
代码示例12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394.386 ;指令集.model flat,stdcal ...
ASM32 3 宏汇编
宏汇编宏——具有宏名的一段汇编语句序列——宏定义时书写
宏指令——这段汇编语句序列的缩写——宏调用时书写
宏展开——宏指令处用这段宏代替的过程——宏汇编时实现
宏的功能强大,颇具特色
宏定义1234宏名 macro [形参表] 宏定义体 endm宏注释符 ;;
12345678910main MACRO ;定义名为main的宏,无参数 mov ax,@data ;;宏定义体 mov ds,ax ENDM ;;宏定义结束 return MACRO retnum ;;带有形参return mov al,retnum ;;宏定义中使用参数 mov ah,4ch int 21h ENDM
宏调用1宏名 [实参表]
1234start: main ;宏调用,建立DS内容 dispmsg string ;宏调用,显示字符串 return 0 ;宏调用,返回DOS end start
宏调用的实质是在汇编过程中进行宏展开
宏展开的具体过程是:当汇编程序扫描源程序遇到已有定义的宏调用时,即用相应的宏定义体取代源程序的指令,同时用位置匹配的实参对形参进行取代 ...
ASM32 2 简单的32位汇编程序
简单的32位汇编程序hello.inc
1234567891011121314151617181920.386 ;指令集.model flat,stdcall ;平坦模式(不分段)OPTION CASEMAP:none ;大小写敏感;常量区.constMY_MSG db "Hello World!",0MY_TITLE db "51asm",0;未初始化数据区;.data?;NUM2 db ? ;不占用文件空间;初始化数据区.dataNUM1 db 0;函数声明MessageBoxA proto hWnd:dword,lpText:dword,lpCaption:dword,uType:dwordExitProcess proto uExitCode:dword
hello.asm
1234567891011121314151617181920212223242526272829303132333435include hello.incincludelib user32.libincludelib ...
ASM32 1 配置asm32环境
基本运行环境打开VS2019,新建C++空项目
生成依赖项右键项目名称,依次选择生成依赖项、生成自定义
在弹出的窗口中勾选masm,点击确定
添加汇编源文件右键“源文件“文件夹,依次选择添加、新建项
在弹出的窗口中选择C++文件(.cpp),注意名称中的后缀名要改为.asm
右键源文件,选择属性,配置如下
至此汇编语言的基本运行环境配置完毕
添加Irvine32链接库Irvine32 链接库提供了很多简单的输入输岀接口,因此有必要添加Irvine32链接库,方便后续编程
下载并解压Irvine32 链接库文件下载地址Assembly Language for x86 Processors (asmirvine.com)
记住解压的路径,配置VS2019需要用到
配置VS2019右键项目,选择属性,打开属性页面板
选择“Microsoft Macro Assembler”→“General” ,在Include Paths一栏输入Irvine32文件解压的路径
选择“链接器”→“常规”→“附加库目录”,输入 Irvine32文件解压的路径
选择“链接器”→“输入”→ ...