您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系统,更加深入,也是作者的慢慢成长史。换专业确实挺难的,逆向分析也是块硬骨头,但我也试试,看看自己未来四年究竟能将它学到什么程度,漫漫长征路,偏向虎山行。享受过程,一起加油~

系统安全系列作者将深入研究恶意样本分析、逆向分析、攻防实战和Windows漏洞利用等,通过在线笔记和实践操作的形式分享与博友们学习,希望能与您一起进步。前文作者普及了逆向分析基础知识,告诉大家如何学好逆向分析,并给出吕布传游戏逆向案例。这篇文章将详细讲解IDA Pro反汇编工具的基础用法,并简单讲解一个EXE逆向工程解密实战方法,希望您喜欢。

话不多说,让我们开始新的征程吧!您的点赞、评论、收藏将是对我最大的支持,感恩安全路上一路前行,如果有写得不好的地方,可以联系我修改。基础性文章,希望对您有所帮助,作者的目的是与安全人共同进步,加油~

文章目录

  • 一.IDA Pro工具简介及初识
    • 1.IDA Pro简介
    • 2.IDA Pro新建工程
  • 二.IDA Pro工具基本用法
    • IDA View窗口
    • Hex View窗口
    • Strings窗口
    • 文件类型
  • 三.IDA Pro逆向工程实战
    • 1.代码加密
    • 2.逆向解密
  • 四.总结

作者的github资源:

  • 系统安全:https://github.com/eastmountyxz/SystemSecurity-ReverseAnalysis
  • 网络安全:https://github.com/eastmountyxz/NetworkSecuritySelf-study

前文分析:

  • [系统安全] 一.什么是逆向分析、逆向分析基础及经典扫雷游戏逆向
  • [系统安全] 二.如何学好逆向分析及吕布传游戏逆向案例
  • [系统安全] 三.IDA Pro反汇编工具初识及逆向工程解密实战

声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。(参考文献见后)


一.IDA Pro工具简介及初识

1.IDA Pro简介

IDA Pro(Interactive Disassembler Professional)简称“IDA”,是Hex-Rays公司出品的一款交互式反汇编工具,是目前最棒的一个静态反编译软件,为众多0day世界的成员和ShellCode安全分析人士不可缺少的利器。IDA Pro具有强大的功能,但操作较为复杂,需要储备很多知识,同时,它具有交互式、可编程、可扩展、多处理器等特点,可以通过Windows或Linux、MacOS平台来分析程序, 被公认为最好的逆向工程利器之一。

IDA Pro已经成为分析敌意代码的标准并让其自身迅速成为攻击研究领域的重要工具。它支持数十种CPU指令集其中包括Intel x86、x64、MIPS、PowerPC、ARM、Z80、68000、c8051等等。


2.IDA Pro新建工程

IDA Pro是点击下一步傻瓜式安装,安装成功会后会显示两个运行程序“IDA Pro(32bit)”和“IDA Pro(64bit)”,分别对应32位和64位程序的分析。IDA支持常见的PE格式,DOS、UNIX、Mac、Java、.NET等平台的文件格式。

下面讲解首次打开IDA Pro的流程。

第一步:打开IDA Pro32软件

双击exe文件弹出如下图所示的“Support message”界面,点击OK按钮。

第二步:新建一个文件

IDA包括三种加载文件的方式,其中“New”是新建打开一个标准文件的对话框,“GO”是运行打开一个空白工作,用户将要分析的文件拖入分析,“Previous”是选择最近一次使用过的文件。

第三步:选择一个exe文件载入,它将是我们要进行分析的程序

作者通过C语言写了一段代码,并在本地生成一个“test01.exe”文件,它就是接下来分析的可执行文件。

#include<stdio.h>
int main()
{printf("Hello World!!!\n");return 0;
}

选择要导入的文件。

第四步:装载PE文件
在“Load a new file”窗口中选择装载PE文件,包括text(代码块)、data(数据块)、rsrc(资源块)、idata(输入表)和edata(输出表)等,也可以载入二进制文件。

IDA反汇编包括两个阶段,首先将程序的代码和数据分开,分别标记函数并分析参数调用、跳转、指令关系等;接着如果IDA能识别文件的编译类型,就装载对应的编译器特征文件,给各函数赋名。同时,IDA会创建一个数据库,其组件分别保存在“.id0”、“.id1”、“.nam”和“.til”的文件里。

