admin管理员组文章数量:1516870
32位汇编常见指令
1)32位的汇编:核心针对x8632位处理器,常用指令按功能可归纳为:数据传输类(MOV 目的,源/PUSH源/POP目的/LEA目的,源),算术运算类(ADD 目的,源/SUB目的,源/MUL源/IMUL源/DIV源/IDIV源/INC操作数/DEC操作数),逻辑运算类(AND 目的,源/OR目的,源/XOR目的,源/NOT操作数/SHL目的,计数值/SHR目的,计数值),控制转移类(JMP 目标/JZ/JE目标/JNZ/JNE目标/CMP操作数1, 操作数2/CALL目标/RET),栈操作类(PUSHAD/POPAD),所有指令均基于32位寄存器(EAX/EBX/ECX等)和32位内存地址操作。
2)32位的工具ollydgb32.exe
ollydgb32.exe是针对32位x86架构程序的经典动态调试工具,支持32位汇编指令级调试、内存/寄存器实时查看修改,断点设置,指令单步执行,常用于32位汇编程序调试,逆向分析及漏洞挖掘,可直接加载32位可执行文件并解析对应的汇编指令执行流程。
3)32位的寄存器,内存,以及堆栈
寄存器:通用寄存器(EAX/EBX/ECX/EDX/ESI/EDI/EBP/ESP),还有段寄存器,标志寄存器,用于高速暂存和处理数据,访问速度远快于内存。
内存:以32位地址总线寻址,地址范围0~0xFFFFFFFF,按字节/字/双字为单位存储数据,是程序数据的核心存储区域。
堆栈:本质就是内存,用来存储临时变量,函数传递等,遵循先进后出原则,是32位程序运行时的关键存储区域栈顶。
ESP:32位栈顶指针寄存器,始终指向堆栈当前最顶端的位置,压栈 (ESP-4),出栈 (ESP+4) 时自动修改其值栈底。
EBP:32位栈基址指针寄存器,指向当前栈帧的底部,用于定位栈内函数参数,局部变量,是栈帧操作的基准地址。
!!!咱们把Windows下面所有汇编过一遍哦,因为后面要带着各位继续深入,很多地方咱们要用到汇编语言,如破解,逆向,代码还原,pwn,花指令,壳,免杀,二进制的漏洞分析/漏洞利用exp编写,提权,驱动开发,嵌入式开发等等。其他的安卓,苹果dylib/deb/arm,固件分析等空了再上!!!
4)案例
案例寄存器操作od随便打开一个exe程序实验就行观察eax,ax,ah,al变化:
MOV EAX,12345678
MOV AX,9999
MOV AH,88
MOV AL,66
案例内存操作od随便打开一个exe程序实验就行:
读取内存的值
MOV EAX,DWORD PTR DS:[4B011B]
MOV EAX,0x4B011B
写入eax值到内存中(写入前咱们把EAX寄存器修改为123,内存查看内容变化)
MOV DWORD PTR DS:[4B011F],EAX
MOV DWORD PTR DS:[4B011F],123
获取内存编号4B41DF
LEA EAX,DWORD PTR DS:[4B011F]
LEA EAX,DWORD PTR DS:[esp+8]
or
LEA EAX,[ESP+8]
案例堆栈操作od随便打开一个exe程序实验就行:
入栈/压栈都行
push 12345678
push eax
出栈/吐栈都行
pop ecx
pop edx
变形操作
mov eax,12345678
push eax
|
mov eax,12345678
mov dword ptr ds:[esp],eax
lea esp,dword ptr ss:[esp-4]
变形操作
mov eax,12345678
push eax
pop ecx
|
mov eax,12345678
mov ecx,dword ptr ss:[esp]
lea esp,dword ptr ss:[esp+4]
同样入栈
mov eax,12345678
lea edi,dword ptr ss:[esp]
stos dword ptr es:[edi]
重复3次入栈
mov eax,12345678
lea edi,dword ptr ss:[esp]
mov ecx,3
rep stos dword ptr es:[edi]
案例JCC操作od随便打开一个exe程序实验就行:
; 20=20,条件成立,跳转
MOV EAX, 20
CMP EAX, 20
JE 00401013
;10≠20,条件成立,跳转
MOV EAX, 10
CMP EAX, 20
JNE 00401013
;20≤20,条件成立,跳转
MOV EAX, 20
CMP EAX, 20
JLE 00401013
案例逆向od查看入栈,出栈变化以及返回结果
int add(int a, int b)
{
return a + b;
}
; 函数入口地址:00C81770
00C81770 > 55 PUSH EBP ; 保存旧的EBP(栈基址指针)到栈中,栈顶ESP -= 4
00C81771 8BEC MOV EBP,ESP ; 将ESP的值赋给EBP,建立新的栈帧,此时EBP指向旧EBP的位置
00C81773 81EC C0000000 SUB ESP,0C0 ; 栈顶ESP -= 0xC0(192字节),为函数局部变量分配栈空间
00C81779 53 PUSH EBX ; 保存EBX寄存器到栈中,ESP -= 4(遵循函数调用约定,保护非易失寄存器)
00C8177A 56 PUSH ESI ; 保存ESI寄存器到栈中,ESP -= 4
00C8177B 57 PUSH EDI ; 保存EDI寄存器到栈中,ESP -= 4
00C8177C 8BFD MOV EDI,EBP ; 将EBP的值赋给EDI,EDI作为内存填充的目标地址
00C8177E 33C9 XOR ECX,ECX ; ECX寄存器清零(异或自身),作为REP指令的计数器
00C81780 B8 CCCCCCCC MOV EAX,CCCCCCCC ; 将0xCCCCCCCC(调试模式下的填充值)加载到EAX
00C81785 F3:AB REP STOS DWORD PTR ES:[EDI] ; 重复执行:将EAX的值写入EDI指向的内存,EDI += 4,ECX -= 1,直到ECX=0
&
版权声明:本文标题:32位汇编进阶:掌握Swf播放的秘密技巧 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.betaflare.com/biancheng/1771284135a3263763.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。


发表评论