安卓/手游逆向交流群:963612891
1。字符串比较。通常用于密码比较时会用到,直接输出比较的字符串
Java.perform(function x() {
const str = Java.use('java.lang.String');
const objectClass = 'java.lang.Object';
str.equals.overload(objectClass).implementation = function(obj) {
//打印传入的参数
var response = str.equals.overload(objectClass).call(this, obj);
console.log(str.toString.call(this) + ' == ' + obj.toString() + ' ? ' + response);
//return出去
return response;
}
});
- 加密算法中,明文调用getBytes方法转换为字节数组,Hook并打印堆栈可以快速定位
Java.perform(function x() {
const str = Java.use('java.lang.String');
str.getBytes.overload().implementation = function() {
var response = this["getBytes"]();
console.log(this.toString());
return response;
}
});
3.Android中使用StringBuffer,
StringBuilder这两个类操作字符串,Hook其toString方法并打印堆栈,在很多情况下可以定位到加密字段的生成堆栈Java.perform(function x() {
const stringbuilder = Java.use(“java.lang.StringBuilder”);
const stringbuffer = Java.use(“java.lang.StringBuffer”);
const toString = "toString";
// 使用log类和Exception类产生堆栈
var jAndroidLog = Java.use("android.util.Log");
var jException = Java.use("java.lang.Exception");
stringbuilder[toString].implementation = function(){
//执行原逻辑
const result = this[toString]();
// 打印返回的字符串内容
console.log(result);
// 只有长度大于30时,才打印堆栈
if (result.length > 30) {
// 抛出异常。打印堆栈
console.log(jAndroidLog.getStackTraceString(jException.$new()));
}
return result;
};
stringbuffer[toString].implementation = function() {
//执行原逻辑
const result = this[toString]();
// 打印返回的字符串内容
console.log(result);
// 只有长度大于30时,才打印堆栈
if (result.length > 30) {
// 抛出异常。打印堆栈
console.log(jAndroidLog.getStackTraceString(jException.$new()));
}
return result;
}
});
4.在hook的方法中输出该方法的调用层级关系
var file = Java.use(“java.io.File”);
//判断文件是否存在
file.exists.implementation = function(){
//判断的路径
console.log(“path value:”+this.path[‘value’]);
//输出调用堆栈
console.log(Java.use(“android.util.Log”).getStackTraceString(Java.use(“java.lang.Exception”).$new()));
return this.exists();
}