首页
社区
课程
招聘
[原创]介召几个frida在安卓逆向中使用的脚本以及延时Hook手法
发表于: 2019-1-7 17:34 24982

[原创]介召几个frida在安卓逆向中使用的脚本以及延时Hook手法

2019-1-7 17:34
24982

   frida是近几年才推出的一款全平台的逆向神器。功能上主要采用动态hook的方式,加入log,修改逻辑等。可以对java,native等hook。

   具体使用情况,谁用谁知道。废话不多说,直接上干货。

   这里仅仅讨论安卓上面的情况,其他平台的咱不做研究

    1、延时Hook
        安卓有一些多包的问题,另外有一些类是通过动态加载的方式来加载的。可能在hook触发的那个时间点,不会找到未加载的代码。
        这个时候,可以通过在class loader上面加hook的方式,在hook的代码下进行二次绑定加载。
       这里没有代码,需要各位同学自己尝试一下。
    2、打印调用栈
       调用栈,这个很有用。在分析的过程中,不一定会一定找到需要分析或者hook的函数。可能根据字符串等蛛丝马迹,仅仅找到一部分信息。
    使用java调用栈,就可以找到方法的调用关系。
      代码如下
      
Java.perform(function () {                                      
   var thread = Java.use('java.lang.Thread');
   var instance = thread.$new();

   function where(stack){
   	var at = ""
   	for (var i = 0; i < stack.length; i++){
   		at += stack[i].toString() + "\n";
   	}

   	return at;
   }

   var ConnectionErrorMessages = Java.use("com.google.android.gms.common.internal.ConnectionErrorMessages");
   ConnectionErrorMessages.getErrorMessage.overload('android.content.Context','int').implementation = function(mContext,mI){

   		console.log("gms i:"+ mI);

   		var ret = this.getErrorMessage(mContext,mI);

   		console.log("return:" + ret);

   		var stack = instance.currentThread().getStackTrace();
   		var full_call_stack = where(stack);

   		console.log(full_call_stack);

   		return ret;
   };
});   
如上所示,可以把所用调用了ConnectionErrorMessages.getErrorMessage这个方法的栈给打印出来。
3、关于java的重载 
  这个载frida中设计比较友好,如果不知道重载方法如何写。只需要写上方法名,运行一次,frida就会把所有的方法,通过错误日志的形式给打印出来。照抄即可。
  
Java.perform(function () {                                      
   var thread = Java.use('java.lang.Thread');
   var instance = thread.$new();

   function where(stack){
   	var at = ""
   	for (var i = 0; i < stack.length; i++){
   		at += stack[i].toString() + "\n";
   	}

   	return at;
   }

   var ConnectionErrorMessages = Java.use("com.google.android.gms.common.internal.ConnectionErrorMessages");
   ConnectionErrorMessages.getErrorMessage.overload('android.content.Context','int').implementation = function(mContext,mI){

   		console.log("gms i:"+ mI);

   		var ret = this.getErrorMessage(mContext,mI);

   		console.log("return:" + ret);

   		var stack = instance.currentThread().getStackTrace();
   		var full_call_stack = where(stack);

   		console.log(full_call_stack);

   		return ret;
   };
});   
如上所示,可以把所用调用了ConnectionErrorMessages.getErrorMessage这个方法的栈给打印出来。
3、关于java的重载 
  这个载frida中设计比较友好,如果不知道重载方法如何写。只需要写上方法名,运行一次,frida就会把所有的方法,通过错误日志的形式给打印出来。照抄即可。
  
    // overload 是用于定位hook哪一个方法的

    .overload()
    .overload('java.lang.String')
    .overload('android.app.Activity')
    .overload('int')
    .overload('[B') // byte array
    .overload('float')
    .overload('android.content.Context')
    .overload('[C')
    .overload('android.content.Context', 'android.view.View')
    .overload('android.app.Activity', 'com.cherrypicks.hsbcpayme.model.object.PayMeNotification')
    .overload('android.content.Context', 'boolean')
    .overload('android.content.Context', 'int')
    .overload('android.content.Context', 'java.lang.String')
    .overload('android.app.Activity', 'int')
    .overload('java.lang.String', 'java.lang.String')
    .overload('android.content.Context', 'android.graphics.Bitmap')
    .overload('java.lang.String', 'java.io.File')
    .overload('android.content.Context', 'java.lang.String', 'java.util.List')
    .overload('java.lang.String', 'java.lang.String', 'java.lang.String')
    .overload('java.lang.String', '[B', '[B')
    .overload('java.lang.String', 'java.lang.String', 'android.content.Context')
    .overload('android.app.Activity', 'com.cherrypicks.hsbcpayme.model.object.PayMeNotification', 'int')
    .overload('[B', '[B', '[B')
    .overload('android.content.Context', 'java.lang.String', 'java.lang.String')
    .overload('android.app.Activity', 'int', 'int', 'int', 'boolean')


