【IDA疑难杂症修复】

news2024/9/22 5:37:41

我们在使用IDA进行逆向分析的时候,会遇到一些问题,这篇文章来带领大家学习IDA中疑难杂症的修复:函数大小限制,栈不平衡,switch无法识别(跳转表修复),ida Decompile as call。

一.函数大小限制

通常IDA反编译函数时会有大小限制,超过这个大小就会反编译失败,而这个大小是我们可以修改的。
修改方法:
打开IDA的安装目录,找到cfg文件夹下的hexray.cfg,搜索MAX_FUNCSIZE将64改为1024。

FUNCSIZE

二.堆栈平衡

如果函数堆栈不平衡,会导致IDA positive反编译出错。

网上关于这个问题的教程多数都是让调栈指针,然后怎么alt+k如何去修复,其实他们没有发现问题的本质,一旦稍微变化,就无法解决IDA重新反编译,这种问题应该对症下药。

总的来说思路就是:因为这种情况出现的原因时函数堆栈不平衡,这个时候就应该去检查函数中对栈进行操作的指令,并判断是否平衡

分析方法:

    1. 分析函数头函数尾,检查堆栈是否平衡
    1. 当函数头函数尾平衡时,我们分析函数内部对栈操作的指令,以及部分函数的调用约定是否识别正确(调用约定识别不正确也会破坏堆栈平衡)

三.switch无法识别(跳转表识别)

我们想要修复switch,必须先对switch case汇编进行分析,识别出这是switch case语句,之后再进行修复。

修复方法:
光标移动到switch语句的值的哪一行(通常是mov,eax eax),然后选择Edit->Other->Specify Switch idiom,这时候就会跳出来一个窗口,让我们修复switch语句。

参数填写:

  • Address Of jump table:跳转表的首地址
    Number of elements:跳转表的项数(这个学过C++汇编的同学肯定会识别),也就是switch中,除default的case个数
    Size of table element:跳转表每一项的字节数(一般就是从lea rax,da 0[rax*4]这条指令或者直接去跳转表查看得到,也有可能是其他固定值)
    Element base value:跳转表偏移的基地址,观察汇编得到偏移与跳转表的首地址相加,跳转表中的偏移时相对于跳转表首地址的,也有可能是其他固定值。
    Start of the idiom switch:switch语法的起始地址
    Input register of switch:switch(var)中的var对应的寄存器(该寄存器应该是switoidiom处的)
    Signed jump table elements:跳转表的元素是有符号的,因为有负数
    其他没有提到的选项,默认即可,再次按下F5反编译即可得到正确的结果。

四.ida Dwcompile as call

场景一:

强网杯某vm逆向
设想这样一种情况:在某个自定义的运行环境中,syscall
强网杯

上图的自定义环境中的rax的值作为syscall的调用符号,返回结果也是通过rax传递
默认情况下,ida认为此处的syscall不会修改rax的值,导致rax寄存器常量传播优化,最后得到的代码结果如下:
1
从上图中可以看出,ida会直接进行常量传播优化,那肯定时错的。

ida直接将某一条指令强行解释为函数调用,操作方法:

    1. 选中syscall指令
    1. 菜单->Edit->Other->Decompile as call
    1. 输入函数定义

场景二:
ida
由于两次fs:0读取,ida会认为两次读取结果一样,就只会保留一次结果,实际上,vm在每次读取fs:0的时候,修改fs:0,这就导致错误
错误的反编译结果如下:
错误
修改方法:将两次读取fs:0的指令用Decompile as call定义为:__int64 GetKey();不给参数,效果很好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/714088.html

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

相关文章

Redis学习(一)数据类型、Java中使用redis、缓存概念

文章目录 常用数据结构String类型Hash类型List类型Set类型SortedSet 类型 通用命令key的层级结构 Spring Data Redis快速入门RedisTemplate的序列化方式StringRedisTemplateRedisTemplate的Hash类型操作 实战操作短信登录发送验证码校验登录信息校验登录状态 商家查询缓存缓存更…

antdesignpro组件Upload传excel文件到后端flask的两种方案

(特别提醒:后端xlrd新版本不支持xlsx文件,所以暂用xls文件进行上传) 1.第一种方案:组件接收到excel文件,然后解析成list数据,解析是要用到XLSX( 安装插件:npm i xlsx --save impor…

【Leetcode】21.合并两个有序链表

一、题目 1、题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例1: 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]示例2: 输入:l1 = [], l2 = [] 输出:[]示例3: 输入:l1 = [], l2 = [0] 输…

Cesium 常用标绘线、面、矩形、圆、曲面、曲线、攻击箭头、钳击箭头,标绘与修改。

前言:直接放效果图,符合就往下看,不符合出门右转。 由于篇幅有限,只贴出各个标绘的关键代码。 1、线段 基于坐标点,加载不同的材质。 //动态加载 const entity this._viewer.entities.add({polyline: {positions: …

K8S网络管理

这里写目录标题 1 网络管理1.1Service1.1.1 网络体系1.1.2 工作模型1.1.3 SVC实践1.1.4 IPVS实践 1.2 其他资源1.2.1 域名服务1.2.2 CoreDNS1.2.3 无头服务 1.3 flannel方案1.3.1 网络方案1.3.2 flannel1.3.3 主机网络 1 网络管理 1.1Service 1.1.1 网络体系 学习目标 这一…

Shell脚本 中运行sudo命令

