安卓逆向|菜鸟的FRIDA学习笔记:如何使用FRIDA调用so文件里的函数
本文致谢
本篇文章学到的内容来自且完全来自r0ysue的知识星球,推荐一下(这个男人啥都会,还能陪你在线撩骚)。
样本及详细分析思路在某大佬的这篇文章里:
https://www.52pojie.cn/forum.php?mod=viewthread&tid=1142980&highlight=XCTF
作者使用的是在线的AES解密得出了flag,思路非常的棒!我在这里尝试直接调用so层的函数,也可以解密被加密的字符串
"9YuQ2dk8CSaCe7DTAmaqAA=="
首先我们需要确定的有三点:
函数的实参类型
函数的返回类型
如何在frida构造及读取这些类型
因为app没有主动调用这个 AES_128_ECB_PKCS5Padding_Decrypt 函数,可以在ida中尝试猜出它的实参及返回类型
由图中均可以看到,实参和返回类型都是const char* 类型,而且
1.第一个实参是待解密的字符串:"9YuQ2dk8CSaCe7DTAmaqAA=="
2.第二个实参就是AES的key:"thisisatestkey=="
直接使用这样的实参肯定是不行的,需要使用frida提供的方法进行构造:
Memory.allocUtf8String
而读取const char* 类型的数据需要使用:
Memory.readCString
怎么去调用这个函数,frida提供了NativeFunction方法,具体使用方法参见这里:
https://frida.re/docs/javascript-api/#nativefunction
它这么定义的:
new NativeFunction(address, returnType, argTypes[, abi])
参数 address,表示需要构造的函数在内存中的地址,returnType是函数的返回类型(const char*),不过frida中不用这个,需要使用 pointer,所以构造出来是这样的:
var aes_128 = new NativeFunction(aes_addr , 'pointer', ['pointer', 'pointer']);
现在基本思路都差不多了,写成的代码是这样的:
-
function main()
-
{
-
Java.perform(function () {
-
var aes_addr = Module.findExportByName("libJNIEncrypt.so","AES_128_ECB_PKCS5Padding_Decrypt");
-
var aes_128 = new NativeFunction(aes_addr , 'pointer', ['pointer', 'pointer']);
-
-
var encry_text = Memory.allocUtf8String("9YuQ2dk8CSaCe7DTAmaqAA==");
-
-
var key = Memory.allocUtf8String('thisisatestkey==');
-
-
console.log("The result is: ",Memory.readCString(aes_128(encry_text ,key )));
-
});
-
}
-
-
-
setImmediate(main)
运行结果如下图:
文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq523176585/article/details/109508048
- 点赞
- 收藏
- 关注作者
评论(0)