接着弹出确认窗口,可以选择“Don’t show this message again”选项。

第五步:在“Check for Hex-Rays product updates”中点击“OK”
在接下来弹出的Hex-Rays信息框再点击OK后,会要求设置更新选项,这里直接点击OK,默认即可。

第六步:显示运行结果
此时,运行结果如下图所示,接着可以开始我们的逆向分析。

IDA View显示如下图所示:

Hex View十六进制显示如下图所示:

下图可以看到代码中的“hello world!!!\n”。

第七步:查看源代码
按下F5能够查看对应的源代码。

第八步:关闭IDA Pro并保存数据库文件
保存IDB数据库文件至本地,它记录了用IDA Pro对该程序分析中的工作状态,包括反汇编分析、区段扫描、用户自定义结构、用户自定义名称、注释等信息。点击右上角的关闭按钮,弹出IDA Pro保存数据库窗口(Save Database),使用默认选项,直接点击OK即可以保存生成数据库(.idb)文件。

下次载入时,可以直接加载数据库文件,获取之前分析的状态。


二.IDA Pro工具基本用法

IDA Pro工具打开的主界面如下图所示:

IDA View窗口

该窗口显示如下图所示:

它是通过点击“View”中“Open subviews”->“Disaassembly”调出来的。

IDA View包括两种浏览模式,一种是Text View,一种是Graph View,右键能够相互跳转。

如下图所示,变换成另一种模式。

IDA View主要包括三个区域:

  • 地址区: PE文件加载到内存后的虚地址为准,镜像地址+偏移地址,如0x00401000
  • OpCode操作区: 该部分默认因此,需要Options->General->设置Number of opcode bytes为8显示出来,它是16进制数
  • 反编译代码区: IDA主功能区域,能高亮显示,双击函数或变量名能跳转对应的地址。


Hex View窗口

显示16进制,默认为只读状态,可以用快捷键F2对数据区域(绿色字符区域)在只读和编辑两种状态切换。

Strings窗口

IDA的View有几个按钮对定位代码很重要,如下图所示:

  • Open exports window 打开导出窗口
  • Open import window 打开导入窗口
  • Open names window 函数和参数的命名列表
  • Open functions window 程序调用的所有函数窗口
  • Open strings window 打开字符串显示窗口

这里作者点击Strings显示程序中所有字符串,该窗口有助于你通过程序的运行输出逆向找出对应的代码片断,如下图的字符串及对应的Address。

双击String跳转IAD View页面,如下图所示的地址,单击会高亮。

其他窗口:

  • 导出/入窗口:导出窗口列出文件的入口点,导入窗口列出由被分析的二进制文件导入的所有函数
  • 函数窗口:函数名称,区域,起始位置,长度,描述函数的标记
  • 结构体窗口:分析数据结构,双击数据结构名称展开,查看详细布局
  • 枚举窗口:enums可列举,定义枚举类型
  • 段窗口 segmentation:段的简单列表

文件类型

IDA会创建一个数据库,名为IDB文件,它由四个文件组成。

  • id0:二叉树形式的数据库
  • id1:程序字节标识
  • nam:Named窗口的索引信息
  • til:给定数据库的本地类型定义的相关信息


三.IDA Pro逆向工程实战

1.代码加密

前面第一篇 博客 讲解音乐文件通常采用异或加密,接下来作者通过C语言简单编写了一段加密代码,如下所示:

#include<stdio.h>
#include<string.h>int main()
{int i;int len;char key[20];char res[20];char *num = "eastmount";     //密钥 char *right = "123456789";   //正确值 //请输入正确的密码printf("please input the key:");scanf("%s", &key);//判断len = strlen(key);if(len<6 || len>10) {printf("Error, The length of the key is 6~10\n");} else {//加密for(i=0; i<len; i++) {res[i] = (key[i]^num[i]); //异或加密 }     //printf("%s\n", res);if(strcmp(res, right)==0) {printf("You are right, Success.\n");} else {printf("Error, please input the right key.\n");}}return 0;
}

