使用VC6.0创建一个新的控制台项目
编译为2个版本的调试和发布
您应该查看该程序的2个版本
IDA的较高版本可以直接位于功能入口。在正常情况下,我们需要首先调试并找到关键。找到关键点后,然后通过调试来设置API断点,读取和写入断点等,并找到程序的关键点。我们将逆转。从一开始到末尾,很少有功能从主函数逆转。通常,我们将阻止一个关键点,查看密钥函数,并查看如何处理密钥函数。因此,我们需要首先调试并与IDA打开。
IDA可以通过快捷键G输入地址,然后单击Enter,跳到地址,按ESC键返回原始地址
找函数入口
必须是ADI的低版本,并且更高版本将自动为您找到它
使用VS2019构建控制台程序
Release
单击第二个JMP,然后向下搜索以找到3个推动。以下是调用,这意味着呼叫是主函数。双击更改呼叫以查找主要功能
Debug
右键单击以选择代码视图
调试,然后有2个呼叫,第二个电话类似于JMP的发行版本
双击搜索
查找Mian功能主要需要关键点
通常,出口是主要功能
2个呼叫出口是主要功能
另一种方法是找到分支结构,分支结构的末端是
3推
快捷键n可以重命名功能名称
IDA的使用
IDA在调试版本和发行版本可执行文件之间有区别。通常,调试可执行文件可以识别符号,但是发行版本无法识别它们。IDB文件:IDA生成的文件,该文件存储注释和其他信息。 IDA has its own set of naming rules after analysis, as follows: Subprogram sub_address label: loc_label local variable: sub: subprogram loc: label arg: parameter lpMem: memory first address var: local variable byte and other types: global variable
IDA常用快捷键
Ctrl + \’+\’ — Expand code N — Modify the name, modify one place, and other places will also follow D — Modify the data type definition alt + d-添加数据类型定义C-解析A-通过ASCII字符串解析,如果您需要将其解析为其他类型的字符串,请在编辑字符串中设置; – 添加注释shift + f5(:View打开子视图签名):添加新签名- 右键单击\’应用新签名\’选择一个新的signature.sig文件
规避花指令
d and c keys cossorate
int main(int argc,char* argv []){int n=6; scanf(\’d\’,n); __asm {jnp next jp next _emit0xe9 //_emit等于db next:} printf(\’Hello World!D \\ n\’,n);返回0;} VC不支持DB
上面的代码显然表明它是不合理的。跳到+1位置,等同于指令的中间,因此必须有一个花教学。
选择401010按D键将解释作为数据
选择40101E并按C键,然后强制将其解释为代码。这等同于跳过代码10101D的线
代码解读
安全选项是防止溢出。它是主要功能{}。在返回地址之前,有一个类似于检查值的全局变量。它的值与线程ID,过程ID,内核号和系统时间有关。它进入函数后,其值就会立即设置。
IDA窗口
名称窗口d代表数据f代表函数i代表导入以a代表字符串41开始
IDA函数名称识别
通过IDA,您可以看到一些信息已识别,但是未识别某些信息
单击下面输入以下经验的人可以发现它是一个printf函数。没有经验的人可以通过IDA的签名函数自动识别它。
签名简介
IDA可以识别功能名称和参数以及其他信息。 IDA使用SIG文件来识别已知功能信息。安装IDA时,已将常用的库已放入SIG文件中,并将其放置在安装目录的SIG文件夹中。功能签名:SIG文件也成为签名文件:此功能可用于识别第三方提供的库功能,从而简化分析过程。以低频C库作为示例。
1. 低版本库函数实现位置:
以VC6.0为例:/VC98/lib
各种C库函数的实现,缩写规则:无缩写- 静态库原始版本D-调试调试版本I-此实现在动态链接库中,MSVCRT.DLL,在DLL MT -MT-多线程版本中实现,IDA版本可以添加了新的关键区域处理,添加了新的关键区域。
检查有多少个OBJ的链接选项可用于lib:link -lib /list libc.lib
注:如果在此之前调用主函数,则表示它是多线程的
2. link中 -lib链接选项
-LIB命令用于静态库版本,常用命令选项:列表:您可以查看指定的LIB中包含的OBJ。用例:link -lib /list libc.lib。提取:从指定的lib提取函数。用例:link -lib /extract:build \\ stel \\ st_obj \\ xxx.obj libc.lib(将提取并生成xxx.obj文件)。使用IDA打开libc.lib并找到printf的实现
(1)IDA签名手动制作
通过CMD提取obj
链接-lib视图对应命令
link -lib /list libc.lib查看libc.lib中的所有.OBJ信息
找到通往printf.obj的完整路径
链接-lib /extract:build \\ stel \\ st_obj \\ printf.obj libc.lib rectract obj file
与IDA打开printf.obj
它已转换为机器代码。 +标志意味着尚未显示。它通常显示5个字节或8个字节,具体取决于您的屏幕宽度。
将其更改为5个字节。要添加功能,您需要添加机器代码序列,并且与地址无关。因此,以下53、56 BE .固定的机器说明等可以用作特征代码。 6c 00 00 00 .无法使用这种类型的地址,因为一旦环境发生变化,地址就会发生变化,因此需要使用通配符。它太累了,无法手动提起它,因此需要工具。
1. 需要的工具
pcf.exe:提取功能代码命令:pcf.exe [lib文件中的obj路径]要提取的lib文件的原理:对于二进制提取功能代码,请使用通配符字符而不是重置数据。 sigmake.exe:持续在.pat特征文件的SIG签名文件中注意:这两个工具都需要添加环境变量。
2. 提取特征及签名
特征代码:可以用作特征代码的示例:固定的机器代码。不作为特征代码的示例:偏移值。通配符:请勿指定长度=(. 1的两个点); 1:1长度=?提取功能工具:pcf.exe(D: \\ idapro75 \\ flair \\ binn)此路径需要配置为环境变量
提取功能步骤:1.CMD提取功能:PCF XXX.OBJ(将生成xxx.pat文件); 2。将.pat文件发送到文本编辑器:pcf xxx.obj(将生成xxx.pat文件);
签名步骤:sigmake -n\’myprintf\’printf.pat printf.sig(将生成xxx.sig文件); sigmake -n\’mysig for printf\’ *.pat allsigname.sig(当前目录中的所有.pat able to 1。sig);在IDA中添加一个签名,标题#FUNC项目表示该签名已多次使用。
printf函数示例:
注意:IDA的较高版本可以直接提取生产LIB中的所有特征代码和签名。
a.高版本IDA工具制作lib签名
更高版本可以直接创建LIB签名指令:PCF [lib名称] .lib原因:PCF自动识别它是否为LIB。 If it is lib, call plb.exe to ignore the name command: sigmake -r [pat signature].pat [sig signature name].sig
(2)IDA签名自动制作
Use the scripting language lib2sig.bat Use case: cmd command –lib2sig The following problem occurs during the operation of libc, because the function is not 32-bit, press Enter to skip it
run.bat用例:cmd命令- 运行libcmd1_OBJSCD1_OBJSFOR /f %% i(\’link -lib /list1.lib\’)do link -lib /defter:ii1.libfor %% i in( *.obj)in( *。功能,但用于商业分析
PCF.exe脱壳
ESP UNSHELLED 32位程序在32位系统下未壳和64位计划在64位系统下取消剥离
方法1
保存环境
然后,当您到达入口点时,环境肯定会恢复
恢复环境肯定会访问此数据,并且下一个数据访问断点就足够了。
原始入口在入口前有2个retn。可以看出,这是一个aspack壳
从原始的输入环境中,该程序以BC ++编写,因为JMP跳跃,并且跳过了一组字符串
方法二:
因为它是Aspack外壳,您可以直接搜索并找到2个RETS,
不确定哪一个是断点
破碎的是
到达入口点时离开外壳
只要模拟模拟图像,就可以完成仿真加载,许多保护系统将失败(部分属性恢复,环境恢复)。将目标可执行文件的二进制数据放入加载程序中。加载程序不会读取文件,而是直接读取大型数组,即是外壳。
用户评论
遗憾最汹涌
这篇文章写的真棒!我一直在想找一个好的入门教程来学习 X86 C++ 反汇编,IDA 和签名提取都非常实用。看这篇博文感觉学起来并不太难,准备动手实践练习一下!
有7位网友表示赞同!
凉月流沐@
IDA 确实是个强大的工具,不过有时候上手有点困难啊,对于新手来说需要多花时间去理解它的功能。希望以后的博文中能针对某些复杂的指令或者逆向分析技巧进行更深入的讲解。
有11位网友表示赞同!
鹿叹
标题说的很清楚,文章内容很干货!虽然我对反汇编并不太了解,但看到这些概念学习起来还是挺有意思的,尤其是签名提取部分,好像可以用来识别哪些程序是恶意软件呢?
有7位网友表示赞同!
肆忌
IDA 的插件确实很多很强大,不过有时候自己编写插件反而更容易理解其原理。这篇博文提到了签名提取,我觉得这个方法虽然简单直观,但在实际应用中可能存在一定的局限性,需要根据具体情况选择合适的工具和方法。
有11位网友表示赞同!
失心疯i
学习反汇编是一件很有挑战的事情,需要掌握许多编程、计算机结构、操作系统等知识。这篇博文入门级确实能给新手一个简单的了解,但想要真正精通还需要多加练习和积累经验。
有18位网友表示赞同!
大王派我来巡山!
IDA 的界面确实有点古老了,不过功能还是相当强大。这篇博文中提到的 X86 指令集和反汇编技巧其实在很多逆向工程的实战中都非常有用,值得仔细学习一下!
有6位网友表示赞同!
糖果控
对于初学者来说,学习 X86 C++ 反汇编的确是件不容易的事,需要花时间去理解和积累经验。这篇博文虽然比较浅显,但能起到很好的入门引导作用,帮助大家逐步了解反汇编的基本概念和流程。
有8位网友表示赞同!
凉笙墨染
反汇编是一个很有意思的领域,但是这篇文章写的有点太简单了。对于已经对 X86 指令集和 IDA 有了一定了解的人来说,内容可能会比较枯燥乏味。
有6位网友表示赞同!
桃洛憬
觉得这篇博文挺实用的,IDA 是必备的反汇编工具,学习它的使用方法能帮助我们更好地理解软件的逻辑结构和运行机制!
有13位网友表示赞同!
聽風
提取签名很有用吧?如果签名被恶意修改怎么办?还需要考虑其他更安全的防篡改方法。
有6位网友表示赞同!
哭花了素颜
这个标题好吸引人啊!我现在就想去下载IDA试试,反汇编真的是个让人着迷的技能!
有11位网友表示赞同!
夏至离别
X86 指令集学习起来挺费时间的,这篇博文能让我快速了解 IDA 的一些基本功能,后续再深入学习 X86 指令解析应该会更轻松一些。
有9位网友表示赞同!
景忧丶枫涩帘淞幕雨
这篇文章介绍了签名提取的方法原理,看起来很有意思。 不过现实中提取到的签名能不能保证软件的安全性呢?
有9位网友表示赞同!
浅巷°
IDA 的反汇编功能确实强大,它可以帮我们分析程序的结构和运作过程,理解代码逻辑。 希望以后的文章能分享一些更实用的案例。
有7位网友表示赞同!
青墨断笺み
对于 C++ 程序员来说学习反汇编确实有很大帮助,这篇博文介绍了 X86 的指令集和 IDA 的使用方法,能够让我们更快地入门反汇编知识。感谢作者分享!
有9位网友表示赞同!
龙吟凤
这篇文章对新手来说太简略了, 缺乏一些具体的案例讲解,不太好理解实际应用层面的问题。
有5位网友表示赞同!
箜篌引
我已经用IDA分析过很多C++程序了, 这篇博文介绍的内容感觉很基础,对于我这种有一定经验的人来说可能有些重复。 我希望作者能分享更深入的知识和技巧!
有10位网友表示赞同!
代价是折磨╳
反汇编是一个非常专业的方向,需要大量的理论积累和实践操作才能掌握。这篇博文虽然入门性强,但想要真正精通X86反汇编需要更加系统化的学习和练习。
有8位网友表示赞同!