frida 注入命令行使用
启动server
adb shell “.//data/local/tmp/xxoo12.8.11”
端口转发
adb forward tcp:27043 tcp:27043
查询包名
adb shell pm list packages -3
注入
frida -U -l js文件 包名
setImmediate(main);
function main(){
Java.perform(function(){
//tongsha();
zhixie();
});
}
//获取包名类名
//定义方法
//构造方法类名和方法一样$inti
//重载方法.overload("java.lang.String")
//构造.$init
//setImmediate防止注入超时
// 获取参数两种方式 一种给形参 第二种arguments[0]获取
//
function zhixie(){
var nuo = Java.use("com.leyida.cloud.utils.RSAUtil");
nuo.encryptByPublicKey.implementation=function(a){
console.log(" ");
console.log(" ");
console.log("a:"+a);
console.log("=================***自设hook开始***=================");
var data=this.encryptByPublicKey(a);//切记修改函数名
console.log("结果:"+data);
console.log("=================***自设hook结束***=================");
showStacks();
console.log("=================***调用堆栈打印***=================");
return data;
}
}
function 读取类变量(){
Java.perform(function(){
//获取java类 类.变量名.value 方法读取
//要修改的话直接赋值l.E.value='诺诺'
var l = Java.use("com.xiaojianbang.app.RSAHex");
console.log(l.E.value);
console.log(l.N.value);
});
}
function 静态方法的主动调用(){
Java.perform(function(){
//静态方法的主动调用
var AES = Java.use("com.xiaojianbang.app.MD5");
var str = Java.use("java.lang.String");
var base64 = Java.use("android.util.Base64");
var bytes = str.$new("nuonuo").getBytes();
console.log(str.$new(bytes))
console.log(JSON.stringify(bytes));
console.log(base64.encodeToString(str.$new("nuonuo").getBytes(),0))
var rea=AES.md5_1("活活");
console.log(rea);
});
}
function 静态方法的主动调用例子(){
Java.perform(function(){
//静态方法的主动调用
var rsa = Java.use("com.xiaojianbang.app.RSA");
var str = Java.use("java.lang.String");
var base64 = Java.use("android.util.Base64");
var bytes = str.$new("xiaojianbang").getBytes();
console.log(JSON.stringify(bytes));
var retval = rsa.encrypt(bytes);
var result = base64.encodeToString(retval, 0);
console.log(result);
//非静态方法的主动调用1 (新建一个对象去调用)
var res = Java.use("com.xiaojianbang.app.Money").$new("日元", 300000).getInfo();
console.log(res);
var utils = Java.use("com.xiaojianbang.app.Utils");
res = utils.$new().myPrint(["xiaojianbang","is very good"," ","zygx8","is very good"]);
console.log(res);
//非静态方法的主动调用2 (获取已有的对象调用)
Java.choose("com.xiaojianbang.app.Money",{
onMatch: function(obj){
if(obj._name.value == "美元"){
res = obj.getInfo();
console.log(res);
}
},
onComplete: function(){
}
});
});
}
function 获取所有已加载的类(){
//frida互交主动调用不用提前注入
Java.perform(function(){
//要过滤app的包名
var baoming="com.mg.ec"
Java.enumerateLoadedClasses({
onMatch: function(name, handle){
if(name.indexOf(baoming) != -1){
console.log(name);
}
},
onComplete: function(){
}
});
});
}
function 获取所有已加载的类的所有方法(){
Java.perform(function(){
// Java.enumerateLoadedClasses({
// onMatch: function(name, handle){
// if(name.indexOf("com.xiaojianbang.app") != -1){
// console.log(name);
// var clazz = Java.use(name);
// console.log(clazz);
// var methods = clazz.class.getDeclaredMethods();
// for(var i = 0; i < methods.length; i++){
// console.log(methods[i]);
// }
// }
// },
// onComplete: function(){
// }
// });
//过滤apk包名
var baoming="com.xiaojianbang.app"
var classes = Java.enumerateLoadedClassesSync();
for(var i = 0; i < classes.length; i++){
if(classes[i].indexOf(baoming) != -1){
console.log('');
console.log('类名*************'+classes[i]);
var clazz = Java.use(classes[i]);
var methods = clazz.class.getDeclaredMethods();
for(var j = 0; j < methods.length; j++){
console.log('方法:'+methods[j]);
}
console.log('');
}
}
});
}
function Hook类的所有方法(){
Java.perform(function(){
//给一个类名
var md5 = Java.use("com.xiaojianbang.app.MD5");
var methods = md5.class.getDeclaredMethods();
for(var j = 0; j < methods.length; j++){
var methodName = methods[j].getName();
console.log(methodName);
for(var k = 0; k < md5[methodName].overloads.length; k++){
md5[methodName].overloads[k].implementation = function(){
for(var i = 0; i < arguments.length; i++){
console.log(arguments[i]);
}
return this[methodName].apply(this, arguments);
}
}
}
});
}
function tuoke(){
//参数2的OpenMemory参数自己把手机的libart.so pull出来.然后看看自己手机OpenMemory的对应签名函数名.
Interceptor.attach(Module.findExportByName("libart.so", "_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_7OatFileEPS9_"), {
onEnter: function (args) {
//dex起始位置
var begin = args[1]
//打印magic
console.log("magic : " + Memory.readUtf8String(begin))
//dex fileSize 地址
var address = parseInt(begin,16) + 0x20
//dex 大小
var dex_size = Memory.readInt(ptr(address))
console.log("dex_size :" + dex_size)
//dump dex 到/data/data/pkg/目录下
var packageName = "com.androidapp.mibo" // 此处修改为要hook的包名
var file = new File("/data/data/"+packageName+"/" + dex_size + ".dex", &