逆向汇编与反汇编——汇编基础快速入门

article/2025/10/11 17:39:09

一、常用32位寄存器介绍 

 不同位数的寄存器的名称: 

eax:累加寄存器。通常用于算数运算,将结果保留在eax当中,当然也可以用于其他用途,比如一般把返回值通过eax传递出去。

ebx:基址寄存器 。有点类似于ebp,代表基础地址,加上偏移量可以得到新的地址

ecx:计数寄存器。用来存储循环的次数,同时也常用于保存this指针。每循环一次,ecx-1

edx:数据寄存器。通常配合eax来使用。例如上面的mov ebx,10 ;div ebx ;由于除数ebx是32位,所以被除数是64位的(高32:edx,低32:eax)

将数据从原地址转移到目的地址

使用REPE MOVSB(move string byte)实现字符串复制:

MOV ESI, source_address    ; 将源字符串的起始地址加载到ESI
MOV EDI, destination_address   ; 将目标字符串的起始地址加载到EDI
MOV ECX, length      ; 将字符串的长度加载到ECXREPE MOVSB    ; 从源字符串复制数据到目标字符串,重复ECX次

 使用REPE STOSB(store string byte)实现固定字符串填充:

MOV EDI, destination_address   ; 将目标字符串的起始地址加载到EDI
MOV AL, value    ; 将要填充的值加载到AL寄存器
MOV ECX, length      ; 将字符串的长度加载到ECXREPE STOSB    ; 将值填充到目标字符串,重复ECX次

ebp与esp结合使用

因为esp经常变化,所以把esp保存在ebp这里

eip就是下一次要执行的指令的地址

其中最重要的就是ZF 

直接寻址:读写变量

int x = 10;
00BF1836  mov         dword ptr [x],0Ah  

寄存器寻址:指针解引用 

int* p = &x;
00EC1836  lea         eax,[x]  
00EC1839  mov         dword ptr [p],eax  

寄存器相对寻址:访问数组和结构体

访问数组:

int arr[4] = { 1,2,3,4 };
005C1825  mov         dword ptr [ebp-20h],1  
005C182C  mov         dword ptr [ebp-1Ch],2  
005C1833  mov         dword ptr [ebp-18h],3  
005C183A  mov         dword ptr [ebp-14h],4  

 访问结构体:

Student st;st.age = 10;
001C48E5  mov         dword ptr [ebp-0Ch],0Ah  st.agender = 1;
001C48EC  mov         byte ptr [ebp-8],1  st.score = 100;
001C48F0  mov         eax,64h  
001C48F5  mov         word ptr [ebp-6],ax 

Linux常用AT&T ,Windows使用intel格式

lea取地址指令

比如:lea dword ptr ds:[0xAAAAAAAA]

mov eax,10+3        (×)        mov eax,13        (√)

TEST将A和B做逻辑与,和AND的区别:TEST 不改变A的值

比如:AND eax,ebx ->会把eax与ebx做与运算,并把结果赋值给eax

而TEST eax,ebx则不会赋值给eax,而只是会影响标志位

test eax,eax 》会影响ZF标志位

JZ 0x123

CMP eax,0 (eax-0也是只影响ZF标志位)

JZ 0x123

条件跳转:JNZ JA等等

无条件跳转:JMP

NEG:0-操作数

NOT:逻辑取反(真->反)

1)movzx和movsx指令介绍

凡是带mov的指令都是用于数据传输:

mov在使用的过程当中,他的两边的操作数的位数应该是一样的

而movzx/movsx要求右边宽度必须小于左边

要求:操作数1是寄存器,op2是寄存器或者内存,不能是立即数

movzx eax,byte ptr [0x123] 》

高位没有使用的部分全部用0填充

这就非常类似数据类型之间的转换,比如char -> int类型

在od里面双击寄存器可以直接修改它的值

movsx eax,cx当中eax的高位全部使用符号位(0/1)来填充,比如:

mov ecx,0x00000088

movsx eax,cx

》结果就是eax=0xffffff88

总结一下:movzx直接不管九九八十一,最高位全部填0,而movsx则根据cx的最高位,把eax的高位全部填上符号位(0/1)

