首页 > 其他分享 >学习笔记-Frida构造数组,对象,Map和类参数

学习笔记-Frida构造数组,对象,Map和类参数

时间:2022-11-11 09:48:38浏览次数:32  
标签:function Map Java log 笔记 console toString result Frida

Frida构造数组,对象,Map和类参数

  1. 数组/(字符串)对象数组/gson/Java.array
  2. 对象/多态,强转Java.cast
  3. 接口interface,Java.register
  4. 枚举,泛型,List,Map,Set,迭代打印
  5. 重要思路:开发时如何打印,frida中也是如何打印
  6. non-ascii 方法名 hook

0x01

1.app代码:

Log.d("SimpleArray", "onCreate: SImpleArray");
char arr[][] = new char[4][]; // 创建一个4行的二维数组
arr[0] = new char[] { '春', '眠', '不', '觉', '晓' }; // 为每一行赋值
arr[1] = new char[] { '处', '处', '闻', '啼', '鸟' };
arr[2] = new char[] { '夜', '来', '风', '雨', '声' };
arr[3] = new char[] { '花', '落', '知', '多', '少' };
Log.d("SimpleArray", "-----横版-----");
for (int i = 0; i < 4; i++) { // 循环4行
//Log.d("SimpleArraysToString", Arrays.toString(arr[i]));
//Log.d("SimpleStringBytes", Arrays.toString (Arrays.toString (arr[i]).getBytes()));
for (int j = 0; j < 5; j++) { // 循环5列
Log.d("SimpleArray", Character.toString(arr[i][j])); // 输出数组中的元素
}
if (i % 2 == 0) {
Log.d("SimpleArray", ",");// 如果是一、三句,输出逗号
} else {
Log.d("SimpleArray", "。");// 如果是二、四句,输出句号
}
}

这里直接hook java.lang.Character的toString方法,打印出参数和返回值

function main()
{
Java.perform(function(){
Java.use("java.lang.Character").toString.overload('char').implementation=function(arg1)
{
var result=this.toString(arg1);
console.log("x,result",arg1,result);
return result;
}
})
}
setImmediate(main);

2.对象数组

这里引出一个参数为char类型的数组,hook一下

function main()
{
Java.perform(function(){
Java.use("java.lang.Character").toString.overload('char').implementation=function(arg1)
{
var result=this.toString(arg1);
console.log("x,result",arg1,result);
return result;
}
Java.use("java.util.Arrays").toString.overload('[C').implementation=function(x)
{
var result=this.toString(x);
console.log("x,result",x,result);
return result;
}
})
}
setImmediate(main);

这里发现hook出来的参数发现无法打印出来,两个都是Object类型,需要有特殊的操作
1. 使用Json.stringify(x)方法可以打印出Object

Java.use("java.util.Arrays").toString.overload('[C').implementation=function(x)
{
var result=this.toString(x);
console.log("x,result",JSON.stringify(x),result);
return result;
}

  1. 肉丝表哥自己编译的一个gson包来处理
    先将下载好的dex文件放入/data/local/tmp目录下,然后frida动态加载dex,调用其中方法

function main()
{
Java.perform(function(){
/*Java.use("java.lang.Character").toString.overload('char').implementation=function(arg1)
{
var result=this.toString(arg1);
console.log("x,result",arg1,result);
return result;
}*/
Java.openClassFile("/data/local/tmp/r0gson.dex").load();
const gson=Java.use("com.r0ysue.gson.Gson");
Java.use("java.util.Arrays").toString.overload('[C').implementation=function(x)
{
var result=this.toString(x);
console.log("x,result",gson.$new().toJson(x),result);
return result;
}
})
}
setImmediate(main);

3.自己构造一个char数组对象(Java.array)

function main()
{
Java.perform(function(){
/*Java.use("java.lang.Character").toString.overload('char').implementation=function(arg1)
{
var result=this.toString(arg1);
console.log("x,result",arg1,result);
return result;
}*/
Java.openClassFile("/data/local/tmp/r0gson.dex").load();
const gson=Java.use("com.r0ysue.gson.Gson");
Java.use("java.util.Arrays").toString.overload('[C').implementation=function(x)
{
var charArray=Java.array('char',['1','2','3','4','5']);
var result=this.toString(charArray);
console.log("x,result",gson.$new().toJson(x),result);
return result;
}
})
}
setImmediate(main);

4.对象类型强制转换Java.cast

总体来说就是父类是无法强转成子类的,子类可以向上强转成父类的,然后就是查找对象时,有时候时机过早或过晚,会导致找不到实例,所以选择的话,选择延时hook,setTimeout(function,3000),然后用spawn方式启动app

