Hook类的所有方法
示例
//hook类的所有方法
function hooktest10(){
Java.perform(function(){
var md5Util=Java.use("com.alex.javahooktarget.HashUtil");
var methods=md5Util.class.getDeclaredMethods();
for(var j=0;j<methods.length;j++){
var methodName=methods[j].getName();
console.log(methodName);
//这里遍历方法的所有重载
for(var i=0;i<md5Util[methodName].overloads.length;i++){
md5Util[methodName].overloads[i].implementation=function(){
for(var k=0;k<arguments.length;k++){
console.log(arguments[k]);
}
//这里需要调用原来的方法,但是原来的方法的参数个数不确定,所以需要使用到arguments
return this[methodName].apply(this,arguments);
}
}
}
});
}
- 按照预期得到了类所有方法名的输出
- 按照预期得到了输入参数的输出
- 但是报了下面的错误:
[MuMu::com.alex.javahooktarget]-> 123
Error: bytesToHexString(): argument types do not match any of:
.overload('[B')
at pe (frida/node_modules/frida-java-bridge/lib/class-factory.js:549)
at frida/node_modules/frida-java-bridge/lib/class-factory.js:951
at we (frida/node_modules/frida-java-bridge/lib/class-factory.js:598)
at frida/node_modules/frida-java-bridge/lib/class-factory.js:581
分析原因
public String md5(String plainText) throws NoSuchAlgorithmException {
// 通过调用MessageDigest(数据摘要类)的getInstance()静态方法,传入加密算法的名称,获取数据摘要对象。
//MessageDigest MessageDigest.getInstance(algorithm);
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
// 获取摘要(加密),结果是字节数组
// byte[] java.security.MessageDigest.digest(byte[] input)
byte[] ciphertext = messageDigest.digest(plainText.getBytes());
// 利用apache的commons-codec,将字节数组转换为十六进制。
return bytesToHexString(ciphertext);
}
我的md5方法定义返回时会调用bytesToHexString方法,bytesToHexString方法最终会返回一个字符串
public static String bytesToHexString(byte[] src){
StringBuilder stringBuilder = new StringBuilder("");
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}
解决方法
过滤bytesToHexString方法
//hook类的所有方法
function hooktest10(){
Java.perform(function(){
var md5Util=Java.use("com.alex.javahooktarget.HashUtil");
var methods=md5Util.class.getDeclaredMethods();
for(var j=0;j<methods.length;j++){
var methodName=methods[j].getName();
console.log(methodName);
if(methodName=="bytesToHexString"){
//这里遍历方法的所有重载
for(var i=0;i<md5Util[methodName].overloads.length;i++){
md5Util[methodName].overloads[i].implementation=function(){
for(var k=0;k<arguments.length;k++){
console.log(arguments[k]);
}
var retval=this[methodName].apply(this,arguments);
console.log(methodName," return ",retval);
//这里需要调用原来的方法,但是原来的方法的参数个数不确定,所以需要使用到arguments
return retval;
}
}
}
}
});
}
Hook动态加载的dex
function hookTest9(){
Java.perform(function(){
Java.enumerateClassLoaders({
onMatch:function(loader){
try{
if(loader.loadClass("com.alexw.app")){
Java.classFactory.loader=loader;
var app=Java.use("com.alexw.app");
console.log(app);
app.sayHello.implementation=function(){
return "bye";
}
}catch(error){
}
},
onComplete:function(){
}
}
});
});
}
dex被加载之后才能Hook到