会员登录 立即注册

搜索

Frida hook 微信小程序

[复制链接]
崎山小鹿 发表于 2024-4-17 17:16:43 | 显示全部楼层 |阅读模式
崎山小鹿
2024-4-17 17:16:43 3877 12 看全部
Hook的原理简单地说就是用一个新的函数替代掉原来的函数,在这个新的函数中你想做什么都可以,为所欲为。

Frida是一种基于JavaScript的动态分析工具,可以用于逆向开发、应用程序的安全测试、反欺诈技术等领域。Frida主要用于在已安装的应用程序上运行自己的JavaScript代码,从而进行动态分析、调试、修改等操作,能够绕过应用程序的安全措施,可以助力于对应用程序进行逆向分析。
Frida不需要依赖于任何特殊的工具或设备,只需要在目标设备上安装Frida服务器,就可以使用Frida客户端与之通信。

Frida就是一个很常用的Hook工具,只需要编写一段Javascript代码就能轻松地对指定的函数进行Hook,而且它基本上可以算是全平台的(主流平台全覆盖),除了Android以外,iOS和PC端的APP也可以用它来进行Hook,非常方便。

frida存在两种操作模式
CLI(命令行模式)
通过命令行将js代码注入进程
RPC模式
通过python将js代码注入进进程,本质上还是使用js代码进行hook
frida操作App的方式有两种
1、spwan模式
将启动app的权利交由frida控制,即使目标App已启动,也会被
frida重新启动.通过-f参数可以指定以spwan模式操作app
2、attach模式
app已经启动,frida通过ptrace注入程序从而执行hook.frida默认是attach模式操作app

Frida IDE配置
安装node和npm环境,git下载frida-agent-example仓库
git clone https://github.com/oleavr/frida-agent-example.git 下载frida-agent-example仓库
cd frida-agent-example/
npm install
fir.png