2)Test指令介绍

1.Test用来测试一个位,例如寄存器:

test eax,100b;b后缀意为二进制

jnz 0x1234;如果eax右数第三个位为1,jnz将会跳转

我是这样想的,jnz跳转的条件是ZF=0,ZF=0意味着ZF(零标志)没被置位,即逻辑与结果为1。

2.Test的一个非常普遍的用法是用来测试一方寄存器是否为空:

test ecx, ecx

jz somewhere

如果ecx为零,设置ZF零标志为1,jz跳转。

二、C++函数入口深度剖析

int argc(argument count) ,char*argv[](argument varable) 

函数调用栈:kernel32 -> mainCRTStartup -> main

CRT:C Run Time:C运行库

获取操作系统版本,在控制台程序是在命令行运行的

netstat -ano 可以加上一个命令行参数

环境变量,有变量名和值

为什么输入cmd可以进入shell执行程序呢?

》因为环境变量,执行程序会在当前环境变量当中去找/系统路径去找,如果找到了就会执行

环境变量%temp%就会打开他的值所指示的路径

把获取到的参数的数量保存在argc,把每一个参数的首地址保存在argv这个数组里面

setenvp把环境变量的地址分别保存

cinit初始化全局变量,静态变量,就比如类的构造函数执行之前他的静态成员就已经存在了

main实际push了三个参数,其中环境变量这个参数是不需要程序员来进行操作的,所以由运行库来给他填充进来就可以了

一个函数的返回值是放在eax当中的

最终main的底层是调用exit函数来进行退出的

 如何使用反汇编工具识别main函数?

将exe拖入od,main在cinit后面

od如何安装插件? 

ida使用:

debug版本有调试的信息,release发行版不包含调试信息,所以无法在VS里面调试,即使打了断点也直接就运行完了

start才是程序执行的入口

不用连接服务器获取调试信息

保存数据库就保存了一个MAIN.idb的数据库文件,如果我们自己修改了程序的内容,他就会保存在这个文件里面,下次直接打开这个就好,而不会破坏源文件,当然也可以直接保存到原文件


http://chatgpt.dhexx.cn/article/3tWmvRGK.shtml

相关文章

汇编语言(四)——编程语法入门