function main()
{
Java.perform(function(){
/*Java.use("java.lang.Character").toString.overload('char').implementation=function(arg1)
{
var result=this.toString(arg1);
console.log("x,result",arg1,result);
return result;
}*/

Java.openClassFile("/data/local/tmp/r0gson.dex").load();
const gson=Java.use("com.r0ysue.gson.Gson");
/*
Java.use("java.util.Arrays").toString.overload('[C').implementation=function(x)
{
var charArray=Java.array('char',['1','2','3','4','5']);
var result=this.toString(charArray);
console.log("x,result",gson.$new().toJson(x),result);
return result;
}
*/
var waterhandle=null;
Java.choose("com.r0ysue.a0526printout.Water",{
onMatch:function(instance){
console.log("found instance:",instance);
console.log("water call still:",instance.still(instance));
waterhandle=instance;
},onComplete:function(){
console.log("search completed")
}
})
var JuiceHandle=Java.cast(waterhandle,Java.use("com.r0ysue.a0526printout.Juice"));
console.log("Juice fillEnergy method:",JuiceHandle.fillEnergy());

var JuiceHandle=null;
Java.choose("com.r0ysue.a0526printout.Juice",{
onMatch:function(instance){
console.log("found instance:",instance);
console.log("filling energy,",instance.fillEnergy());
JuiceHandle=instance;
},onComplete:function(){"Search Completed"}
})
var waterhandle=Java.cast(JuiceHandle,Java.use("com.r0ysue.a0526printout.Water"));
console.log("Water invoke kill");
})
}
setImmediate(main);

5。接口

可以在frida中创建一个java类,实现java层中的接口,案例:

var beer=Java.registerClass({
name:"com.r0ysue.a0526printout.beer",
implements:[Java.use('com.r0ysue.a0526printout.liquid')],
methods:{
flow:function(){
console.log("look I'm beer");
return "taste good";
}
}
});
console.log("beer.flow",beer.$new().flow())
})

这里就是新建一个类实现了对应的接口

6.枚举

Java.choose("com.r0ysue.a0526printout.Signal",{
onMatch:function(instance){
console.log("found instance:",instance)
console.log("invoke getDeclaringClass",instance.getDeclaringClass());
},onComplete:function(){console.log("Search Completed!")}
})
})

枚举可以直接看成是一个类,那么这样对frida来说就是小菜一碟了

7.泛型,List,Map,Set,迭代打印

  1. Map

function hashmap888()
{
Java.perform(function(){
Java.choose("java.util.HashMap",{
onMatch:function(instance){
if(instance.toString().indexOf("Sim"))
{
console.log("found instance",instance);
console.log("HashmapString",instance.toString());
}

},onComplete:function(){console.log("search Completed!")}
})
})
}

 

 

 

点击关注,共同学习!
[安全狗的自我修养](https://mp.weixin.qq.com/s/E6Kp0fd7_I3VY5dOGtlD4w)


[github haidragon](https://github.com/haidragon)


https://github.com/haidragon

标签:function,Map,Java,log,笔记,console,toString,result,Frida
From: https://www.cnblogs.com/haidragon/p/16879570.html

相关文章

  • 学习笔记-Frida综合案例
    Frida综合情景案例六层锁机案例调用静态函数和调用非静态函数设置(同名)成员变量内部类,枚举类的函数并hook,trace原型1查找接口,hook动态加载dex-“补充一个找interfa......
  • 学习笔记-RPC远程调用概念和实例
    RPC远程调用概念和实例一定要注意顺序,先hook,然后invoke,再rpc逆向三段:第三段RPC:RemoteProcedureCall远程调用FRIDA精髓:远程调动frida(rpc)多主机多手机多端口......
  • 学习笔记-综合案例,hook时机 ,制作dex,算法还原思路
    综合实战spawn/attach时机的选择各种主动调用/直接撸完各种hook以及构造函数动态加载自己的dexz3:约束求解/符号执行0x01通过案例来进行实战1.这里又放了个新......
  • 学习笔记-linker框架层的Hook和利用
    系统框架nativehookinit_array原理so加载执行流程hook_linkerinit_array自吐应用以32位在64位终端运行adbinstall--abiarmeabi-v7a<pathtoapk>hooklin......
  • 学习笔记-Objection环境,自动化分析和插件
    Frida简介objection与frida版本匹配安装objection连接非标准端口objection内存漫游,hook,traceobjection插件体系:Wallbreakerobjection+DEXDump脱壳0x01objec......
  • 学习笔记-Frida上手和逆向三段
    Frida上手和逆向三段FRIDA基本操作:参数,调用栈,返回值frida精髓2:方法重载,参数构造,动静态处理frida精髓3:主动调用,忽略内部细节,直接返回结果逆向三段:(hookinvoke)r......
  • 学习笔记-组件和事件hook核心原理和案例
    组件和事件的hook核心原理和案例0x01构造方法的hook的例子(java.lang.String这个随便哪个类都行)#构造方法的hookJava.use("java.lang.String").$init.implementation=........
  • 学习笔记-Frida反调试思路和hook native
    用户代码nativehookFrida反调试与反反调试基本思路(Java层API,Native层API,Syscall)六月题的Frida反调试的实现以及Native函数的Javahook以及主动调用静态注册函......
  • 学习笔记-hook和主动调用
    用户代码nativehook静态注册函数参数,返回值打印和替换调用栈主动调动符号hook==偏移hook枚举并保存结果0x01修改返回值以及参数和主动调用修改返回值修改......
  • 学习笔记-JNI框架层的Hook利用
    系统框架nativehookJNI函数符号hookJNI函数参数、返回值打印和替换动态注册JNI_OnloadhookRegisterNativesjnitrace引入一个例子,hookGetStringUTFChars这个jn......