静态分析原生层程序
基本方法
静态分析原生层程序基本的过程如下
提取 so 文件
ida 反编译 so 文件阅读 so 代码
根据 java 层的代码来分析 so 代码。
根据 so 代码的逻辑辅助整个程序的分析。
原生层静态分析例子
2015-海峡两岸-一个APK,逆向试试吧
反编译
利用jadx反编译apk,确定应用的主活动
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:versionCode="1" android:versionName="1.0" package="com.example.mobicrackndk">
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" />
<application android:theme="@style/AppTheme" android:label="@string/app_name" android:icon="@drawable/ic_launcher" android:allowBackup="true">
<activity android:label="@string/app_name" android:name="com.example.mobicrackndk.CrackMe">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>不难看出,程序的主活动为 com.example.mobicrackndk.CrackMe。
分析主活动
不难看出,程序的基本情况就是利用 native 函数 testFlag 判断用户传入的 pwdEditText 是否满足要求。
分析so文件
自然我们首先会去直接找 testFlag 函数,凡是并没有直接找到。我们只好首先分析 JNI_Onload 函数,如下
可以发现,程序在这里动态注册了类和相应的函数 off_400C。仔细看一下该函数
可以发现,确实就是 testflag 函数,其对应的函数名为 abcdefghijklmn。
分析abcdefghijklmn
可以发现,程序主要在三个部分对输入的 v10 进行了判断
判断1
说明输入的字符串长度为16。
判断2
判断3
根据汇编代码,可知第三个判断中调用了calcKey类中的静态方法
并在之后获得了key的内容。
获取flag
根据这三个判断,我们可以得到输入的字符串内容
结果如下
输入之后并不对。
再次分析
想到这里就要考虑下,程序是不是在哪里修改了对应的字符串。这里首先看一下seed。对 x 进行交叉引用,发现其在 _init_my 中使用了,如下
所以最初程序对 seed 进行了修改。
再次获取flag
修改脚本如下
flag 如下
当然该题目也可以使用动态调试。
Last updated