安装客户端
pip install frida
pip install frida-tools
安装客户端.png
D:\gitee\frida-agent-example>frida version
     ____
    / _  |   Frida 16.2.1 - A world-class dynamic instrumentation toolkit
   | (_| |
    > _  |   Commands:
   /_/ |_|       help      -> Displays the help system
   . . . .       object?   -> Display information about 'object'
   . . . .       exit/quit -> Exit
   . . . .
   . . . .   More info at https://frida.re/docs/home/
   . . . .
   . . . .   Connected to Local System (id=local)
Failed to spawn: unable to find process with name 'version'

查看安装版本:
D:\gitee\frida-agent-example>frida --version
16.2.1

安装服务端
用adb连接服务器
D:\Android\android-sdk\platform-tools>adb devices
List of devices attached
emulator-5554   device

adb连接服务器
adb -s emulator-5554 shell
13|star2qltechn:/ $ su

第一次安装要部署文件
star2qltechn:/ #getprop ro.product.cpu.abi
x86_64
下载frida-server服务端,下载地址:github.com/frida/frida…。注意frida版本要与frida-server版本一致
将下载的文件上传服务器,
上传可以使用pull指令,也可以通过公共文件夹
解压
# unxz frida-server-16.2.1-android-x86_64.xz

启动服务器
# ./frida-server-16.2.1-android-x86_64 &
[1] 3092
服务端运行成功

客户端连接服务端
在电脑端新开一个shell
frida-ps -U
微信截图_20240418180938.png
连接成功


将脚本注入进程
frida -U -l test.js  xueshan2

hook当前最顶层的Activity
frida -UF -l xueshan.js


微信小程序跟服务器交互最终都会调用wx.request这个api跟服务器交互

安卓有一个WebView的组件能够用于网页的解析和js的执行,并且提供了JSBridge可以支持js代码调用安卓的java代码,微信小程序正是以此为基础开发了它的微信小程序框架,微信小程序特有的API则是由这个框架中的WxJsApiBridge提供的,因此以wx.开头的API都能在这个框架中找到对应的Java代码,所以我们虽然不能直接hook js代码,但是我们可以通过hook这些js api对应的Java代码来实现微信小程序api的hook。

微信小程序wx.xxx最终都会通过WxJsApiBridge调用到java层对应的api实现,所以我们可以通过frida hook这个类相应的方法来确定wx.request在java层对应的api叫什么名字,通过jadx搜索发现有一个类叫做com.tencent.mm.appbrand.commonjni.AppBrandJsBridgeBinding
frida-ps -U
6008  com.tencent.mm
6902  com.tencent.mm:appbrand0
6913  com.tencent.mm:appbrand1
8407  com.tencent.mm:appbrand2
9041  com.tencent.mm:appbrand3
6344  com.tencent.mm:push

hook微信,微信的包名为com.tencent.mm,注入进程的时候需要
frida -U -f com.tencent.mm -l ~/Downloads/fridascript.js --no-paus


参考:
纯python实现小程序云函数抓包(附完整代码)_云函数抓包逆向
PC微信小程序未加密包提取方案 wxapkg frida版本
PC使用firda帮助反编译微信小程序
使用frida获取小程序code

Frida开启PC端小程序调试模式
                        
原文链接:
https://blog.csdn.net/OrientalGlass/article/details/130903086
https://juejin.cn/post/7244407068110372921
APP逆向神器之Frida【Android初级篇】
Android逆向学习之Frida逆向与抓包实战学习笔记(持续更新中)
Frida技术:App逆向开发屠龙刀

https://github.com/CreditTone/hooker/blob/master/hooker.py  代码库
回复

使用道具 举报

 楼主| 崎山小鹿 发表于 2024-4-18 11:22:41 | 显示全部楼层
崎山小鹿
2024-4-18 11:22:41 看全部
安装Frida IDE配置问题
Cannot find module 'undici-types' or its corresponding type declarations.
解决方法:
npm i undici-types
回复

使用道具 举报

 楼主| 崎山小鹿 发表于 2024-4-18 12:50:57 | 显示全部楼层
崎山小鹿
2024-4-18 12:50:57 看全部
adb连接模拟器问题
当我连着手机充电的时候,启动模拟器调试,执行ADB指令时,报错。
C:\Users\gaojs>adb shell
error: more than one device and emulator
C:\Users\gaojs>adb install e:\good.apk
error: more than one device and emulator

碰到这种情况,首先要查一下,是不是真的有多个设备或模拟器。
C:\Users\gaojs>adb devices
List of devices attached
emulator-5554   device
4dfadcb86b00cf05        device
发现还真是多个设备,那就需要为ADB命令指定设备的序列号了。
C:\Users\gaojs>adb -s emulator-5554 shell
也就是如上所示,给命令加上-s的参数就可以了!

测试APP:石头剪刀布请赢1000次  下载

常用命令

下面列举一些常用的ADB命令:
adb connect [IP地址]:连接模拟器。
adb disconnect [IP地址]:断开连接。
adb devices:查看连接状态。
adb shell:进入模拟器终端。
adb install [文件名]:安装应用程序。
adb uninstall [包名]:卸载应用程序。
adb logcat:查看日志。

adb pull  /sdcard/xxx  /Users/xxxx/ xxx.tx   adb pull 手机存储路径 -》 电脑路径  
adb push  /Users/xxxx/xxx.txt   /sdcard/xxx  电脑路径-》 手机存储路径

                        
原文链接:https://blog.csdn.net/gaojinshan/article/details/9455193
回复

使用道具 举报

 楼主| 崎山小鹿 发表于 2024-4-18 22:42:38 | 显示全部楼层
崎山小鹿
2024-4-18 22:42:38 看全部
注入是出现的问题:
Failed to load script: 'utf-8' codec can't decode byte 0xca in position 79: invalid continuation byte

解决办法:
修改js文件的编码为utf-8

--------------------------

Error: could not parse 'D:\gitee\frida-agent-example\xueshan\xueshan.js' line 1: expecting ','
    at <anonymous> (/frida/repl-2.js:1)

错误:无法解析 'D:\gitee\frida-agent-example\xueshan\xueshan.js' 第 1 行:期待 ','
    在 <匿名> (/frida/repl-2.js:1)
回复

使用道具 举报

 楼主| 崎山小鹿 发表于 2024-4-23 23:00:11 | 显示全部楼层
崎山小鹿
2024-4-23 23:00:11 看全部
;;(async ()=>{})(
).catch((error)=>{
    console.error(error.stack);
});
异步/等待模式是许多编程语言的语法特征,它允许以类似于普通同步函数的方式构造异步、非阻塞 函数。它在语义上与协程的概念相关,并且通常使用类似的技术来实现,主要目的是为程序提供在等待长时间运行的异步任务完成时执行其他代码的机会
回复

使用道具 举报

 楼主| 崎山小鹿 发表于 2024-4-24 10:29:41 | 显示全部楼层
崎山小鹿
2024-4-24 10:29:41 看全部
//windows系统下hook微信
const arr2str = (bytes) => String.fromCharCode(...new Uint8Array(bytes))
const targetPtr = Module.getBaseAddress('WeChatAppEx.exe').add('0x2C1CBB8')
Interceptor.attach(targetPtr, {
  onEnter(args) {
    void args
    const length = 0x20
    const rdx = this.context.rdx
    const rbp = this.context.rbp
    const p1 = rdx.readPointer()
    const p2 = rbp.readPointer()
    // 将原始 MD5 的数据覆盖到当前 MD5
    const oriMd5 = p1.readByteArray(length)
    const curMd5 = p2.readByteArray(length)
    const m1 = arr2str(curMd5)
    const m2 = arr2str(oriMd5)
    if (!m2 || m1 === m2) return
    p2.writeByteArray(oriMd5)
    console.log(`[+] Replaced: ${m1} -> ${m2}`)
  },
})
回复

使用道具 举报

 楼主| 崎山小鹿 发表于 2024-4-24 10:51:28 | 显示全部楼层
崎山小鹿
2024-4-24 10:51:28 看全部
function main(){
    console.log("Script loaded success")
    //Java.perform是frida的api函数,可以将其中的脚本注入到java运行库,参数是一个匿名函数
    //函数的主体内容是监控和修改java函数逻辑的主题内容,任何针对java层的操作都必须在这个api函数中
    Java.perform(function(){
        console.log("Inside java perform!")
        //java.use获取hook函数所在类的类名
        var Mainactivity=Java.use('com.example.hooktest1.MainActivity')
        console.log("Java.use.success!")
        //通过.连接函数名,比如这里的函数名是fun,表示想hookfun函数
        //implementation表示实现该函数,也就是hook掉,这里可以写自己的函数
        Mainactivity.fun.implementation=function(x,y)
        {
            console.log("x=",x,"y=",y,"x+y=",x+y)   //打印参数,这里应该是函数原本没有被修改时的参数,即函数正常执行时的参数情况
            var retvalue=this.fun(666,66)           //再次调用原函数并且传递原本的参数fun,即重新执行原函数,在这里就可以修改参数
            return retvalue      //返回函数返回值,返回值最好不要修改类型,否则可能出错
        }
    })
}
//参数是要被执行的函数,例如传入main,表示frida注入app后立刻执行main
//setTimeout可以指定frida注入app多久之后执行函数,用于延时注入
setImmediate(main)

回复

使用道具 举报

 楼主| 崎山小鹿 发表于 2024-4-24 10:54:16 | 显示全部楼层
崎山小鹿
2024-4-24 10:54:16 看全部
//HOOK 启动配置
Interceptor.attach(address.LaunchAppletBegin, {
    onEnter(args) {
        send("HOOK到小程序加载! " + readStdString(args[1]))
        for (var i = 0; i < 0x1000; i+=8) {
            try {
                var s = readStdString(args[2].add(i))
                var s1 = s.replaceAll("md5", "md6").replaceAll('"enable_vconsole":false', '"enable_vconsole": true')
                if (s !== s1) {
                    //send("拦截到小程序加载")
                    writeStdString(args[2].add(i), s1)
                }
            } catch (a) {
            }
        }
    }
})
//HOOK F12配置 替换原本内容
Interceptor.attach(address.WechatAppHtml, {
    onEnter(args) {
        this.context.rdx = address.WechatWebHtml;
        send("已还原完整F12")
    }
})
回复

使用道具 举报

 楼主| 崎山小鹿 发表于 2024-4-24 12:16:46 | 显示全部楼层
崎山小鹿
2024-4-24 12:16:46 看全部
//打印云函数
const oldCloud = wx.cloud;
const oriCF = oldCloud.callFunction
oldCloud.callFunction = function (config) {
    const _success = config.success
    config.success = function (res){
      console.log('callFunction===>',res);
      _success(res);
    }
    oriCF(config)
}
回复

使用道具 举报

 楼主| 崎山小鹿 发表于 2024-5-22 22:11:43 | 显示全部楼层
崎山小鹿
2024-5-22 22:11:43 看全部
Frida 读取RDX

address.WechatAppjsdata = 00007FF7D50F63A5   
Interceptor.attach(address.WechatAppjsdata , {
    onEnter(args) {         
        send("读取js内容:"+readStdString(this.context.rdx))
    }
})
回复

使用道具 举报

  • 您可能感兴趣
  • 生成身临其境的环境模型
    生成身临其境的环境模型
    清华大学创作的AI软件 aiuni Aiuni.ai是一个基于Unique3D的在线AI图片转3D模型生成建
    09-07
  • 站长日记-天道与畜生道
    站长日记-天道与畜生道
    天道无情,但众生平等,无为却处处体现博爱。畜生道有情,讲的是尊卑次序只为繁衍,处
    06-20
  • 墨者的几个阶段
    墨者的几个阶段
    一、知毛泽东,不知有墨子。 二、知墨子,但依然儒法道行事。 三、知墨子,尝试墨家
    08-31
  • 图生产3D模型
    图生产3D模型
    https://hyperhuman.deemos.com/ 上传图片,点击生成 可以多生成几次,点击应用
    08-30
  • 如何给3D人物换衣服CC4
    如何给3D人物换衣服CC4
    1.导入人物 2.设置人物Apose 3.导入衣服 create -> accessory 选择fbx文件 设置
    08-30
您需要登录后才可以回帖 登录 | 立即注册 |

本版积分规则 返回列表

查看:3877 | 回复:12

  • 生成身临其境的环境模型

    清华大学创作的AI软件 aiuni Aiuni.ai是一个基于Unique3D的在线AI图片转3D模型生成建

    阅读:28|2024-09-07
  • 墨者的几个阶段

    一、知毛泽东,不知有墨子。 二、知墨子,但依然儒法道行事。 三、知墨子,尝试墨家

    阅读:279|2024-08-31
  • 图生产3D模型

    https://hyperhuman.deemos.com/ 上传图片,点击生成 可以多生成几次,点击应用

    阅读:254|2024-08-30
  • 如何给3D人物换衣服CC4

    1.导入人物 2.设置人物Apose 3.导入衣服 create -> accessory 选择fbx文件 设置

    阅读:245|2024-08-30
  • 墨子平台总设计师

    相濡以墨,用墨子思想重塑商业,以商助墨,以墨韵商。商品把关,营销把关,职务把关

    阅读:228|2024-08-29
  • 招聘AI模型训练师

    训练人物模型,对换脸技术有研究。

    阅读:201|2024-08-29
  • 墨家商品联盟

    大家好,我是相濡以墨,我是墨子的忠实粉丝,现在墨家的朋友越来越多,很多墨家人多才

    阅读:230|2024-08-29
  • 精彩人工智能影视分享

    精彩人工智能影视分享 通过百度网盘分享的文件:AI影视 链接:https://pan.baidu.com

    阅读:276|2024-08-28
  • 墨子从两千年的沉睡中醒来

    大家好,我是墨翟,就是你们后世称之为的墨子,我突然从战国时代的沉睡中苏醒,置身于

    阅读:301|2024-08-24
  • 机器人模型制作

    使用图片 关键词: 未来人机合体,科幻,真人头部,头部以下是机器身体,身体透明外

    阅读:294|2024-08-22
金双石科技,软件开发20年,技术行业领先,您的满意,就是我们的目标,认真负责,开拓进取,让成品物超所值
关于我们
公司简介
发展历程
联系我们
本站站务
友情链接
新手指南
内容审核
商家合作
广告合作
商家入驻
新闻合作

手机APP

官方微博

官方微信

联系电话:15876572365 地址:深圳市宝安区西乡街道宝民二路宝民花园 ( 粤ICP备2021100124号-1 ) 邮箱:qishanxiaolu@qq.com
QQ|Powered by Discuz! X3.5 © 2001-2024 Discuz! Team.
快速回复 返回顶部 返回列表