首页
论坛
专栏
课程

[原创]使用 frida 追踪android方法调用_超级醒目

2019-6-26 23:35 4482

[原创]使用 frida 追踪android方法调用_超级醒目

2019-6-26 23:35
4482
先看frida追踪方法调用,打印效果,超级醒目:



点击"测试"按钮,触发onClick点击事件,调用test方法,test方法内部又分别调用了gainAge和gainEnjoy方法。
方法的调用层级、参数和返回值,都一目了然。使用frida调试是相当happy!!!


本次测试项目包名是 com.example.king.testappsflyer,frida的js脚本主要代码:

var logContentArray = new Array();

var singlePrefix = "|----"


// trace a specific Java Method
function traceMethod(targetClassMethod)
{
	var delim = targetClassMethod.lastIndexOf(".");
	if (delim === -1) return;

	// slice() 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分
	var targetClass = targetClassMethod.slice(0, delim)
	var targetMethod = targetClassMethod.slice(delim + 1, targetClassMethod.length)
	var hook = Java.use(targetClass);
	var overloadCount = hook[targetMethod].overloads.length;
	console.log("Tracing " + targetClassMethod + " [" + overloadCount + " overload(s)]");
	for (var i = 0; i < overloadCount; i++) {

		// hook方法
		hook[targetMethod].overloads[i].implementation = function() {

			var logContent_1 = "entered--"+targetClassMethod;

			var prefixStr = gainLogPrefix(logContentArray);

			logContentArray.push(prefixStr + logContent_1);

			console.warn(prefixStr + logContent_1);

			// print backtrace, 打印调用堆栈
			// Java.perform(function() {
			// 	var bt = Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new());
			// 	console.log(prefixStr +"Backtrace:" + bt);
			// });   

			// print args
			// if (arguments.length) console.log();

			// 打印参数
			for (var j = 0; j < arguments.length; j++) 
			{
				var tmpLogStr = prefixStr + "arg[" + j + "]: " + arguments[j];
				console.log(tmpLogStr);
				logContentArray.push(tmpLogStr);
			}
			// print retval
			var retval = this[targetMethod].apply(this, arguments); // rare crash (Frida bug?)
			// 打印返回值
			// console.log("\n"+ targetClassMethod +"--retval: " + retval);
			var tmpReturnStr = prefixStr + "retval: " + retval;
			logContentArray.push(tmpReturnStr);
			console.log(tmpReturnStr);
			//结束标志
			var logContent_ex = "exiting--" + targetClassMethod;
			logContentArray.push(prefixStr + logContent_ex);
			console.warn(prefixStr + logContent_ex);
			return retval;
		}
	}
}

// 获取打印前缀
function gainLogPrefix(theArray)
{
	var lastIndex = theArray.length - 1;

	if (lastIndex<0)
	{
		return singlePrefix;
	}
	
	for (var i = lastIndex; i >= 0; i--) 
	{
		var tmpLogContent = theArray[i];
		var cIndex = tmpLogContent.indexOf("entered--");

		if ( cIndex == -1)
		{
			var cIndex2 = tmpLogContent.indexOf("exiting--");
			if ( cIndex2 == -1)
			{
				continue;
			}
			else
			{
				//与上个方法平级
				var resultStr = tmpLogContent.slice(0,cIndex2);
				return resultStr;
			}
		}
		else
		{
			//在上个方法的内部
			var resultStr = singlePrefix + tmpLogContent.slice(0,cIndex);//replace(/entered--/, "");
			// console.log("("+tmpLogContent+")前缀是:("+resultStr+")");
			return resultStr;
			
		}
	}
	return "";
}

// usage examples
setTimeout(function() { // avoid java.lang.ClassNotFoundException

	Java.perform(function() {
		trace("com.test.flyer.MainActivity");
	});   
}, 0);

终端内输入命令,启动app时加载js脚本:

frida -U -f com.example.king.testappsflyer --no-pause -l raptor_frida_android_trace.js

开始追踪 MainActivity 内的方法。



点击“测试”按钮,就能在终端内看到打印信息:


