Android frida hook (学习分享)
frida模块
参考:
https://www.52pojie.cn/thread-1823118-1-1.html
https://www.52pojie.cn/thread-1840174-1-1.html
https://www.52pojie.cn/thread-1859820-1-1.html
环境配置
安装tool
pip install frida-tools
下载对应版本服务
https://github.com/frida/frida/releases
开启服务后在命令行输入frida-ps -U显示手机进程
启用以下命令注入hook
frida -U 进程名 -l hook脚本.js
Frida
内部类用 $ 分割
匿名内部类用 $$ 分割
HOOK方法
普通方法
通过overload来区别重载
function hookTest(){
var demo = Java.use("com.zj.wuaipojie.Demo");
demo.a.overload("java.lang.String").implementation = function(str){
var ret = this.a(str);
console.log("\na_str:" +str);
console.log("a_ret:" +ret);
return ret;
}
}
function main(){
Java.perform(function(){
hookTest();
});
}
setImmediate(main);
构造方法
将函数名换为$init
function hookTest(){
var demo = Java.use("com.zj.wuaipojie.Demo");
demo.$init.overload().implementation = function(){
this.init();
}
}
function main(){
Java.perform(function(){
hookTest();
});
}
setImmediate(main);
HOOK变量
静态变量
function hookTest(){
var demo = Java.use("com.zj.wuaipojie.Demo");
demo.staticField.value = "hook_test";
console.log(demo.staticField.value);
}
function main(){
Java.perform(function(){
hookTest();
});
}
setImmediate(main);
成员变量(必须先加载类)
function hookTest() {
var Demo = Java.use("com.zj.wuaipojie.Demo");
Demo.$init.overload().implementation = function () {
console.log("Demo.$init()");
this.$init();
this.publicInt.value = 9999;
this.privateInt.value = 8888;
};
}
function main() {
Java.perform(function () {
hookTest();
});
}
setImmediate(main);
主动调用
静态方法
function hookTest() {
var Demo = Java.use("com.zj.wuaipojie.Demo");
Demo.func();
};
}
function main() {
Java.perform(function () {
hookTest();
});
}
setImmediate(main);
成员方法(必须先加载类)
function hookTest() {
var Demo = Java.use("com.zj.wuaipojie.Demo");
Java.choose("com.zj.wuaipojie.Demo", {
onMatch: function (instance) {
console.log("onMatch");
var ret = instance.privateFunc("aaaaaaaa");
},
onComplete: function () {
console.log("onComplete");
}
});
}
function main() {
Java.perform(function () {
hookTest();
});
}
setImmediate(main);
HOOK Native
直接查找函数
function hookNative() {
var vipLevel = Module.findExportByName("lib52pojie.so", "Java_com_zj_wuaipojie_util_SecurityUtil_vipLevel");
Interceptor.attach(vipLevel, {
onEnter: function (args) {
//1读取参数(string)
var jString = Java.cast(args[2], Java.use('java.lang.String'));
console.log("参数:", jString.toString());
//2读取参数(string)
var JNIEnv = Java.vm.getEnv();
var str = JNIEnv.getStringUtfChars(args[2], 0).readCString();
console.log("参数:", str);
},
onLeave: function (retval) {
//修改返回值(string)
var JNIEnv = Java.vm.getEnv();
var jstring = JNIEnv.newStringUtf("至尊会员");
retval.replace(jstring);
}
});
}
基址+偏移
function hookNative() {
var base = Module.findBaseAddress("lib52pojie.so");
var diamondNum = base.add(0x01071C);
Interceptor.attach(diamondNum, {
onEnter: function (args) {
},
onLeave: function (retval) {
retval.replace(9999);
}
});
}
Hook_dlopen
function hookNative() {
var dlopen = Module.findExportByName(null, "dlopen");
Interceptor.attach(dlopen, {
onEnter: function (args) {
var so_name = args[0].readCString();
if (so_name.indexOf("lib52pojie.so") >= 0) this.call_hook = true;
}, onLeave: function (retval) {
if (this.call_hook) hookJava();
}
});
// 高版本Android系统使用android_dlopen_ext
var android_dlopen_ext = Module.findExportByName(null, "android_dlopen_ext");
Interceptor.attach(android_dlopen_ext, {
onEnter: function (args) {
var so_name = args[0].readCString();
if (so_name.indexOf("lib52pojie.so") >= 0) this.call_hook = true;
}, onLeave: function (retval) {
if (this.call_hook) hookJava();
}
});
}
写数据
const filePath = "/data/user/0/com.zj.wuaipojie/test.txt";
try {
const file = new File(filePath, "w");
file.write(str);
file.flush();
file.close();
console.log(`[+] 字符串已写入 ${filePath}`);
} catch (e) {
console.error(`[!] 文件写入失败: ${e.message}`);
}
Inline hook
直接操作寄存器中的值
function inlinehook(){
var Check = Module.getBaseAddress("lib52pojie.so").add(0x10428);
Interceptor.attach(Check, {
onEnter: function (args) {
console.log("test:", this.context.x22);
this.context.x22 = ptr(1);
console.log("test:", this.context.x22);
},
onLeave: function (retval) {
console.log("Check ret value: " + retval);
}
});
}
so函数调用
function callfunc(){
var aesAdress = Module.getBaseAddress("lib52pojie.so").add(0xE1C0);
var aesfunc = new NativeFunction(aesAdress, "pointer", ["pointer", "pointer"]);
var aeskey = Memory.allocUtf8String("wuaipojie0123456");
var aesFlag = Memory.allocUtf8String("OOmGYpk6s0qPSXEPp4X31g==");
var aesRet = aesfunc(aesFlag,aeskey);
console.log("aesRet:" + aesRet.readCString().toString());
}
frida-trace
跟踪so
frida-trace -U "com.zj.wuaipojie" -F -i "libwuaipojie.so"
Android frida hook (学习分享)的更多相关文章
- 2021年正确的Android逆向开发学习之路
2021年正确的Android逆向开发学习之路 说明 文章首发于HURUWO的博客小站,本平台做同步备份发布.如有浏览或访问异常或者相关疑问可前往原博客下评论浏览. 原文链接 2021年正确的Andr ...
- Android 获取浏览器当前分享页面的截屏
Android 获取浏览器当前分享页面的截屏 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/BrowserScreenShotActivity 文中 ...
- Android开发该学习哪些东西?
开篇: 本人也是众多Android开发道路上行走的一员,听了不少大神的知乎live,自己也看了不少书,也和不少前辈交流过,所以在这里分享一下Android开发应该学习的书籍以及知识,当然,也包括一些方 ...
- 我的Android之旅——学习、项目、心态
本文作者: 伯乐在线 - 唐韧 .未经许可,禁止转载!欢迎分享原创到伯乐头条. 来源:唐韧 学习Android也一年多了,项目做了五六个,有大有小,有难有易.一直以来都没有好好总结过,今天周六休息,就 ...
- Android项目源码分享
http://blog.csdn.net/gao_chun/article/details/47263063 Android项目源码分享 给大家分享几个Android开发项目源码,大部分功能相信可以在 ...
- 【干货推荐】Android开发该学习哪些东西?
开篇: 本人也是众多Android开发道路上行走的一员,听了不少大神的知乎live,自己也看了不少书,也和不少前辈交流过,所以在这里分享一下Android开发应该学习的书籍以及知识,当然,也包括一些方 ...
- ElasticSearch 5学习(7)——分布式集群学习分享2
前面主要学习了ElasticSearch分布式集群的存储过程中集群.节点和分片的知识(ElasticSearch 5学习(6)--分布式集群学习分享1),下面主要分享应对故障的一些实践. 应对故障 前 ...
- ElasticSearch 5学习(6)——分布式集群学习分享1
在使用中我们把文档存入ElasticSearch,但是如果能够了解ElasticSearch内部是如何存储的,将会对我们学习ElasticSearch有很清晰的认识.本文中的所使用的ElasticSe ...
- android NDK 实用学习(五)-c++端调用java接口
1,阅读此文章前请阅读前面文章,以免阅读出现障碍: android NDK 实用学习(一)-获取java端类及其类变量 android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值 ...
- android NDK 实用学习(三)- java端类对象的构造及使用
1,读此文章前我假设你已经读过: android NDK 实用学习-获取java端类及其类变量 android NDK 实用学习-java端对象成员赋值和获取对象成员值 2,java端类对象的构造: ...
随机推荐
- WebClient 获取不到请求体如何破解?
起初在开发过程中,我遇到了一个困扰我的问题:当我将对象转换为JSON时,得到的结果与最终传给第三方接口的请求体并不一致.这个问题导致我在进行加密操作时出现了错误,因为加密的过程是基于请求体的,而请求体 ...
- SAM 学习笔记
发现自己根本没有 SAM 基础,所以想补一篇学习笔记. SAM SAM 是一个可以接受字符串 \(s\) 的所有后缀的最小 \(DFA\)(确定性有限状态自动机).不过他最大的用处和后缀数组一样,都是 ...
- 海康SDK报错Structure.getFieldOrder()
就是你调用的这个结构体以及其引用的其他结构体,可能没有getFieldOrder()的方法,你只要按照顺序把他填上去就好了.比如 public static class NET_DVR_TIME ex ...
- Zookeeper - 本地模式部署
本地模式部署 zoo.cfg 参数解析 本地模式部署 1.上传zookeeper的安装包并解压 tar -zxvf zookeeper-x.x.x.tar.gz -c /xxx/xxx/ 2.将 zo ...
- Featurewiz-Polars:一种强大且可扩展的特征选择解决方案,适用于XGBoost
前言:"Featurewiz-Polars"是一个用于特征工程的 Python 库,结合了特征选择和特征生成的功能.它基于"Polars",这是一个高性能的 D ...
- GPT-4.5 感觉有点拉胯,但其实是 OpenAI 迄今为止最大的一步赌注
Alberto Romero I. GPT-4.5 就是起跳前的助跑那一步 OpenAI 推出了 GPT-4.5(官方博客.系统卡片.演示视频),这是他们最新也是目前最大的一款 AI 模型.他们其实一 ...
- halcon 入门教程(六) 图像匹配(基于形状的模板匹配)与缺陷检测区域定位
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/18783476 有兴趣可以多看其他的halcon教程 halcon 学习教程目录 本篇主要讲一下 ...
- SQL INSERT批量插入方式
1.常规INSERT写法 INSERT INTO ... VALUES (...); INSERT INTO 表名( `字段1`, `字段2`) VALUES ('字段1的值', '字段2的值') ...
- Linux 系统出现异常排查思路
16 系统出现异常排查思路16.1 查看用户信息16.1.1查看当前的用户# who 04:39:39 up 1:30, 1 user, load average: 0.01, 0.01, 0. ...
- [源码系列:手写spring] IOC第十二节:FactoryBean
内容介绍 在 Spring 框架中,FactoryBean 是一个特殊的工厂类接口,用于创建和管理复杂的 bean 对象.它允许你自定义 bean 的创建逻辑,并且可以在 bean 创建过程中执行一些 ...