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

news2024/12/22 23:09:25

一、常用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      ; 将字符串的长度加载到ECX

REPE MOVSB    ; 从源字符串复制数据到目标字符串,重复ECX次

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

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

REPE 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:逻辑取反(真->反)

二、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://www.coloradmin.cn/o/613049.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Go语言日志库logrus

Go语言日志库logrus 1、介绍 logrus logrus是目前Github上star数量最多的日志包,功能强大、性能高效、高度灵活,还提供了自定义插件的功能。很 多优秀的开源项目,例如:docker、prometheus等都使用了logrus。logrus除了具有日志…

VMware nat模式配置

使用nat模式,需要配置ip才能做到虚拟机与主机、外网正常通信 步骤 1 选择虚拟机设置,将网络连接改为nat模式 2 查看主机vmware network adpter vmnet8 打开控制面板。选择网络连接,右击vmnet8,打开属性 选择ip4,双击…

kubesphere插件,应用商店,应用仓库

应用商店 参考 步骤 以platform-admin角色的账号(admin)登录kubesphere点击右上角 “平台管理”点击“集群管理”点击 “自定义资源 CRD”搜索 clusterconfiguration点击 ClusterConfiguration点击 ks-installer 右侧的三个点,点击“编辑文件”在YAML 文件中&…

Linux进程间通信【匿名管道】

✨个人主页: 北 海 🎉所属专栏: Linux学习之旅 🎃操作环境: CentOS 7.6 阿里云远程服务器 文章目录 🌇前言🏙️正文1、进程间通信相关概念1.1、目的1.2、发展1.3、分类 2、什么是管道&#xff1…

Redi事务,数据持久化

4.其他数据功能 4.1pubsub发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis 客户端可以订阅任意数量的频道。 下面示例展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— c…

旧改周报--深圳7大项目获进展:中海、星河等主导

2023年第22周,深圳市共发布拆除重建类权利人核实公示1项,规划公告1项,规划修改(草案)公示2项,规划(修改)公告1项,实施主体公示1项,建设用地批复1项&#xff0…

win7安装visual studio 2015出现安装包丢失或损坏

winr 输入 certmgr.msc 查看有没有选中的两个证书,如果没有需要从其他电脑导入,然后直接点击安装界面重试,即可继续安装

【SpringMVC】RESTful案例

1、Rest风格 对于Rest风格,我们需要学习的内容包括: REST简介REST入门案例REST快速开发案例:基于RESTful页面数据交互 1. REST简介 REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格 当我们想表示…

优秀的测试开发应该具备的六大能力有哪些?

目录 前言 什么是测试开发工程师? 测试开发的六大能力 前言 从我工作中接触到的测试开发,以及面试测试开发候选人时问的问题,我将自己对测试开发这个岗位的理解,总结了如下六点能力。 我个人认为,具备如下六点能力…

数据结构之二叉树,实现二叉树的创建与遍历,以及二叉树的一些练习题

目录 目录 一、二叉树的创建与遍历 1.创建二叉树 构建出来的树如图: 2.二叉树的销毁 3.二叉树的前序遍历[Leetcode144.力扣] 4.二叉树的中序遍历 5.二叉树的后序遍历 二、二叉树的实现 1.获取树中节点的个数 2.获取叶子节点的个数 3.获取第K层节点的个数…

Redis实现分布式锁的原理:常见问题解析及解决方案、源码解析Redisson的使用

0、引言:分布式锁的引出 锁常常用于多线程并发的场景下保证数据的一致性,例如防止超卖、一人一单等场景需求 。通过加锁可以解决在单机情况下安全问题,但是在集群模式下就不行了。集群模式,即部署了多个服务器、并配置了负载均衡后…

记录使用Echarts-gl实现3D地图

一、前言 最近项目需要做个大屏展示的,开始做了第一版用户觉得地图太过于单调了,给我发了一个视频,让我参考着做。我看着视频上的地图旋转了方向、地图有标记、看着像是3D的(视频上的地图使用多个图层叠加起来、CSS样式做了旋转&…

Nginx网络服务——location规则与rewrite重写

Nginx网络服务——location规则与rewrite重写 一、Nginx中location与rewrite1.location与rewrite常用的正则表达式2. location与rewrite的联系和区别 二、location的匹配规则1.location 的匹配分类2.location 常用的匹配规则3.location 优先级4.location匹配规则优先通用的总结…

【知识图谱搭建到应用】--知识存储--04

文章目录 Mysqljenafuseki数据存储数据建模数据映射注意事项 py2neoneo4jPy2neo与Neo4j的版本问题Py2neo导入三元组数据批量导入csv文件 rdflib库 前面几篇在讲述骗理论的内容,本片主要描述如何将清洗过的结构化数据存储在转换成三元组并存储起来,并于后…

ChatGPT与软件架构(4) - 架构师提示工程指南

架构师可以通过各种类型的对话提示,提升驱动ChatGPT对话输出的质量,更好的利用AI能力辅助架构设计。原文: Software Architects’ Guide to Enhancing ChatGPT Interactions With Prompt Types Robert Stump Unsplash 前言 随着ChatGPT等人工智能语言模型…

12.数据结构之AVL树

前言 提到平衡二叉查找树,不得不提二叉查找树。二叉查找树,说简单点,其实就是将我们的数据节点,有序的维护为一个树形结构。这样我们查的时候,那么我们查找某个节点在不在集合中的时间复杂度实际上就是树的高度。如果…

华为OD机试真题 Java 实现【玩牌高手】【2023 B卷 100分】,附详细解题思路

一、题目描述 给定一个长度为n的整型数组,表示一个选手在n轮内可选择的牌面分数。选手基于规则选牌, 请计算所有轮结束后其可以获得的最高总分数。 选择规则如下: 在每轮里选手可以选择获取该轮牌面,则其总分数加上该轮牌面分…

python笔记 第二章 变量

系列文章目录 第一章 初识python 文章目录 2.1变量2.1.1变量的作用2.1.2定义变量标识符命名习惯使用变量 2.2 认识bugDebug工具Debug工具使用步骤: 2.3 数据类型 2.1变量 目标 变量的作用定义变量认识数据类型 2.1.1变量的作用 变量就是一个存储数据的的时候当前数据所在的…

Java基础——堆和栈、static关键字、静态变量和成员变量的区别

Java程序运行顺序:Java应用程序—虚拟机—操作系统—硬件 Java中栈内存用来存储局部变量和方法调用,堆内存用来存储Java中的对象,成员变量、局部变量、类变量指向的对象都存储在堆内存中。 static关键字: 随着类的加载而加载优先…

ISATAP隧道配置与验证

ISATAP隧道配置与验证 【实验目的】 熟悉IPv6ISATAP隧道的概念。 掌握IPv6和IPv4共存的实现方法。 掌握IPv6 ISATAP地址编址规则。 掌握IPv6 ISATAP隧道的配置。 验证配置。 【实验拓扑】 设备参数如下表所示。 设备 接口 IP地址 子网掩码 默认网关 R1 S0/0 192.…