|----entered--com.test.flyer.MainActivity$1.onClick
|----arg[0]: android.support.v7.widget.AppCompatButton{426a5f40 VFED..C. ...P.... 0,0-264,144 #7f070022 app:id/button}
|----|----entered--com.test.flyer.MainActivity.test
|----|----arg[0]: Jack
|----|----|----entered--com.test.flyer.MainActivity.gainAge
|----|----|----arg[0]: 16
|----|----|----retval: 26
|----|----|----exiting--com.test.flyer.MainActivity.gainAge
|----|----|----entered--com.test.flyer.MainActivity.gainEnjoy
|----|----|----arg[0]: 篮球
|----|----|----retval: 我喜欢篮球
|----|----|----exiting--com.test.flyer.MainActivity.gainEnjoy
|----|----retval: OK
|----|----exiting--com.test.flyer.MainActivity.test
|----retval: undefined
|----exiting--com.test.flyer.MainActivity$1.onClick


哈哈哈,希望各位大佬喜欢。

本文使用的测试项目和js文件获取方式:
1、关注公众号"逆向APP",回复"frida追踪方法02"获取资源

2、github地址:

https://github.com/luoyanbei/android_frida_trace_myTrace



本文原始js脚本地址:

https://github.com/0xdea/frida-scripts








[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最后于 2019-7-5 17:01 被luoyanbei编辑 ,原因:
最新回复 (22)
柒雪天尚 2019-6-26 23:44
2
0
好评
IamHuskar 4 2019-6-27 08:04
3
0
不错~
pxhb 2 2019-6-27 09:44
4
0
收藏备用
Monkeylord 2019-6-27 10:49
5
0
Nice,不过没有处理多线程的情况。
Snark 1 2019-6-27 12:47
6
0
跟erlang 中的recon_trace 类似
葫芦娃 1 2019-6-28 01:25
7
0

这样够直观吗
图片描述

huluxia 2019-6-28 08:12
8
0
葫芦娃 这样够直观吗 ![图片描述](upload/attach/201906/715510_HJZKBM6FXSD7UAC.png)
求大佬分享
luoyanbei 2019-6-28 08:36
9
0
葫芦娃 这样够直观吗 ![图片描述](upload/attach/201906/715510_HJZKBM6FXSD7UAC.png)
很清晰直观,求大佬分享
xxRea 2019-6-28 09:54
10
0
感谢分享,简直就是神器!
葫芦娃 1 2019-6-28 10:40
11
0

最后于 2019-6-28 10:42 被葫芦娃编辑 ,原因:
xiaokangpwn 2019-6-28 17:51
12
0
https://www.frida.re/docs/examples/android/  测试这个例子  有点问题
[Xiaomi MI 8::com.example.seccon2015.rock_paper_scissors]-> is--java
is--java--2--com.example.seccon2015.rock_paper_scissors.MainActivity$1
TypeError: cannot read property 1 of null
    at [anon] (duk_hobject_props.c:2384)
    at [anon] (/repl1.js:61)
    at frida/node_modules/frida-java/index.js:181
    at forEach (native)
    at /_java.js:2327
    at frida/node_modules/frida-java/index.js:109
    at trace (/repl1.js:69)
    at [anon] (/repl1.js:340)
    at frida/node_modules/frida-java/lib/vm.js:43
    at M (frida/node_modules/frida-java/index.js:347)
    at frida/node_modules/frida-java/index.js:299
    [...]
luoyanbei 2019-7-2 11:01
13
0
xiaokangpwn https://www.frida.re/docs/examples/android/ 测试这个例子 有点问题 [Xiaomi MI 8::com.example.seccon2015.rock ...
亲测可以啊,我这里没问题。
 js脚本中追踪的类改一下: 
setTimeout(function() { 
	Java.perform(function() {
		trace("com.example.seccon2015.rock_paper_scissors.MainActivity");
	});   
}, 0);

运行app并加载js脚本:
 frida -U -f com.example.seccon2015.rock_paper_scissors --no-pause -l raptor_frida_android_trace_copy.js 
com.example.seccon2015.rock_paper_scissors 是包名,raptor_frida_android_trace_copy.js  是js脚本文件名。

 终端打印:

app启动后界面:


点击"R"按钮,打印如下:



小黄鸭爱学习 2019-7-3 15:59
14
0
这是什么问题呢
Spawned `com.example.king.testappsflyer`. Resuming main thread!
[Xiaomi Redmi 5A::com.example.king.testappsflyer]-> is--java
is--java--2--com.test.flyer.MainActivity
TypeError: cannot read property 1 of null
    at [anon] (../../../frida-gum/bindings/gumjs/duktape.c:56648)
    at /repl1.js:61
    at frida/node_modules/frida-java/index.js:182
    at forEach (native)
    at /_java.js:2682
    at frida/node_modules/frida-java/index.js:110
    at trace (/repl1.js:69)
    at /repl1.js:340
    at frida/node_modules/frida-java/lib/vm.js:42
    at E (frida/node_modules/frida-java/index.js:348)
    at frida/node_modules/frida-java/index.js:300
    [...]

luoyanbei 2019-7-4 14:18
15
0
小黄鸭爱学习 这是什么问题呢Spawned&nbsp;`com.example.king.testappsflyer`.&nbsp;Resuming&nbsp;main&nbsp;t ...
电脑端安装的frida版本和手机内的frida-server版本号一致吗?
小黄鸭爱学习 2019-7-4 19:17
16
0
luoyanbei 电脑端安装的frida版本和手机内的frida-server版本号一致吗?
都是最新版的 
nsec 2019-7-5 12:52
17
0
https://github.com/0xdea/frida-scripts/blob/master/raptor_frida_android_trace.js 这个应该才是原创脚本吧?
leehero 2019-7-5 15:13
18
0
Error: Unable to parse ART internals; please file a bug at https://github.com/frida/frida-java 会报错。
最后于 2019-7-5 15:34 被leehero编辑 ,原因:
coolsnake 2019-7-7 18:07
19
0
Error: Unable to parse ART internals; please file a bug at https://github.com/frida/frida-java
miyuecao 2019-7-11 10:23
20
0
好东西,感谢分享
mztang 2019-7-15 14:36
21
1
Error: Unable to parse ART internals; please file a bug at https://github.com/frida/frida-java
    at $e (frida/node_modules/frida-java/lib/android.js:2221)
    at Qe (frida/node_modules/frida-java/lib/android.js:1976)
    at frida/node_modules/frida-java/lib/android.js:1506
    at [anon] (native)
    at frida/runtime/core.js:199
    at Be (frida/node_modules/frida-java/lib/android.js:1510)
    at frida/node_modules/frida-java/lib/android.js:2261
    at ue (frida/node_modules/frida-java/lib/android.js:831)
    at /_java.js:2677
TypeError: cannot write property '_code' of null
    at [anon] (../../../frida-gum/bindings/gumjs/duktape.c:57666)
    at Be (frida/node_modules/frida-java/lib/android.js:1510)
    at frida/node_modules/frida-java/lib/android.js:2261
    at ue (frida/node_modules/frida-java/lib/android.js:831)
    at /_java.js:2677
    at frida/node_modules/frida-java/index.js:110
    at trace (/repl1.js:51)
    at /repl1.js:175
    at frida/node_modules/frida-java/lib/vm.js:42
    at E (frida/node_modules/frida-java/index.js:348)
    at frida/node_modules/frida-java/index.js:334
    [...]
小白abc 2019-7-29 18:42
22
0
小黄鸭爱学习 这是什么问题呢Spawned&nbsp;`com.example.king.testappsflyer`.&nbsp;Resuming&nbsp;main&nbsp;t ...
您好,请问你的问题解决了吗  我也出现这个问题了
香风一族 2019-8-17 17:53
23
0
TypeError: cannot read property 1 of null
    at [anon] (../../../frida-gum/bindings/gumjs/duktape.c:56648)
    at /repl1.js:61
    at frida/node_modules/frida-java-bridge/index.js:180
    at forEach (native)
    at /_java.js:2934
    at frida/node_modules/frida-java-bridge/index.js:228
    at trace (/repl1.js:69)
    at /repl1.js:338
    at frida/node_modules/frida-java-bridge/lib/vm.js:11
    at E (frida/node_modules/frida-java-bridge/index.js:346)
    at frida/node_modules/frida-java-bridge/index.js:298
    [...]
游客
登录 | 注册 方可回帖
返回