0x7.so逆向深化及IDA静态分析-2

so逆向深化及IDA静态分析-2 :IDA静态分析之so逆向简单实战


本文从一个简单的so层签名校验实战来深化IDA静态分析,先上图:

本文样本链接: https://pan.baidu.com/s/1SZr9suOkLNtcYX_taIyyfQ 密码: gwx5
< 文中的apk修改仅用于研究学习,如涉及权益侵犯请随时联系处理。 >

既然我们是来分析这个apk的签名验证,那么我们首先将其反编译后重新打包运行,看一下是什么情况:


游戏检测到非官方签名后,会弹窗提示,点击“确定”后退出游戏。
接下来我们按照文首的思维导图步骤进行分析:关键字搜索、逻辑分析、逻辑修改

0x1. 关键字搜索
首先介绍一部分签名验证用到的关键字:signatures,Landroid/content/pm/Signature,GetPackageInfo,Landroid/content/pm/PackageInfo。
我们先从java层入手,apk拖入Android Killer之后,搜索关键字signatures。


搜索到的结果均为支付相关部分的代码,显然签名验证并不在java层,接下来我们搜索so层。
我们尝试对我们反编译后的 libarmeabi-v7a文件夹进行搜索,关键字使用Landroid/content/pm/Signature。


有两个so文件中存在我们的关键字,但是libentryexpro.so是银联支付相关so文件,所以我们将签名验证定位在libSrc.so之中。
将libSrc.so拖入IDA之中,等待IDA分析完成,因为libSrc.so比较大,所以需要等待的时间略长,待分析完成后我们在IDA中搜索关键字。
按ALT+T呼出文本搜索框,输入关键字Landroid/content/pm/Signature,勾选Find all occurrences进行搜索。


待漫长的搜索过程结束后,我们可以看到结果如下:


到现在为止,我们关键字搜索部分算是完成了,接下来我们进入逻辑分析环节。

0x2.逻辑分析 
搜索到结果后,我们双击进入IDA View-A界面:


按F5查看该函数的伪代码,遇到弹窗提示点击OK

可基本判断出该函数获取签名的hashcode之后进行了运算并返回一个值,我们推测该返回值是用于签名的比对,
那么我们回到汇编界面,到函数头看一下是否有交叉引用( CODE XREF:代码交叉引用  )。


果然有对该函数的引用,我们双击 CODE XREF:sub_508B40+8↓p 查看调用它的函数。


为便于查看逻辑,我们按空格键进入Graph View

可以看出,在跳转运行了sub_508884后,将返回值(R0中的值)与另一个值(R3中的值)通过CMP指令进行了比较,
并通过BEQ指令根据结果进行了跳转,由此可见,相同的话,程序会继续运行,不同的话,后续会出现弹窗提示盗版信息。

所以我们确定我们的思路是讲该跳转修改为始终执行至loc_508A0的跳转,接下来我们进入逻辑修改的环节。

0x3.逻辑修改
分析完逻辑后,我们可以简单的得出两种思路,
思路1. CMP R0,R3   时,将对比的两者修改为同一个寄存器,即 CMP R0,R0 或 CMP R3,R3
思路2. BEQ loc_508BA0  时,将BEQ修改为BNE,实现不相同则跳转
其他思路请大家自行思考和尝试,接下来我们就这两个思路进行修改和验证。

0x3.1  CMP R0,R3 → CMP R0,R0
我们将光标定位在CMP R0,R3,切换到Hex-View界面:

打开ARM指令转换工具,确认CMP R0,R3及CMP R0,R0的十六进制

所以我们使用十六进制编辑器010Editor将so文件中的 03 00 50 E1修改为00 00 50 E1,即实现了CMP R0,R3 到CMP R0,R0的修改。
注意:因为我们起初在IDA中搜索到了3个地方使用关键字 Landroid/content/pm/Signature,

所以,另外两个关键字对应的函数里的CMP R0,R3,也要修改为CMP R0,R0才算是修改完成。

0x3.2  BEQ loc_508BA0 →  BNE loc_508BA0
我们将光标定位在CMP R0,R3,切换到Hex-View界面:

打开ARM指令转换工具,确认BEQ及BNE的十六进制

根据上图结果,我们需要将0A修改为1A,即BEQ修改为了BNE,同样注意需要修改三个地方。
两种修改见下图:


以上两种方式修改均可使游戏正常进入,


请大家动手尝试,也可以尝试其他思路进行练习。