android hooking list classes com.example.junior on (google: 6.0.1) [usb] # android hooking list class_methods com.example.junior.util.Arith public static java.lang.String com.example.junior.util.Arith.add(double,double) public static java.lang.String com.example.junior.util.Arith.add(java.lang.String,java.lang.String) public static java.lang.String com.example.junior.util.Arith.div(double,double) public static java.lang.String com.example.junior.util.Arith.div(double,double,int) public static java.lang.String com.example.junior.util.Arith.div(java.lang.String,java.lang.String) public static java.lang.String com.example.junior.util.Arith.div(java.lang.String,java.lang.String,int) public static java.lang.String com.example.junior.util.Arith.mul(double,double) public static java.lang.String com.example.junior.util.Arith.mul(java.lang.String,java.lang.String) public static java.lang.String com.example.junior.util.Arith.round(double,int) public static java.lang.String com.example.junior.util.Arith.sub(double,double) public static java.lang.String com.example.junior.util.Arith.sub(java.lang.String,java.lang.String)
Found 11 method(s)
Ps: objection使用 android hooking list classes 缓存太大时可以使用如下方法
com.example.junior on (Android: 6.0.1) [usb] # jobs list Job ID Hooks Type ----------- ----- --------------------------------------------------- gj9zcimwkem 2 watch-method for: com.example.junior.util.Arith.sub 7lyewxvtoip 2 watch-method for: com.example.junior.util.Arith.add hsdvh65digm 2 watch-method for: com.example.junior.util.Arith.mul i5opzx0y42e 4 watch-method for: com.example.junior.util.Arith.div
同时编写frida脚本进行Hook
hook.js
frida -F -l hook.js
function main(){ Java.perform(function(){ var Arith = Java.use('com.example.junior.util.Arith') Arith.sub.implementation = function(str,str2){ var result = this.sub(str,str2) console.log("str,str2,result=>", str,str2,result) //return result //打印Java调用栈 console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new())) return result }
}) } setImmediate(main)
发现存在报错
[Android Emulator 5554::com.example.junior]-> Error: sub(): has more than one overload, use .overload(<signature>) to choose from: .overload('java.lang.String', 'java.lang.String') .overload('double', 'double') at throwOverloadError (frida/node_modules/frida-java-bridge/lib/class-factory.js:1020) at frida/node_modules/frida-java-bridge/lib/class-factory.js:707 at /hook.js:11 at frida/node_modules/frida-java-bridge/lib/vm.js:11 at E (frida/node_modules/frida-java-bridge/index.js:346) at frida/node_modules/frida-java-bridge/index.js:332 at input:1
我们根据之前Objection的结果
com.example.junior on (Android: 6.0.1) [usb] # (agent) [gj9zcimwkem] Called com.example.junior.util.Arith.sub(java.lang.String, java.lang.String)
function main(){ Java.perform(function(){ var Arith = Java.use('com.example.junior.util.Arith') Arith.sub.overload('java.lang.String','java.lang.String').implementation = function(str,str2){ var result = this.sub(str,str2) console.log("str,str2,result=>", str,str2,result) //return result //打印Java调用栈 console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new())) return result }
}) }
setImmediate(main)
使用脚本对参数进行修改,将第二个参数修改为123
function main(){ Java.perform(function(){ var Arith = Java.use('com.example.junior.util.Arith') Arith.sub.overload('java.lang.String','java.lang.String').implementation = function(str,str2){ var result = this.sub(str,"123") console.log("str,str2,result=>", str,str2,result) //return result //打印Java调用栈 console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new())) return result }
function callSub(){ Java.perform(function(){ var Arith = Java.use('com.example.junior.util.Arith') var JavaString = Java.use('java.lang.String') var result = Arith.sub(JavaString.$new("123"),JavaString.$new("111")) console.log("123 - 111 = ", result) }) }
function CallSub(a,b){ Java.perform(function(){ var Arith = Java.use('com.example.junior.util.Arith') var JavaString = Java.use('java.lang.String') var result = Arith.sub(JavaString.$new(a),JavaString.$new(b)) console.log(a,"-",b,"=",result) }) }
rpc.exports = { sub : CallSub }
/* rpc.exports = { sub: function CallSub(a,b){ Java.perform(function(){ var Arith = Java.use('com.example.junior.util.Arith') var JavaString = Java.use('java.lang.String') var result = Arith.sub(JavaString.$new(a),JavaString.$new(b)) console.log(a,"-",b,"=",result) // 最终修改为 send(a,"-",b,"=",result) }) } } */
com.shimeng.qq2693533893 on (Android: 6.0.1) [usb] # (agent) [kbvime5ddss] Called android.media.AudioManager.getStreamMaxVolume(int) (agent) [kbvime5ddss] Called android.media.AudioManager.getService() (agent) [kbvime5ddss] Called android.media.AudioManager.setStreamVolume(int, int, int) (agent) [kbvime5ddss] Called android.media.AudioManager.getContext() (agent) [kbvime5ddss] Called android.media.AudioManager.getContext() (agent) [kbvime5ddss] Called android.media.AudioManager.getStreamMaxVolume(int) (agent) [kbvime5ddss] Called android.media.AudioManager.getService() (agent) [kbvime5ddss] Called android.media.AudioManager.getStreamVolume(int) (agent) [kbvime5ddss] Called android.media.AudioManager.getService() (agent) [kbvime5ddss] Called android.media.AudioManager.getStreamVolume(int) (agent) [kbvime5ddss] Called android.media.AudioManager.getService() (agent) [kbvime5ddss] Called android.media.AudioManager.getStreamMaxVolume(int) (agent) [kbvime5ddss] Called android.media.AudioManager.getService() (agent) [kbvime5ddss] Called android.media.AudioManager.setStreamVolume(int, int, int) (agent) [kbvime5ddss] Called android.media.AudioManager.getContext() (agent) [kbvime5ddss] Called android.media.AudioManager.getContext() (agent) [kbvime5ddss] Called android.media.AudioManager.getStreamMaxVolume(int) (agent) [kbvime5ddss] Called android.media.AudioManager.getService() (agent) [kbvime5ddss] Called android.media.AudioManager.getStreamVolume(int) (agent) [kbvime5ddss] Called android.media.AudioManager.getService() (agent) [kbvime5ddss] Called android.media.AudioManager.getStreamVolume(int) (agent) [kbvime5ddss] Called android.media.AudioManager.getService() (agent) [kbvime5ddss] Called android.media.AudioManager.getStreamMaxVolume(int) (agent) [kbvime5ddss] Called android.media.AudioManager.getService() (agent) [kbvime5ddss] Called android.media.AudioManager.setStreamVolume(int, int, int) (agent) [kbvime5ddss] Called android.media.AudioManager.getContext() (agent) [kbvime5ddss] Called android.media.AudioManager.getContext()
setStreamVolume (int streamType, int index, int flags) 。
//现在只需要hook android.media.AudioManager的setStreamVolume //将此函数中的第二个参数置0即可 //hook 代码如下: function hook_audio(){ Java.perform(function(){ console.log("Inside java perform"); Java.use("android.media.AudioManager").setStreamVolume.implementation = function(int1,int2,int3){ var res = this.setStreamVolume(int1,0,int3); return res; } }); }
第一层
hook Called com.shimeng.qq2693533893.MyServiceOne后进行点击操作
(agent) [59xlexa5rds] Called com.shimeng.qq2693533893.MyServiceOne.颜如玉(java.lang.String) (agent) [59xlexa5rds] Called com.shimeng.qq2693533893.MyServiceOne.SHA1(java.util.Map) (agent) [59xlexa5rds] Called com.shimeng.qq2693533893.MyServiceOne.getOrderByLexicographic(java.util.Map) (agent) [59xlexa5rds] Called com.shimeng.qq2693533893.MyServiceOne.getParamsName(java.util.Map) (agent) [59xlexa5rds] Called com.shimeng.qq2693533893.MyServiceOne.lexicographicOrder(java.util.List) (agent) [59xlexa5rds] Called com.shimeng.qq2693533893.MyServiceOne.splitParams(java.util.List, java.util.Map) (agent) [59xlexa5rds] Called com.shimeng.qq2693533893.MyServiceOne.颜如玉(java.lang.String) (agent) [59xlexa5rds] Called com.shimeng.qq2693533893.MyServiceOne.SHA1(java.util.Map) (agent) [59xlexa5rds] Called com.shimeng.qq2693533893.MyServiceOne.getOrderByLexicographic(java.util.Map) (agent) [59xlexa5rds] Called com.shimeng.qq2693533893.MyServiceOne.getParamsName(java.util.Map) (agent) [59xlexa5rds] Called com.shimeng.qq2693533893.MyServiceOne.lexicographicOrder(java.util.List) (agent) [59xlexa5rds] Called com.shimeng.qq2693533893.MyServiceOne.splitParams(java.util.List, java.util.Map)
function Find_Code(){ Java.perform(function(){ var javaString = Java.use('java.lang.String')
for(var i=999;i<10000;i++){ var i = javaString.$new(String(i)); var Code = Java.use("com.shimeng.颜如玉.颜如玉QQ2693533893").get(i); var v3 = Java.use("com.shimeng.qq2693533893.MyServiceOne").颜如玉(Java.use("com.shimeng.颜如玉.颜如玉QQ2693533893").getSaltMD5((javaString.$new(String(i^1288))))); var v3 = javaString.$new(final_last9).replaceAll("\\D+", "");
console.log("i,Code,v3:",i,Code,v3); if (Code == "额❥/嘻"){ // 5147 break; } }
for(var j=1;j<1000;j++){ var j = javaString.$new(String(j)); var v2_3 = Java.use("com.shimeng.颜如玉.颜如玉QQ2693533893").getSaltMD5(Java.use("com.shimeng.qq2693533893.MyServiceOne").颜如玉(j)); // console.log("l, v2_3:",j,v2_3); if(v2_3 == '9DDEB743E935CE399F1DFAF080775366'){ console.log("v2_3:",j); } }
// v2_3: 358
重新打开应用
Code 7363
Hook1.js
function Find_Code(){ Java.perform(function(){ var javaString = Java.use('java.lang.String') for(var j=1;j<1000;j++){ var j = javaString.$new(String(j)); var v2_3 = Java.use("com.shimeng.颜如玉.颜如玉QQ2693533893").getSaltMD5(Java.use("com.shimeng.qq2693533893.MyServiceOne").颜如玉(j)); // console.log("l, v2_3:",j,v2_3); if(v2_3 == '9DDEB743E935CE399F1DFAF080775366'){ console.log("v2_3:",j); } }
var i = javaString.$new(String(3744)); var Code = Java.use("com.shimeng.颜如玉.颜如玉QQ2693533893").get(i); var v3 = Java.use("com.shimeng.qq2693533893.MyServiceOne").颜如玉(Java.use("com.shimeng.颜如玉.颜如玉QQ2693533893").getSaltMD5((javaString.$new(String(i^1288))))); var v3 = javaString.$new(v3).replaceAll("\\D+", ""); var resu1 = "358" + javaString.$new(v3).substring(0, 9); console.log("i,Code,v3,resu1:",i,Code, v3, resu1); }) }
function Find_Code(){ Java.perform(function(){ var javaString = Java.use('java.lang.String') for(var j=1;j<1000;j++){ var j = javaString.$new(String(j)); var v2_3 = Java.use("com.shimeng.颜如玉.颜如玉QQ2693533893").$new().getTwiceMD5ofString(Java.use("com.shimeng.颜如玉.颜如玉QQ2693533893").hex_sha1(j)); //console.log("l, v2_3:",j,v2_3); if(v2_3 == '8D4FF507DCDA63C201EB8B99D4170900'){ console.log("v2_3:",j); } }
var i = javaString.$new(String(44207)); var Code = Java.use("com.shimeng.颜如玉.颜如玉QQ2693533893").get(i); var v3 = Java.use("com.shimeng.颜如玉.颜如玉QQ2693533893").hex_sha1(Java.use("com.shimeng.颜如玉.颜如玉QQ2693533893").$new().getTwiceMD5ofString(i)); var v3 = javaString.$new(v3).replaceAll("\\D+", ""); var resu2 = "694" + javaString.$new(v3).substring(0, 9); console.log("i,Code,v3,resu2",i,Code,v3,resu2)
function Find_Code(){ Java.perform(function(){ console.log("Inside java perform"); var val = "123123"; var string_class = Java.use("java.lang.String"); var flag = Java.use("com.shimeng.颜如玉.颜如玉QQ2693533893").hex_sha1(string_class.$new(val)); Java.choose("com.shimeng.qq2693533893.MyServiceOne",{ onMatch:function(instance){ instance.坐等前往世界的尽头的小船.value = flag; },onComplete:function(){console.log("flag,value",flag,val);} }) }); }
var i = javaString.$new(String(3744)); var Code = Java.use("com.shimeng.颜如玉.颜如玉QQ2693533893").get(i); var v3 = Java.use("com.shimeng.qq2693533893.MyServiceOne").颜如玉(Java.use("com.shimeng.颜如玉.颜如玉QQ2693533893").getSaltMD5((javaString.$new(String(i^1288))))); var v3 = javaString.$new(v3).replaceAll("\\D+", ""); var resu1 = "358" + javaString.$new(v3).substring(0, 9); console.log("i,Code,v3,resu1:",i,Code, v3, resu1); }) } function Find_Code2(){ Java.perform(function(){ var javaString = Java.use('java.lang.String') for(var j=1;j<1000;j++){ var j = javaString.$new(String(j)); var v2_3 = Java.use("com.shimeng.颜如玉.颜如玉QQ2693533893").$new().getTwiceMD5ofString(Java.use("com.shimeng.颜如玉.颜如玉QQ2693533893").hex_sha1(j)); //console.log("l, v2_3:",j,v2_3); if(v2_3 == '8D4FF507DCDA63C201EB8B99D4170900'){ console.log("v2_3:",j); } } var i = javaString.$new(String(694)); var Code = Java.use("com.shimeng.颜如玉.颜如玉QQ2693533893").get(i); var v3 = Java.use("com.shimeng.颜如玉.颜如玉QQ2693533893").hex_sha1(Java.use("com.shimeng.颜如玉.颜如玉QQ2693533893").$new().getTwiceMD5ofString(i)); var v3 = javaString.$new(v3).replaceAll("\\D+", ""); var resu2 = "694" + javaString.$new(v3).substring(0, 9); console.log("i,Code,v3,resu2",i,Code,v3,resu2)
}) } function Find_Code3(){ Java.perform(function(){ console.log("Inside java perform"); var val = "123123"; var string_class = Java.use("java.lang.String"); var flag = Java.use("com.shimeng.颜如玉.颜如玉QQ2693533893").hex_sha1(string_class.$new(val)); Java.choose("com.shimeng.qq2693533893.MyServiceOne",{ onMatch:function(instance){ instance.坐等前往世界的尽头的小船.value = flag; },onComplete:function(){console.log("flag,value",flag,val);} }) }); }