一开始是在群里和一些老哥聊android 的hook 框架 我就学习了xpose 而且感觉很好使 但是和他们有了解到了 frida 感觉非常好使
决定来学习一波
这里写了一个小demo
java 层:
python代码
import frida
import sys
jscode = """
Java.perform(function () {
var demo = Java.use('com.example.frida_demo.demo');
demo.add.implementation = function (a,b) {
send("Hook Start...");
send(a)
send(b)
var add_ret = this.add(a+1,b+1);
send("Return:"+add_ret);
return add_ret
}
});
"""
def on_message(message, data):
if message['type']=='send':
print("[*] {0}".format(message['payload']))
else:
print(message)
process = frida.get_remote_device().attach('com.example.frida_demo')
script = process.create_script(jscode)
script.on("message", on_message)
script.load()
sys.stdin.read()
android demo代码
别忘记端口转发
adb forward tcp:27043 tcp:27043
adb forward tcp:27042 tcp:27042
可以实验得出 在java层 确实还是挺好使的,
然后就是在so层
so层拿了iscc的程序做了例子
import frida
import sys
jscode = """
Java.perform(function () {
var nativePointer = Module.findExportByName("libnative-lib.so", "Java_com_iscc_crackme_MainActivity_checkSecond");
send("native: " + nativePointer);
Interceptor.attach(nativePointer, {
onEnter: function(args){
send(args[0]);
send(args[1]);
send(args[2]);
send(args[3]);
send(args[4]);
},
onLeave: function(retval){
send(retval.toInt32());
}
});
});
"""
def on_message(message, data):
if message['type']=='send':
print("[*] {0}".format(message['payload']))
else:
print(message)
process = frida.get_remote_device().attach('com.iscc.crackme')
script = process.create_script(jscode)
script.on("message", on_message)
script.load()
sys.stdin.read()
如图 输入正确的flag 返回值就是1了
然后2020春节吾爱破解第三题用frida 挺好使的
如果静态分析的话 可能有些麻烦。
发现都是java反射 看的很繁琐,
但是可以看到最后用到的是明文对比
直接hook这个类就能得到flag
import frida
import sys
jscode = """
Java.perform(function(){
var str_demo = Java.use('java.lang.String')
str_demo.equals.implementation = function (arg1) {
console.log("string is ==》:" + this.toString());
console.log("equals arg1 ==》:" + arg1);
var ret = this.equals(v);
return ret;
}
});
"""
process = frida.get_remote_device().attach('com.wuaipojie.crackme01')
script = process.create_script(jscode)
script.load()
sys.stdin.read()
恰好看到看雪论坛的一个文章, 下方参考链接 给出了一个升级版的apk。
这个题目就是 输入的值 经过 encodePassword 这个函数加密之后和一个字符串对比
可以直接爆破出来这个值,,, 通过sha1这个散列就能知道,,
比较可惜的是我的模拟器运行不了这个apk
把脚本粘下来,,,
function main(){
Java.perform(function x(){
console.log("In Java Perform function")
var ByteString = Java.use("com.android.okhttp.okio.ByteString");
var verify = Java.use("org.teamsik.ahe17.qualification.Verifier")
var stringClass = Java.use("java.lang.String")
var p = stringClass.$new("09042ec2c2c08c4cbece042681caf1d13984f24a")
var pSign = p.getBytes()
console.log(ByteString.of(pSign).hex())
for (var i = 999 ; i < 10000 ; i++) {
console.log("i="+i)
var v = stringClass.$new(String(i))
var vSign = verify.encodePassword(v)
console.log(ByteString.of(vSign).hex())
if (ByteString.of(vSign).hex() == ByteString.of(pSign).hex()) {
console.log("i="+i)
break;
}
}
})
};
setImmediate(main)
参考链接