一生要走多远的路程
经过多少年 才能走到终点
梦想需要多久的时间
多少血和泪 才能慢慢实现
天地间任我展翅高飞
谁说那是天真的预言
🎵 Beyond《光辉岁月》
随着移动应用程序的普及,对于安全和隐私的关注也越来越高。安卓应用逆向工程是一种重要的技术手段,可以帮助安全研究人员分析应用程序的内部工作原理,发现潜在的漏洞和安全问题。在本文中,我们将介绍如何利用Frida这一强大的工具,在安卓应用程序中实现全局Hook,定位关键信息。
准备工作:
首先,我们需要在设备上安装Frida工具,并确保设备已经Root或者通过其他方式具有足够的权限。然后,我们需要了解目标应用程序的结构和功能,以便于确定我们需要Hook的关键函数。
全局Hook实现:
我们使用Frida提供的JavaScript API,在目标应用程序中Hook java.util.HashMap 的 put 方法。这个方法通常用于将键值对存储到HashMap中。我们编写以下JavaScript代码:
var hashMap = Java.use("java.util.HashMap");hashMap.put.implementation = function (a, b) {console.log("a:", a, "b:", b);return this.put(a, b);}
上述代码首先获取了java.util.HashMap类,并重写了其put方法。在重写的方法中,我们判断如果键是"username"或"userPwd",则将其键值打印出来。这样,我们就可以实现对关键信息的全局Hook,并在运行时捕获到相关的信息。
我们可以看到打印的日志信息
a: sec_code b: 52499b02cd1dd89d6bcbe7c07c511928
a: reversegeo b: true
a: isOffset b: true
a: wifiactivescan b: 1
a: httptimeout b: 30000
a: info b: INVALID_USER_SCODE
a: infocode b: 10008
a: status b: 0
a: sec_code_debug b: 240e28e14e8ccf12e19749c96366364c
a: key b: c5e4afee43c52bb00e2df9039d4aa470
a: sec_code b: 52499b02cd1dd89d6bcbe7c07c511928
a: sound_effects_enabled b: 1
a: username b: 123354 #### 关键信息 username
a: userPwd b: gyr #### 关键信息 userPwd
a: equtype b: ANDROID
a: loginImei b: Android359643090514526
a: timeStamp b: 1710573990834
a: sign b: 71116A6598E8697523CFFFC712714CE3
a: java.util.TreeMap b: com.google.gson.Gson$FutureTypeAdapter@d1f9c66
a: K b: com.google.gson.Gson$FutureTypeAdapter@500dba7
a: K b: com.google.gson.internal.bind.ObjectTypeAdapter@e749854
a: V b: com.google.gson.Gson$FutureTypeAdapter@306a3fd
a: V b: com.google.gson.internal.bind.ObjectTypeAdapter@27918f2
a: java.util.TreeMap b: com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter@558b43
a: java.lang.String b: com.google.gson.Gson$FutureTypeAdapter@dace5c0
a: java.lang.String b: com.google.gson.internal.bind.TypeAdapters$16@31e82f9
a: Encrypt b: NIszaqFPos1vd0pFqKlB42Np5itPxaNH//FDsRnlBfgL4lcVxjXii5B0KQ8UDLVz3xxNeFW43EbQ
ivJC0e8fa7Ww6sLomBbZtZmkT4Vr2ZLV2kIH3jBDC6nuHi5QytxmDLUC1ltP1ZPZG8MC4oYEA1KN
iskClBw8Ap/qbwu2+ONSt6hD6Duh2uVLxa4/0aNREDtWzikUJom+uztHPV+ZHR3pdxc2Nhtia: [ ] http://api.dodovip.com/api/user/login 0x38ed6746 NORMAL null b: java.lang.Object@57bd23e
a: http://api.dodovip.com/api/user/login b: null
a: Transfer-Encoding b: chunked
a: b: : 0.0 1.0
a: X-Android-Selected-Protocol b: http/1.1
a: android.animation.AnimatorSet$Node@7163900 b: android.animation.AnimatorSet$Node@25ed44a
a: Server b: Nginx
a: Connection b: keep-alive
经过分析得到登录的关键信息
局部hook,缩小范围
var hashMap = Java.use("java.util.HashMap");hashMap.put.implementation = function (a, b) {if (a.equals("username")) {// showStacks();console.log("a:", a, "b:", b);}return this.put(a, b);}
if (a.equals("username"))
这是一个条件语句,用于判断参数 a 是否等于字符串 “username”。
打印日志信息:
a: username b: 123354
a: username b: 123354
a: username b: 123354
a: username b: 123354
打印调用次hashMap时的堆栈信息
function showStacks() {console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));}var hashMap = Java.use("java.util.HashMap");hashMap.put.implementation = function (a, b) {if (a.equals("username")) {showStacks();console.log("a:", a, "b:", b);}return this.put(a, b);}
showStacks()
函数的作用是获取当前线程的调用堆栈信息并将其打印出来。在软件开发和调试过程中,调用堆栈信息通常用于追踪程序执行过程中的函数调用路径,从而定位和排查代码中的问题。
打印日志信息:
java.lang.Throwableat java.util.HashMap.put(Native Method)at com.dodonew.online.ui.LoginActivity.login(LoginActivity.java:127)at com.dodonew.online.ui.LoginActivity.onClick(LoginActivity.java:103)at android.view.View.performClick(View.java:6597)at android.view.View.performClickInternal(View.java:6574)at android.view.View.access$3100(View.java:778)at android.view.View$PerformClick.run(View.java:25885)at android.os.Handler.handleCallback(Handler.java:873)at android.os.Handler.dispatchMessage(Handler.java:99)at android.os.Looper.loop(Looper.java:193)at android.app.ActivityThread.main(ActivityThread.java:6718)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)a: username b: 123354
通过com.dodonew.online.ui.LoginActivity.login(LoginActivity.java:127)
可以定位到hashMap
调用的入口函数,从而得到关键信息代码
结语
通过利用Frida工具实现全局Hook,我们可以在运行时捕获到目标应用程序中关键信息的存储和使用过程。这种方法不仅简单高效,而且具有很高的灵活性,可以适用于各种安卓应用程序的逆向分析和安全审计工作中。然而,需要注意的是,在进行安全研究和逆向工作时,请务必遵守法律法规,并尊重用户隐私和数据保护。