IDA Pro 初步实践
实践1
背景
某软件A,在非全屏显示时带有常规菜单,在全屏下没有常规菜单,但是有顶部工具条,工具条上有菜单和按钮。对于全屏和非全屏的切换可以通过菜单,也可以通过快捷键ctrl + alt + enter进行。
需求
需要将菜单和工具条去除,同时将切换全屏/非全屏快捷键修改为ctrl + alt + shift。
调研
当拿到这个需求的时候,直观上感觉需要逆向,大概也知道一些逆行工具,比如IDA Pro、OllyDbg、x64dbg之类的,经过调研得知:
- IDA Pro:PE文件静态分析工具,也可以进行调试;
- OllyDbg:只能调试32位进程;
- x64dbg:调试64位进程;
- x32dbg:调试32位进程。
IDA Pro
IDA Pro 是一款功能强大的反汇编和反编译软件,由意大利公司 Hex-Rays 开发。它主要用于分析和理解应用程序的代码和逻辑,支持多种平台和架构,包括 Windows、Linux、macOS、ARM、x86 等。IDA Pro 在反向工程和安全研究领域被广泛应用,常用于恶意软件分析、漏洞分析、软件开发、操作系统内核分析等方面。
主要功能包括:
- 反汇编功能:将目标程序的机器代码转换为可读性更高的汇编代码,帮助用户分析程序的代码结构和逻辑。
- 反编译功能:通过 Hex-Rays Decompiler 插件,将汇编代码转换为类似 C 语言的高级语言代码,使代码更易于理解和分析。
- 调试功能:支持与多种调试器集成,用户可以在程序运行时查看变量、堆栈、寄存器等信息,并设置断点、单步执行等。
- 插件支持:用户可以通过插件扩展 IDA Pro 的功能,例如自动化分析、生成脚本等。
- 数据库功能:生成和维护程序的数据库,存储函数、变量、注释等信息,便于快速访问和分析。
- 跨平台支持:支持多种操作系统和架构,用户可以在不同平台上使用 IDA Pro 进行反汇编和反编译工作。
应用场景:
• 逆向工程:分析二进制文件,了解程序的工作原理和逻辑。
• 恶意软件分析:通过反汇编和调试,分析可疑文件的行为和潜在威胁。
• 漏洞挖掘:发现程序中的安全漏洞和潜在风险。
• 软件开发:帮助开发者调试和分析编译后的二进制文件。
解决过程
观察这个软件的安装目录,发现有很多QT的Dll,用IDA打开该软件后观察导入表Imports和函数调用,发现确实UI是用QT做的。

- 去除常规菜单
QT菜单相关的函数有:
// 创建菜单栏
QMenuBar *menuBar = new QMenuBar(this);
QMenu *fileMenu = menuBar->addMenu("&File");
// 添加菜单项
QAction *newAction = fileMenu->addAction("&New");
QAction *openAction = fileMenu->addAction("&Open");
// 获取主窗口的菜单
QMebuBar* menuBar = QMainWindow::menuBar()
于是在反汇编中查找上述相关函数,找到如下代码:
xt:000000014xxxxE89 call cs:__imp_?menuBar@QMainWindow@@QEBAPEAVQMenuBar@@XZ ; QMainWindow::menuBar(void) // 返回主窗口的菜单menuBar,返回值放入RAX
.text:000000014xxxxE8F mov rdi, rax // 再将menuBar放入rdi
.text:000000014xxxxE92 lea rbx, [rbp+130h+var_40]
.text:000000014xxxxE99 nop dword ptr [rax+00000000h]
.text:000000014xxxxEA0
.text:000000014xxxxEA0 loc_14xxxxEA0: ; CODE XREF: sub_14xxxx4B0+A0A↓j
.text:000000014xxxxEA0 mov rdx, [rbx] // rdx存放的是addMenu函数参数
.text:000000014xxxxEA3 mov rcx, rdi // rcx存放的是menuBar,即下面函数调用的this指针(x64应用程序在传参的时候,this指针使用rcx传递)
.text:000000014xxxxEA6 call cs:__imp_?addMenu@QMenuBar@@QEAAPEAVQAction@@PEAVQMenu@@@Z ; QMenuBar::addMenu(QMenu *)
.text:000000014xxxxEAC add rbx, 8
.text:000000014xxxxEB0 lea rax, [rbp+130h+var_28]
.text:000000014xxxxEB7 cmp rbx, rax
.text:000000014xxxxEBA jnz short loc_14xxxxEA0
.text:000000014xxxxEBC mov rdx, rdi
.text:000000014xxxxEBF mov rcx, r14
.text:000000014xxxxEC2 call cs:__imp_?setMenuBar@QMainWindow@@QEAAXPEAVQMenuBar@@@Z ; QMainWindow::setMenuBar(QMenuBar *)
基于以上代码,将addMenu函数替换为nop(nop对应的硬编码是0x90),call指令有6个字节:

修改后,通过菜单Edit->Patch Program->Patched bytes 写入原文件,运行后菜单确实去掉了,但副作用是快捷键ctrl + atl + enter 也不生效了。
- 去除顶部工具条
从外观观察来看,工具条应该是一个QWidget,与菜单不同,QWidget可以调用hide、move、resize、setGeometry等函数让UI呈现出消失的效果。
尝试hide
实际上是去除对show函数的调用,也找到了对这个函数的调用,但是副作用也是全屏状态下快捷键生效,这个情况是无法接收的,因为非全屏下的快捷键虽然也失效了,但是仍然可以用鼠标最大化后变为全屏,而全屏状态下没有快捷键的情况下是无法用鼠标恢复的,所以这一方式不可行。尝试resize
找到了对这个函数调用,如下:

如果所示:对这个工具条QWidget先调用了move(QPoint const&)又调用了resize(QSize const&),
于是很容易想到,将resize函数的参数置为0,这样部件就不可见了!
因此两个函数调用是挨着的,两个rcx都是同一个对象的this指针,因为要让部件不可见,所以我们已经不关心move函数了。
将lea rdx, [rsp+38h+arg_8] 通过修改字节,将其修改为lea rdx, [rsp+38h+arg_10],此时rdx存放的就是QSize对象的地址了,即resize函数的参数地址,然后将move替换为nop,再将xxxx2E9E3地址处的字节码改为48 C7 02 00 00 00 00 ,对应的汇编代码为(为什么不直接修改为汇编代码是因为IDA提示不让修改,只能修改bytes):
mov qword ptr [rdx], 0
这样就将resize函数的QSize对象修改为了一个尺寸为0的对象,然后运行后发现还是不行!
分析后得知QWidget之前调用了setSizePolicy函数来限制最小尺寸,宽度为0显然不合法,所以先去掉了对setSizePolicy的调用。
至此还是不行,工具条仍然有一部分可见,看起来可见的部分应该不是QWidget的一部分。
- 尝试move
还是基于上图,move和resize两个函数的调用挨着,这就是一个天然的便利条件!
于是尝试将resize函数修改为move函数,修改的时候有点巧,按照如下凡是修改后就变成了move函数的地址:

然后按照前面的方法,将QPoint参数的x坐标置为-1000,移动到一个不可见的位置。
地址xxxx2E9E3处的汇编代码通过修改bytes变成:
lea rdx, [rsp+38h+arg_8] // 保持不变
mov dword ptr[rdx+4], 0FFFFC18h
这样工具条就隐藏了,快捷键也没有收到影响。
快捷键
非全屏下的快捷键的问题,通过spy++找到窗口类名,结合窗口标题起一个后台进程用FindWindow函数找到窗口句柄,向其发送SC_MAXIMIZE消息最大化(实际是全屏),当切换为非全屏时向窗口发送模拟键盘ctrl + alt + enter按下和弹起。修改界面字符串
这个比较简单,只要修改后的字符串长度不超过原字符串,修改的方式就很简单,用shift + F12让IDA列出所有字符串,然后ctrl + F找到修改的字符串,找到其调用的地方,然后修改bytes即可。
2. 实践2
背景
某软件B在某个情况下无法正常使用,会弹出一个提示框,点击确定后退出。
需求
破解这种情况。
思路
- 弹框可能是MessageBox函数
- 退出时可能是exit、TerminateProcess、ExitProcess之类的
- 找到弹框和退出的地方,将其去掉调用
问题
- IDA 静态分析的时候是不会包含动态加载的DLL
- 如果进程的检测逻辑(MessageBox和退出)不在exe中怎么办?
- 启动调试的时候,是否会显示dll的反汇编代码?
- 隐式加载和显式加载的dll,如果启动exe调试是否会显示其反汇编代码?
最后
该实践没有验证完就不需要验证了,所以没有继续。
IDA Pro 初步实践的更多相关文章
- 计算机病毒实践汇总六:IDA Pro基础
在尝试学习分析的过程中,判断结论不一定准确,只是一些我自己的思考和探索.敬请批评指正! 1. IDA使用 (1)搜索.下载并执行IDA Pro,对可执行程序lab05-01.dll进行装载,分别以图形 ...
- Official VirusTotal Plugin for IDA Pro 7
Official VirusTotal Plugin for IDA Pro 7 该插件在IDA Pro右键菜单(反汇编和字符串窗口)中添加了一个新的" VirusTotal"条目 ...
- IDA,IDA PRO 产品介绍
IDA理念这是我们在开发产品时竭尽全力遵循的理念--在此过程中,我们相信我们将开发出能够为您带来所需的可靠性.便利性和易用性的软件.没有什么能打败人脑因为我们知道一秒钟的洞察力仍然胜过百年的处理时间, ...
- 安卓动态调试七种武器之孔雀翎 – Ida Pro
安卓动态调试七种武器之孔雀翎 – Ida Pro 作者:蒸米@阿里聚安全 0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的.另外工具是死的,人是 ...
- Ubuntu下安装IDA pro
预备 由于IDA pro只能装在32位环境下,如果是64位Ubuntu,需要运行如下命令安装32位的必备库. sudo dpkg --add-architecture i386 sudo apt-ge ...
- How to create an anonymous IDA PRO database (.IDB)
Source: http://www.0xebfe.net/blog/2013/01/13/how-to-create-an-anonymous-ida-pro-database-dot-idb/ P ...
- android调试系列--使用ida pro调试so
1.工具介绍 IDA pro: 反汇编神器,可静态分析和动态调试. 模拟机或者真机:运行要调试的程序. 样本:阿里安全挑战赛第二题:http://pan.baidu.com/s/1eS9EXIM 2. ...
- android调试系列--使用ida pro调试原生程序
1.工具介绍 IDA pro: 反汇编神器,可静态分析和动态调试. 模拟机或者真机:运行要调试的程序. 样本:自己编写NDK demo程序进行调试 2.前期准备 2.1 准备样本程序(假设已经配置好 ...
- [转]How to create an anonymous IDA PRO database (.IDB)
Source: http://www.0xebfe.net/blog/2013/01/13/how-to-create-an-anonymous-ida-pro-database-dot-idb/ P ...
- IDA Pro使用技巧
DA Pro基本简介 IDA加载完程序后,3个立即可见的窗口分别为IDA-View,Named,和消息输出窗口(output Window). IDA图形视图会有执行流,Yes箭头默认为绿色,No箭头 ...
随机推荐
- 一篇复杂的研究🤔A Comprehensive Study of 😨Jailbreak Attack versus Defense for Large Language Models
本认为,这篇文章的亮点在于对攻击和防御技术的多维评估,另外通过比较不同模型(如Vicuna.LLama和GPT-3.5 Turbo)对攻击和防御策略的反应,文章提供了对模型间差异的深入理解. 对现有的 ...
- 大型IM工程重构实践:企业微信Android端的重构之路
本文由腾讯技术yeconglu分享,原题"企业微信大型Android系统重构之路",下文进行了排版和内容优化等. 1.引言 企业微信本地部署版(下文简称为本地版)是从2017年起, ...
- 开源即时通讯IM框架 MobileIMSDK v6.3 发布
一.更新内容简介 本次更新为次要版本更新,进行了若干优化(更新历史详见:码云 Release Nodes).可能是市面上唯一同时支持 UDP+TCP+WebSocket 三种协议的同类开源IM框架. ...
- Docker简易操作
Docker简易操作 1.启动docker sudo docker run [OPTIONS] IMAGE [COMMAND] [ARG...] sudo docker run -d -p 8009: ...
- 万字图文:SaaS业务架构、价值流、业务能力、业务流程、业务对象、组织架构
大家好,我是汤师爷~ 本文为读者提供一个SaaS业务架构的系统性框架,探讨业务架构分析的核心要素,帮助SaaS企业深入剖析目标客户的业务模式,全面理解他们的业务架构. 无论你是SaaS创业者.产品经理 ...
- Elasticsearch应用介绍
Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Luce ...
- ORACLE存储过程,函数,包,游标
1. PL/SQL语句块PL/SQL语句块只适用于Oracle数据库,使用时临时保存在客户端,而不是保存在数据库.基本语法: declare 变量声明.初始化 begin 业务处理.逻辑代码 exc ...
- RocketMQ -- offset管理
正文首先来明确一下 Offset 的含义, RocketMQ 中, 一 种类型的消息会放到 一 个 Topic 里,为了能够并行, 一般一个 Topic 会有多个 Message Queue (也可以 ...
- http 协议请求响应模型
http 协议请求响应模型(一次请求生命周期或简单的软件分层) 场景: 登录 1.客户端发起请求到api接口层 1.1用户在客户端填写用户名和密码,点击登录,发送请求. 2.api接收到客户端发起的用 ...
- HashMap的put方法的扩容流程
final Node<K,V>[] resize() { // [1,2,3,4,5,6,7,8,9,10,11,,,,] Node<K,V>[] oldTab = table ...