【Android逆向】破解看雪test3.apk方案二

android,逆向,破解,test3,apk,方案 · 浏览次数 : 8

小编点评

方案二是按照以下步骤进行的: 1. 获取 Build 类对象。 2. 获取 FINGERPRINT 字段的 ID。 3. 使用 Interceptor 来监听 FINGERPRINT 字段的设置和更改。 4. 当 FINGERPRINT 字段的值满足指定的条件时,将 v20 设置为 "FAKE"。 代码如下: ```java // 获取 Build 类对象 var BuildHandler = Java.use("android.os.Build"); // 获取 FINGERPRINT 字段的 ID var fieldID = _JNIEnv::GetStaticFieldID(env, BuildHandler, "FINGERPRINT", "Ljava/lang/String;"); // 使用 Interceptor 来监听 FINGERPRINT 字段的设置和更改 Interceptor.attach(BuildHandler, fieldID, new Interceptor.OnMethodCall() { @Override public void onMethodCall(Method method, Object[] args) { if (method.getName().equals("setFINGERPRINT")) { String str = (String) args[0]; if (str.contains("aosp")) { v20 = "FAKE"; } } } }); // 设置 FINGERPRINT 字段的值 BuildHandler.FINGERPRINT.value = "1234"; ``` **注意:** * `f_symbol.name.indexOf("function_check_tracerPID")` 和 `f_symbol.name.indexOf("system_getproperty_check")` 用于查找 FINGERPRINT 字段中包含的函数名称。 * `new NativePointer(0)` 用于将 `stringUTFChars` 转换为 NATIVE 类型。

正文

方案二就是要hook那三个条件,不让追加字符串变成false

 v20 = "REAL";
  clazz = _JNIEnv::FindClass(env, "android/os/Build");
  fieldID = _JNIEnv::GetStaticFieldID(env, clazz, "FINGERPRINT", "Ljava/lang/String;");
  StaticObjectField = (_jstring *)_JNIEnv::GetStaticObjectField(env, clazz, fieldID);
  if ( function_check_tracerPID()
    || system_getproperty_check()
    || (StringUTFChars = (char *)_JNIEnv::GetStringUTFChars(env, StaticObjectField, 0), strstr(StringUTFChars, "aosp")) )
  {
    v20 = "FAKE";
  }
  1. hook Build 类的FINGERPRINT
  2. hook function_check_tracerPID
  3. hook system_getproperty_check

代码如下

function main() {
    Java.perform(function () {
        hookCheck()
        var MainActivityHandler = Java.use('com.roysue.easyso1.MainActivity')

        for (var i = 87650; i <= 87700; i++) {
            var str = i + ""
            var ret = MainActivityHandler.Sign(str)
            if (i % 1000 == 0) {
                console.log("now is", str);
            }
            //console.log(ret)
            if (ret == "57fdeca2cac0509b2e9e5c52a5b573c1608a33ac1ffb9e8210d2e129557e7f1b") {
                console.log("find it : " + str)
                break
            }
        }
        
        console.log("end : ")
    })

}

function hookCheck() {
    var lib_hanlder = Process.findModuleByName("libroysue.so");
    console.log("lib_handler: " + lib_hanlder)
    
    if (lib_hanlder) {     
        var symbols = lib_hanlder.enumerateExports()
        for (var i = 0; i < symbols.length; i++) {
            var f_symbol = symbols[i]
            //function_check_tracerPID()
            if (f_symbol.name.indexOf("function_check_tracerPID") >= 0) {
                var f_func_addr = f_symbol.address
                console.log("function_check_tracerPID is at ", f_symbol.address, f_symbol.name);
                Interceptor.attach(f_func_addr, {
                    onEnter: function(args) {

                    },
                    onLeave: function(retVal) {
                        console.log("function_check_tracer retval is => ", retVal)
                        //兩種都行
                        //retVal.replace(new NativePointer(0));
                        retVal.replace(0);
                    }
                })
            }
            //system_getproperty_check()
            if (f_symbol.name.indexOf("system_getproperty_check") >= 0) {
                var f2_func_addr = f_symbol.address
                console.log("system_getproperty_check is at ", f_symbol.address, f_symbol.name);
                Interceptor.attach(f2_func_addr, {
                    onEnter: function(args) {

                    },
                    onLeave: function(retVal) {
                        console.log("system_getproperty_check retval is => ", retVal)
                        //兩種都行
                        //retVal.replace(new NativePointer(0));
                        retVal.replace(0);
                    }
                })
            }
        }
    }

    var BuildHandler = Java.use("android.os.Build")
    if (BuildHandler) {
        console.log("=== FINGERPRINT: " + JSON.stringify(BuildHandler.FINGERPRINT.value)) 
        BuildHandler.FINGERPRINT.value = "1234"
    }
}