// 一个列子
Java.perform(function () { 
    var AssetManager = Java.use("android.content.res.AssetManager");
    var FileInputStream = Java.use("java.io.FileInputStream");
    AssetManager.open.overload("java.lang.String").implementation = function(str) {
        send("hook asset")
        if(str.endsWith(".xxx")){
            return FileInputStream.$new("/data/local/tmp/xxxxx");
        }
        return this.open(str)
    }
});

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 6
支持
分享
最新回复 (12)
雪    币: 1490
活跃值: (9928)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
2
最近也是在用frida来hook。但是只是简单的运用。感觉这样的js好陌生。没用过Module、Memory这些的。我想问下。这样的js运用的基础要去查什么用法啊?我查到的都是控制html相关的。
2019-1-7 21:54
1
雪    币: 731
活跃值: (301)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
牛逼
2019-1-8 09:18
1
雪    币: 731
活跃值: (301)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
破解门槛又降低了,哈哈哈
2019-1-8 09:19
1
雪    币: 138
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
var Log = Java.use("android.util.Log");
var Throwable = Java.use("java.lang.Throwable");
console.log(Log.getStackTraceString(Throwable.$new()));
打堆栈不用那么麻烦,这样就行了
2019-1-8 17:51
3
雪    币: 105
活跃值: (549)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
var trace = Thread.backtrace(this.context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress);
var offaddr = trace[0]; 
var offaddr1 = offaddr - 基址;
console.log("地址|" + offaddr1.toString(16));
直接打印就好

2019-1-9 11:53
1
雪    币: 20
活跃值: (210)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
月莫
2019-1-9 15:57
1
雪    币: 916
活跃值: (3434)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
8
dou逗你玩 var&nbsp;Log&nbsp;=&nbsp;Java.use("android.util.Log"); var&nbsp;Throwable ...
你这打的是虚拟机的堆栈,不是一个东西
2019-1-9 16:15
1
雪    币: 107
活跃值: (404)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
对art支持如何了?
2019-1-9 16:15
1
雪    币: 129
活跃值: (407)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
misskings 最近也是在用frida来hook。但是只是简单的运用。感觉这样的js好陌生。没用过Module、Memory这些的。我想问下。这样的js运用的基础要去查什么用法啊?我查到的都是控制html相关的。
当然是去frida官网看帮助文档啊,然后结合JavaScript的的相关API来做处理。有必要时Frida还支持Python和JavaScript之间的通讯。用过最好的框架也应该是目前最流行的的吧。
2019-1-15 09:16
0
雪    币: 445
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
根据大牛的思路,通过dlopen解决了延迟so加载的hook,感谢
2020-3-19 17:05
0
雪    币: 4883
活跃值: (18890)
能力值: ( LV13,RANK:317 )
在线值:
发帖
回帖
粉丝
12
膜膜膜
2020-3-23 14:56
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
2020-3-26 02:24
0
游客
登录 | 注册 方可回帖
返回
//