目录 0.第一个汇编程序 1.语言常量 (1)整数常量 (2)实数常量 (3)字符常量 2.保留字 3.标识符 4.伪指令 5.指令 (1)标号 (2) 指令助记符 (3&#…

汇编语言轻松入门

​通常说的学习编程其实就是学习高级语言编程,比如C语言、C语言、Python语言、JAVA语言等等,即那些为人类设计的计算机语言。 但是,我们的计算机它并不理解什么是高级语言,计算机只是一个机器,它只有电气的特性&#…

汇编入门(一)

汇编入门(一) 1.第一个汇编程序 目前利用的是keil软件,建立文件时扩展名一定要为asm 如何查看具体地址存储器中的值: 在工具栏上选择“VIEW”>“memory windows”>“memory1” 然后输入地址即可: 注意这里…

汇编语言入门--调试工具debug的使用(史上最全,11种常见命令)

汇编语言入门–调试工具debug的使用(史上最全,11种常见命令) 1.直接启动debug程序 详见:https://bingshuai.blog.csdn.net/article/details/119978461 2.检查和修改寄存器内容命令R 检查 -r 修改 这里用AX来举例: -…

汇编语言入门(二)

汇编语言入门(一) 文章目录 寄存器【内存访问】内存中字的存储DS和【address】字的传送mov、add、sub指令数据段栈栈顶越界的问题PUSH和POP指令栈的综述栈段【栈的综述】 寄存器【内存访问】 内存中字的存储 4E20是两个字节构成一个字。 上图中0地址单…

汇编语言学习入门+亲自实操+图形并茂

汇编器 汇编器是将汇编语言转化为机器码的程序。或许你会以为汇编转化到机器码没什么大不了的,毕竟几乎是一对一的转换。但nasm存在的意义在于它可以很好的适应多种处理器平台,让编写汇编这件事都变得可移植了。nasm可以在Ubuntu下汇编,使用…

ARM 汇编语言入门

[翻译]二进制漏洞利用(二)ARM32位汇编下的TCP Bind shell:https://bbs.pediy.com/thread-253511.htm ARM汇编语言入门 From:ARM汇编语言入门(一):https://zhuanlan.zhihu.com/p/109057983 原文地址:https://azeria-labs.com/writi…

基础汇编语言编程

目录 什么是汇编语言? 工程搭建 新建工程 环境设置 测试是否成功 正式学习汇编语言 数据处理指令 填充,加,减,乘 思考:我们可以看到R0寄存器可以存放8位十六进制数,那么0x12345678能不能用mov存入&am…

汇编入门学习

学自狂神:最通俗易懂的计算机底层教学,二进制到汇编学习! 1、概述 学习路线: 语言 进制 进制如何运算 二进制 数据宽度 有符号数和无符号数 原码反码补码 位运算 位运算计算 汇编 寄存器 内存 汇编指令 内存复制 …

【学习笔记】汇编语言入门

汇编语言入门 概述 指令格式(最多包含4个区段):各区段之间用规定的分隔符分开 [标号:] 操作码 [操作数] [;注释]标号区段(当前指令行的符号地址)操作码区段(指令的操作行为,由操作…

关于汇编语言入门的几个案例

哈喽,大家好呀~这篇呢我们来看看汇编语言的几个入门小案例。 🥇个人主页:个人主页 🥈系列专栏:日常解决的问题 🥉与这篇汇编相关的文章: …

什么是汇编语言

汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号&#…

汇编语言系列教程之基础入门 (一)

汇编语言系列教程之基础入门 (一) http://www.cnblogs.com/flyor/p/7208948.html 机器字长 机器字长是指CPU一次运算所能处理的数据的位数,一般来说这个数的和CPU的通用寄存器长度、数据总线的宽度等相等,在8086中为16bit。由于历…

快速入门汇编语言

这篇是我在先后学习了《汇编原理》、《CSAPP》第三章和《x86 data sheet》,以及经历了大量google后写出的总结性文档,用于自查和复习。若能有所助益,不胜荣幸。如有错漏,烦请不吝赐教。 1. 从C到汇编 在初学C语言时,…

汇编语言(一)

一、编程语言 1)机器语言 机器语言是机器指令的集合。在计算机中是一串0、1二进制数,计算机转变为高低电平,器件受到震动,进行运算。由于硬件设计和内部结构的不同,需要不同的电平脉冲来控制使它工作,所以…

汇编语言程序设计入门

前言:公号 「编程有料」后台回复 “大礼包” 即可获取近1000本助力你编程之路的电子书 汇编语言程序设计 一,汇编语言程序设计概述1,程序设计语言2,汇编语言源程序3,汇编语言程序开发过程 二,汇编语言基本语…

手把手教你学习汇编语言——从入门到起飞

专接本交流群:1051749714 (有什么问题欢迎进群讨论) 关于这篇博客,笔者会尽量用最简单的方式教会大家汇编语言以便应付各种考试 有什么不足的忘大佬评论或私信指出。 汇编环境安装 汇编运行调试 汇编指令 希望大家看完这些找一些…

小白的入门之——汇编语言程序设计教程

目录 第一章 基础知识 1.1汇编语言的特点 1.2计算机中数据表示的特点 【BCD码表示法(Binary Coded Decimal)】 【定点数】 —原码表示法— —反码表示法— —补码表示法— 浮点数 1.3 ​​​​​​计算机的数据存储 寄存器 存储器 数据在主…

汇编入门基础

1.什么是汇编语言? 汇编语言就是低级语言,直接描述/控制 CPU 的运行,我们知道,CPU 只负责计算,本身不具备智能。你输入一条指令(instruction),它就运行一次,然后停下来&…

汇编语言入门教程

一、汇编语言是什么 ​ 汇编语言是二进制指令(操作码)的文本形式,与指令是一一对应的关系。比如加法指令00000011写成汇编语言就是ADD 二、前置知识——寄存器 ​ 1、寄存器不依靠地址区分,而依靠名称,CPU通过名字去…