输入长度不在6-10之间反馈错误“Error, The length of the key is 6~10”,输入错误反馈“Error, please input the right key.”,正确的key才显示正确信息“You are right, Success.”。

接下来我们通过IDA Pro工具解密这个EXE文件,尝试获取Key值。


2.逆向解密

第一步:按照第一部分步骤向IDA Pro中导入文件
显示的调用程序如下图所示。

树形图把条件分支清晰地显示出来了,左下角有IDA视图的缩略图。在上面点击可以快速定位到视图的指定位置,并且各个部分都有详细的代码信息 ,比如定义的两个变量及偏移位置。

第二步:查看字符串显示窗口
IDA Pro工具中菜单栏的View有几个按钮对定位代码很重要,如下图所示:

  • Open exports window 打开导出窗口
  • Open import window 打开导入窗口
  • Open names window 函数和参数的命名列表
  • Open functions window 程序调用的所有函数窗口
  • Open strings window 打开字符串显示窗口

这里作者点击Strings显示程序中所有字符串,该窗口有助于你通过程序的运行输出逆向找出对应的代码片断,如下图的字符串及对应的Address。

双击String跳转到如下图所示的地址,单击会高亮。

第三步:查看源代码
在如下图所示界面中按下F5键可以显示源代码。

显示的源代码如下所示:

int __cdecl main(int argc, const char **argv, const char **envp)
{char Str1[32]; // [esp+38h] [ebp-50h]char Str[40]; // [esp+58h] [ebp-30h]int v6; // [esp+80h] [ebp-8h]int i; // [esp+84h] [ebp-4h]__main();printf("please input the key:");scanf("%s", Str);v6 = strlen(Str);if ( v6 > 5 && v6 <= 10 ){for ( i = 0; i < v6; ++i )Str1[i] = gcc2_compiled_[i] ^ Str[i];if ( !strcmp(Str1, "123456789") )printf("You are right, Success.\n");elseprintf("Error, please input the right key.\n");}else{printf("Error, The length of the key is 6~10\n");}return 0;
}

注意,该部分代码与之前写的C语言代码略有不同,比如之前判断长度 if(len<6 || len>10) 提示错误,而这里是 if ( v6 > 5 && v6 <= 10 ) 正确执行,else显示错误。

这段代码的基本逻辑是输入字符串Str,然后循环与gcc2_compiled_变量异或加密,输出为Str1变量,当加密后的Str1变量值为“123456789”则解密成功,否则失败。
那么,gcc2_compiled_变量的值是多少呢?

第四步:定位核心代码
接着选中gcc2_compiled_变量,当它变高亮双击之后会跳转到对应的页面。

原来如此,它的密钥是“eastmount”,加密结果是“123456789”。

第五步:逆向解密
最后撰写解密代码,实现逆向解密,“eastmount” 异或输入代码Str,并且值等于123456789,则可以成功显示。

#include<stdio.h>
#include<string.h>int main()
{int i;int len;char res[9];char *num = "eastmount";     //密钥 char *right = "123456789";   //正确值 //判断 TS@@XYBVMlen = strlen(num);for(i=0; i<len; i++) {res[i] = (right[i]^num[i]); //异或加密}res[i] = 0;printf("The right key is: %s\n", res);return 0;
}

解密结果如下图所示:

注意,IDA Pro本地 创建的文件如下图所示。


四.总结

写到这里,这篇基础性文章就叙述完毕,安全要学习的知识真的很多,涉及面很广,包括汇编、网络、操作系统、加密解密、C/C++、Python等。希望自己能慢慢进步,科研与实践并重,也希望读者喜欢这系列总结笔记。不喜勿喷,与你同行~

三年前你在敦煌日出前写下“璋娜”,而今天我写了封情书作为礼物,三张薄纸,道不出无数思恋。武汉美,武大更美,但我知道此行的目的,是来求知,来充电的,吾家有女初成长,早日学成团聚才是我的归属。深夜写的博客,记录今天IDA Pro学习心得,一起加油。

今天刚好CSDN粉丝破十万,真心感谢大家这些年来的陪伴和支持,感恩认识您,也希望未来能继续分享更高质量的文章,帮助更多人入门和解决为题,寓教于乐,共勉!

2020年8月18新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,真诚邀请您的关注!谢谢。

