Frida系列-环境配置和hook简单方法

背景

之前介绍过如何通过xposed进行安卓app的hook,现在介绍一个工具更加方便的,同时可以配合xposed分析的,相互配合更好吃。 主角:frida

基于frida的逆向工具集hooker

环境需要

Mac os 或者Linux 手机需要root

进入我们的系统,先拉取工具代码


//https://github.com/CreditTone/hooker
git clone https://github.com/CreditTone/hooker.git

下载完成之后,我们需要初始化

cd hooker
//需要安装python3,和pip,自己安装好
pip install -r requirements.txt
//完成后
//手机链接好系统
adb devices

Ubuntu系统如发现无法链接adb,或者提示错误的,可以看这个文章,解决无法链接问题(mac os)跳过 https://www.sunofbeach.net/a/1403285447056093185

链接成功后,

adb push mobile-deploy/ /sdcard/
adb shell
su
sh /sdcard/mobile-deploy/deploy.sh              

//如果提示这个,你配置成功了 disable android firewall. start frida-server start network adb. deploy successfull.

开始hook你的app

在工具目录中执行

./hooker

图片描述

这个时候,打开你的目标app,然后输入app的包名

图片描述

没有提示错误,就成功注入了,这个时候,我们可以hook之后我们写的简单的例子。

先提供源代码

activity中
private void setTextToBtn() {
    mBtnAddData.setText(TestHook.getName());
    mSelect.setText(TestHook.getAge(10));
}

测试类

com.x.room
public class TestHook {
public static String getName() {
    StringBuilder sb = new StringBuilder();
    sb.append("abcd").append("1234567");
    return sb.toString();
}

public static String getAge(int old) {
    return "年龄:" + old;
}

}

2个按钮返回的是正常的文字。

我们需要修改方法getName的返回值,替换成我们自己需要的。 目标的类完整路径com.x.room.TestHook

这个时候,我们在控制台输入

j com.x.room.TestHook

回车后,会生成js代码。 推出当前命令行,进入包名目录

图片描述

hook的代码为我们准备好了,现在只需要简单编写hook就行了。

开始hook方法

使用vs code打开com.x.room.TestHook.js 拉到最后,找到Java.perform这个方法,就是hook编写的地方了

//com.x.room.TestHook
Java.perform(function() {
    var com_x_room_TestHook_clz = Java.use('com.x.room.TestHook');
    var com_x_room_TestHook_clz_method_getName_8612 = com_x_room_TestHook_clz.getName.overload();
    com_x_room_TestHook_clz_method_getName_8612.implementation = function() {
        var executor = 'Class';
        var beatText = 'public static java.lang.String com.x.room.TestHook.getName()';
        var beat = newMethodBeat(beatText, executor);
        var ret = com_x_room_TestHook_clz_method_getName_8612.call(com_x_room_TestHook_clz);
        printBeat(beat);
        return ret;
    };
    var com_x_room_TestHook_clz_init_5741 = com_x_room_TestHook_clz.$init.overload();
    com_x_room_TestHook_clz_init_5741.implementation = function() {
        var executor = this.hashCode();
        var beatText = 'public com.x.room.TestHook()';
        var beat = newMethodBeat(beatText, executor);
        var returnObj = com_x_room_TestHook_clz_init_5741.call(this);
        printBeat(beat);
        return returnObj;
    };
});

我们hook方法getName,返回一些其他字符串试试。

//在方法末尾,增加如下代码
//这个TestHook对象,的getName方法的实现
com_x_room_TestHook_clz.getName.implementation=function(){
	//这个是返回值
        return "hahahah lsdladjfa;sdfasdf   ~~~~~";        
}

保存代码。返回控制台。执行

./hooking com_x_room_TestHook.js 

图片描述

手机重新打开这个页面。

图片描述

我们的返回值被修改了。

我们继续hook另一个方法getAge

同理,我们在末尾增加代码

//TestHook对象的getAge方法,因为有入参,需要执行overload,切需要写入参类型int
com_x_room_TestHook_clz.getAge.overload('int').implementation=function(old){
	//修改入参,设置200
        return this.getAge(200);
}

保存代码,返回控制台,继续执行

./hooking com_x_room_TestHook.js 

图片描述

我们的入参被修改,返回值也显示出来了。利用同样的方式,你可以尝试修改微信钱包的余额,我之前的文章有如果修改微信余额的,已经分析出具体的类和方法了,直接进行hook就行。 完整的代码

//com.x.room.TestHook
Java.perform(function() {
    var com_x_room_TestHook_clz = Java.use('com.x.room.TestHook');
    var com_x_room_TestHook_clz_method_getName_8612 = com_x_room_TestHook_clz.getName.overload();
    com_x_room_TestHook_clz_method_getName_8612.implementation = function() {
        var executor = 'Class';
        var beatText = 'public static java.lang.String com.x.room.TestHook.getName()';
        var beat = newMethodBeat(beatText, executor);
        var ret = com_x_room_TestHook_clz_method_getName_8612.call(com_x_room_TestHook_clz);
        printBeat(beat);
        return ret;
    };
    var com_x_room_TestHook_clz_init_5741 = com_x_room_TestHook_clz.$init.overload();
    com_x_room_TestHook_clz_init_5741.implementation = function() {
        var executor = this.hashCode();
        var beatText = 'public com.x.room.TestHook()';
        var beat = newMethodBeat(beatText, executor);
        var returnObj = com_x_room_TestHook_clz_init_5741.call(this);
        printBeat(beat);
        return returnObj;
    };
    com_x_room_TestHook_clz.getName.implementation=function(){
        return "hahahah lsdladjfa;sdfasdf   ~~~~~";        
    }
com_x_room_TestHook_clz.getAge.overload('int').implementation=function(old){
    return this.getAge(200);
}

});

总结

  • frida的使用需要配合hooker这个工具集,是一个大神开发的,开源的。非常感谢。
  • 无需重启手机即可hook,看到效果,这个比xposed好
  • 帮助生成hook代码,非常友好
  • hooker的使用,直接看文档就好,我也在学习中

你学废了吗,又一个姿势帮助逆向app~

评论
0/256
文章评论
学废啦,学废啦
2021-06-13 10:52 . 回复