静态分析原生层程序

基本方法

静态分析原生层程序基本的过程如下

  1. 提取 so 文件

  2. ida 反编译 so 文件阅读 so 代码

  3. 根据 java 层的代码来分析 so 代码。

  4. 根据 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