(By:Eastmount 2020-12-17 星期四 晚上10点写于武汉 https://blog.csdn.net/Eastmoun)


[系统安全] 三.IDA Pro反汇编工具初识及逆向工程解密实战相关推荐

  1. ida pro 反汇编 Android so 库后修改 arm 汇编指令的方法总结

    1 前言 最近博主在学习Android逆向的时候,参照吾爱破解论坛的<教我兄弟学Android逆向系列课程>学习的时候,学到第8章<教我兄弟学Android逆向08 IDA爆破签名验 ...

  2. IDA pro逆向工具寻找socket server的IP和port

    在逆向分析代码的时候,我们有时需要找到某软件做服务端时提供的ip:port. 使用IDA pro反编译代码,找到套接字设置的代码处,发现我们期待的IP和port的地方是数字 这时我们该怎么办呢? 第一 ...

  3. IDA-逆向分析-工具教程-IDA简介-反汇编工具-功能窗口

    文章目录 1.IDA简介 2.逆向与反汇编工具 2.1.文件识别工具 2.2.PE Tools 2.3.PEiD 3.IDA 窗口 3.1.二进制加载器 3.2.创建数据库 3.3.反汇编窗口 3.4 ...

  4. IDA Pro 反汇编窗口基本操作

    反汇编窗口也叫IDA-View窗口. 反汇编窗口有两种显示格式:默认的基于图形的视图,面向文本的列表视图. 在打开的反汇编窗口中,可以使用空格键在图形视图与列表视图之间切换. 图形视图将一个函数分解成 ...

  5. [系统安全] 三十五.Procmon工具基本用法及文件进程、注册表查看

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  6. 利用开源工具搭一套汉英翻译系统(三):语言模型工具SRILM

    语言模型工具选择使用SRILM.存在其他选择KenLM, IRSTLM. 下载地址:http://www.speech.sri.com/projects/srilm/download.html ,需要 ...

  7. [系统安全] 三十一.恶意代码检测(1)恶意代码攻击溯源及恶意样本分析

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  8. [系统安全] 三十三.恶意代码检测(3)基于机器学习的恶意代码检测技术

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  9. CTF逆向-IDA Pro攻防世界Hello CTF

    文章目录 前言 Hello CTF IDA反汇编 Flag值计算 总结 前言 交互式反汇编器专业版(Interactive Disassembler Professional),人们常称其为 IDA ...

最新文章

  1. 软件工程基础-结对项目-WordCount(单词计数)
  2. 测试Rockey 4 Smart加密锁的C语言代码
  3. 想宅家学习但实力不允许?9本书,揭秘学霸是如何养成的​
  4. C++:构造函数的重载
  5. Linux 命令(4)—— declare/typeset 命令(builtin)
  6. 记录大三第一次面试经历
  7. 现代通信原理4.2:随机过程
  8. 无线蹭网工具奶瓶Beini使用教程
  9. sqlmap基本命令
  10. 关于js的match用法
  11. “女人~,你在玩火”一个有磁性的声音说道——常用自动化测试工具
  12. 【机器学习】推荐几款很流行的面向 Javascript 的机器学习库
  13. 巨头集体跨界,老玩家悄然出圈,谁在争夺6亿电竞用户?
  14. IM3、IIP3、OIP3、G、P1dB指标之间的关系
  15. 新进入一个研发团队,或者项目组要做什么?
  16. 一摞烙饼的排序(搜索树)
  17. 2017年暑期全国高校教师 “Python编程及应用”培训班通知
  18. android触摸震动原理
  19. Unreal4 后期处理材质
  20. 百度网盘如何取消自动登录

热门文章

  1. Java面试题 synchronized底层实现原理?它与lock相比有什么优缺点?
  2. Java微服务(四)【idea配置本地maven】【中文idea版本】(手把手编写,超级详细)
  3. Oracle 11g 新特性简介
  4. [翻译]你或许还未听说过的一些ASP.NET 2.0要诀
  5. 浏览器工作原理(四):浏览器事件解读
  6. python学习之自习语法(20180626_update)
  7. MySQL dump文件导入
  8. EasyRTSPClient:基于live555封装的支持重连的RTSP客户端RTSPClient
  9. 机器学习笔记——K-means
  10. 示例:工具提示对象---享元模式应用