在shell脚本中有时需要使用sudo进行提权,运行包含这类脚本的文件时通常需要我们在终端输入sudo密码,但是在一些无人值守的应用中显然就不太适合了。本文通过构建一个多用户的ubuntu操作环境,来展示脚本中需要使用sudo命令时的应用场景。 我们…

基于vue3+vite+ts,使用nexus发布组件库

1、前提条件 已部署nexus3,可参考: Ubuntu部署和体验Nexus3-腾讯云开发者社区-腾讯云 代理设置: 【Nexus】通过Nexus搭建Npm私库_猫巳的博客-CSDN博客 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一…

Java --- springboot3之可观测性

目录 一、可观测性 二、定制健康监控的端点 三、定制metrics 四、整合PrometheusGrafana 一、可观测性 导入pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></d…

如何从PCB上直接启动Power DC直流压降仿真分析工具

如何从PCB上直接启动Power DC直流压降仿真分析工具 POWER DC的启动除了可以通过POWER DC.exe直接启动外,还可以直接通过Allegro的PCB界面直接启动,二者软件是支持关联的。如何启动,具体操作如下 用166或者172版本打开PCB点击File点击Change Edi

JVM源码剖析之JVM层面调用Java方法

先看以下2个案例。 Runnable runnable () -> {System.out.println(1); }; new Thread(runnable).start(); 为什么调用Thread的start方法就能执行Runnable的代码&#xff1f; public static void main(String[] args) {System.out.println(1); } 作为Java开发者&#x…

基于差速驱动移动基座的三维变型机器人轨迹优化

在执行任务时&#xff0c;服务机器人的功能结构变化可能会限制其自主导航能力&#xff0c;从而影响其行动力。本文的研究&#xff0c;旨在解决复杂三维环境中可变形机器人的轨迹规划问题&#xff0c;特别是应用最为广泛的基于差速驱动移动基座的移动机器人的轨迹规划。 这种全…

如何下载一个网站的全部网页文件 如何极速下载网页上的文件

许多网站上都有非常多的内容&#xff0c;一个个下载比较麻烦&#xff0c;那么我们如何下载一个网站的全部网页文件&#xff1f;我们可以使用下载软件抓取整个站点上检索出所有内容&#xff0c;然后通过过滤器选择自己需要的内容。如何极速下载网页上的文件&#xff1f;我们可以…

电脑-问题

如果使用了小米路由器&#xff0c;有望 但是平凡跳转到miwifi进行检查&#xff0c;或者显示证书问题 在浏览器设置里搜索dns&#xff0c;将 确定如何通过安全连接来连接到网站后面部分改成自定义&#xff1a; https://dns.alidns.com/dns-query 主要原因是&#xff1a; edge新…

C++图形开发(4):下落的小球

文章目录 1.小球自上而下依次出现2.下落的小球低配版3.下落的小球高配版 1.小球自上而下依次出现 首先&#xff0c;我们来使小球自上而下依次出现&#xff1a; 分析&#xff1a;要使小球自上而下依次出现&#xff0c;也就是指在一个小球出现之后让程序暂停一段时间&#xff0c…

基于单片机电子密码锁射频卡识别指纹门禁密码锁系统的设计与实现

功能介绍 通过指纹进行开锁或者是按键输入当前的密码&#xff0c;修改密码&#xff0c;对IC卡可以进行注册&#xff0c;删除。当有RFID卡进入到读卡器的读卡范围内时&#xff0c;则会自动读取卡序列号&#xff0c;单片机根据卡的序列号对卡进行判断。若该卡是有效卡&#xff0c…

【 SVG 】二、SVG 容器元素

一、本文概述 本文所介绍的 svg 中元素&#xff0c;通常不会直接作为直接展示元素&#xff0c;而是配合其他基础元素&#xff0c;以实现指定功能的图层组&#xff0c;本文围绕 svg 常用容器元素&#xff0c;进行实战应用&#xff1b; 二、 SVG 容器元素&#xff08;常用&#x…

「软件测试」最全面试问题和回答,全文背熟不拿下offer算我输

一般要应聘关于测试的工作&#xff0c;面试题会不会很难?下面小编整理了软件测试面试题及答案&#xff0c;欢迎参考! 一、引言 1.1 文档目的 本次文档是为了收集在面试中遇到的一问题与常见的一些答案并不是唯一答案 二、职业规划 2.1 简单的自我介绍下 面试宫&#xff…

层层剥开Transformer;Windows Copilot初版非常简陋

&#x1f989; AI新闻 &#x1f680; 微软Win11引入Windows Copilot功能&#xff0c;但初版非常简陋 摘要&#xff1a;微软在Win11 Build 23493预览版更新中引入了Windows Copilot功能&#xff0c;该功能在任务栏上新增了一个图标按钮。点击按钮后&#xff0c;屏幕右侧会跳出…

10_Activiti7

工作流(workflow)系统 具有工作流的系统,使用的专门的建模语言(BPMN)定义 通过计算机对业务流程自动化执行管理 使用传统方式实现 ​ 代码工作量大,若流程发生改变的话,编写 的代码也会发生响应的改变 工作流引擎 按照BPMN规范进行部署,将业务和节点的流程进行分离 没有…

oracle rowscn 简单记录

可以通过ROWSCN 侦测row是否有变化&#xff0c;但需要注意&#xff1a; 默认是一个block的scn 相同可以通过create table ROWDEPENDENCIES 在每行上记录无论哪种模式&#xff0c;ROW SCN是一个大致值&#xff0c;不是准确值 NOROWDEPENDENCIES | ROWDEPENDENCIES This claus…