X黑手网
X黑手网
X黑手网

安卓逆向之——frida(hook)基础使用教程(1)

 

image

 

1.使用材料:

(Windous)pc

Python3环境

雷电模拟器

frida16.0.9(hook框架)

vscode

Charles(抓包)

APP(驾培训创业教练)未加固

jadx4.1

 

2.逆向目标:hook接口:逆向登录参数sigin加密

 

3.详细逆向过程:

 

3.1抓包

设置ssl代理,在雷电模拟器WIFI设置代理,下载证书并安装证书,重启雷电模拟器

打开 驾培训创业教练 APP的登录页面

打开抓包工具

输入手机号抓包,抓包结果如下:

image

 

 

vscode note记录抓包结果,养成好习惯!

 

3.2反编译app搜索逆向关键词

APP未加壳,如果加壳需要先破壳,安卓逆向中最重要的就是:代码分析+脱壳

打开jadx 导入APP后开始反编译 搜索关键词:getSmscode 双击转到代码区

image

 

 

代码审计:

 

image

 

这段代码就是构造请求体,包括了 类型 手机 时间 签名 。其中签名是用了stringMD5toUpperCase函数来生成,

其中stringMD5toUpperCase函数又使用了yyyyMMddHHmmss + i + str + str2这几个参数生成,我们不知道str是什么,所有可以使用frida进行hook!!!!!!

 

3.3编写hook代码

 

目录如下:

  • jiapeixunHook.py
  • getHook.js
  • setHook.js

我们直接使用模板frida

python模板

 

import frida  # 导入frida模块
import sys  # 导入sys模块

def on_message(message, data):  # js中执行send函数后要回调的函数
    print(message)
'''
spawn模式,Frida会自行启动并注入进目标App,Hook的时机非常早
'''
# device=frida.get_remote_device()
# pid=device.spawn(['com.jx885.reward'])  #包名
# device.resume(pid)
# time.sleep(1)
# session = device.attach(pid)

'''
attach模式,Frida会附加到当前的目标进程中,即需要App处于启动状态,这也意味着只能从当前时机往后Hook,
'''
session = frida.get_remote_device().attach('驾培创业教练')  #APPNAME这里是填APP名字

with open("./getHook.js") as f:
    script = session.create_script(f.read())

script.on('message', on_message)  # 加载回调函数,也就是js中执行send函数规定要执行的python函数
script.load()  # 加载脚本

sys.stdin.read()

模板介绍:frida两种模式,我们这里使第二种。他们的区别:

-spawn模式,Frida会自行启动并注入进目标App,Hook的时机非常早 自动重启 设置包名

-attach模式,Frida会附加到当前的目标进程中,即需要App处于启动状态,这也意味着只能从当前时机往后Hook 手动启动 设置APP名

 

js模板:

 

Java.perform(function (){  //固定
    // ('包名.类名').方法名.getSmscode.implementation=function(){} hook函数格式
    Java.use('com.jx885.library.http.CommAction').getSmscode.implementation=function (mi,mstr,mstr2){
        console.log(mi,mstr,mstr2);
        return this.getSmscode(mi,mstr,mstr2); //注意hook完一定要返回函数,否则可能会报错
    }
});

结合反编译Java代码编写:

 

image

 

补充:java方法的重载

什么是重载?

几个相同的函数,参数不相同(随口一说)

该怎么hook呢?

Java.use('包名.类名').方法.overload('java.lang.String')

例如:

Java.use('com.jx885.library.http.CommAction').getSmscode..overload('int')implementation=function(mi){}

 

完整代码:

  • jiapeixunHook.py

 

import frida  
import sys 
def on_message(message, data): 
    print(message)
session = frida.get_remote_device().attach('驾培创业教练')  

with open("./frida.js") as f:
    script = session.create_script(f.read())

script.on('message', on_message)  
script.load() 

sys.stdin.read()

 

 

  • getHook.js
Java.perform(function (){
    Java.use('com.jx885.library.http.CommAction').getSmscode.implementation=function (mi,mstr,mstr2){
        console.log(mi,mstr,mstr2);
        return this.getSmscode(mi,mstr,mstr2);
    }
});

 

3.4 连接frida服务器,对app进行hook

终端命令:

 

adb shell
su 
cd /data/local/tmp
./frida.....

端口转发

 adb forward tcp:27042 tcp:27042

运行

  • jiapeixunHook.py

结果如下:

 

PS E:\逆向工具工程\frida-dexdump\Learn> & D:/python3/python.exe e:/逆向工具工程/frida-dexdump/Learn/mode.py

1 wocaonima 15187488268

 

 

补充:grpc直接调用

 

#jiapeixunHook.py.py
import frida  # 导入frida模块
import sys  # 导入sys模块

def on_message(message, data):  # js中执行send函数后要回调的函数
    print(message)

'''
spawn模式,Frida会自行启动并注入进目标App,Hook的时机非常早
'''
# device=frida.get_remote_device()
# pid=device.spawn(['com.jx885.reward'])  #包名
# device.resume(pid)
# time.sleep(1)
# session = device.attach(pid)

'''
attach模式,Frida会附加到当前的目标进程中,即需要App处于启动状态,这也意味着只能从当前时机往后Hook,
'''
session = frida.get_remote_device().attach('驾培创业教练')  #APPNAME

with open("./frida.js") as f:
    script = session.create_script(f.read())

script.on('message', on_message)  # 加载回调函数,也就是js中执行send函数规定要执行的python函数
script.load()  # 加载脚本
currTime='20220619043925'
phone='13966552233'
type='1'
sign=script.exports.getsign(f'{currTime}{type}wocaonima{phone}')
print(sign)
#sys.stdin.read()


 

#getHook.js.js
// Java.perform(function (){
//     Java.use('com.jx885.library.http.CommAction').getSmscode.implementation=function (mi,mstr,mstr2){
//         console.log(mi,mstr,mstr2);
//         return this.getSmscode(mi,mstr,mstr2);
//     }
// });

function sign(s){
  var result='';
  Java.perform(function (){
    result=Java.use('com.jx885.library.http.network.HttpUtils').getStringMD5toUpperCase(s);
  })
  return result
}
rpc.exports={
  getsign:sign
}
© 版权声明
THE END
喜欢就支持一下吧
点赞6赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容