setTimeout(main, 2000)

日志

lib_handler: [object Object]
function_check_tracerPID is at  0xc7004aad _Z24function_check_tracerPIDv
system_getproperty_check is at  0xc7005001 _Z24system_getproperty_checkv
=== FINGERPRINT: "1234"
function_check_tracer retval is =>  0x1
system_getproperty_check retval is =>  0x0
function_check_tracer retval is =>  0x1
system_getproperty_check retval is =>  0x0
function_check_tracer retval is =>  0x1
system_getproperty_check retval is =>  0x0
function_check_tracer retval is =>  0x1
system_getproperty_check retval is =>  0x0
function_check_tracer retval is =>  0x1
system_getproperty_check retval is =>  0x0
find it : 87654
end : 

与【Android逆向】破解看雪test3.apk方案二相似的内容:

【Android逆向】破解看雪test3.apk方案二

方案二就是要hook那三个条件,不让追加字符串变成false v20 = "REAL"; clazz = _JNIEnv::FindClass(env, "android/os/Build"); fieldID = _JNIEnv::GetStaticFieldID(env, clazz, "FIN

【Android逆向】破解看雪test3.apk方案一

1. test3.apk 安装到手机 2. 发现其实际逻辑和之前的test2.apk基本一致,逆向so查看到加入了一些检查逻辑 代码: jstring __fastcall fuck(JNIEnv *env, jclass jcls, jstring str_) { ...... if ( !str

【Android逆向】破解看雪 test1.apk

1. 获取apk,并安装至手机 apk 获取地址: https://www.kanxue.com/work-task_read-800624.htm adb install -t test1.apk # 这个apk必须加-t ,否则会报错 2. 只有一个输入框,随便输入内容,提示壮士继续加油 3.

【Android逆向】破解看雪9月算法破解第一题

1. 安装apk到手机 2. 随意输入账号和密码,点击register,报错crackme1:ERROR 3. 将apk拖入到jadx中进行观察 public native String register(String str); static { System.loadLibrary("nativ

【Android逆向】破解看雪9月算法破解第二题

1. apk安装到手机,一样的界面,随便输入一样的报错 2. apk拖入到jadx重看看 public native String sha1(String str); static { System.loadLibrary("native-lib"); } /* JADX INFO: Access

【Android逆向】破解看雪9月算法破解第三题

这题的目标是算法还原,并写出注册机 1. 9月份算法第一题.apk 安装到手机 2. 随意输入账号密码,提示错误 3. apk拖入到jadx中 public native boolean register(String str, String str2); static { System.loadL

【Android逆向】破解黑宝宝apk,绕过签名校验

这是52pojie的一道题,实现输入任何密码都可以登录成功 他知道你最近在学习Android逆向 他想在游戏上线前让你测试一下他新加的签名验证是否能防住别人的破解。 下面是李华编写的黑宝宝apk 链接:https://pan.baidu.com/s/1h6pX2ARE3qtiKiYbcnJ-3g 密

【Android逆向】frida 破解 jwxdxnx02.apk

apk 路径: https://pan.baidu.com/s/1cUInoi 密码:07p9 这题比较简单,主要是用于练习frida 1. 安装apk到手机 需要输入账号密码 2. 使用jdax 查看apk package hfdcxy.com.myapplication; import andr

[Android逆向]Exposed 破解 jwxdxnx02.apk

使用exposed 遇到了一些坑,这里记录一下 源码: package com.example.exposedlesson01; import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.X

[Android 逆向]frida 破解 切水果大战原版.apk

1. 手机安装该apk,运行,点击右上角礼物 提示 支付失败,请稍后重试 2. apk拖入到jadx中,待加载完毕后,搜素失败,找到疑似目标类MymmPay的关键方法payResultFalse 4. adb logcat 或者androidstudio 查看该进程的日志,发现以下日志 com.mf