“ 前言:初学逆向 请多多指教”
学习到的内容
—
1、编写类似Xposed的自吐算法模块
2、加强对Frida API的运用
01
—
这里就简单的拿jdk包中的md5加密类来进行举例子,其实跟Xposed很相似,不过语法变了点,思路其实都是一样的
先获取MessageDigest类的JavaScript引用赋值给md变量
var md = Java.use('java.security.MessageDigest');
然后开始对该类的函数进行hook,一般MessageDigest类用的方法都是getInstance/update/final
然后这里需要注意的是这几个方法都是有重载方法的,所以这里进行HOOK的时候需要使用overload来进行hook
在overload中的第一个参数来对参数的类型进行描述的时候用到的是signture类型,也就是smali中的类型表达方式
比如这里如果需要接收一个字节数组的话,那么表达方式就是'[B'
var md = Java.use('java.security.MessageDigest'); md.update.overload('[B').implementation = function (a) {
send("update:" + bytesToString(a)) showStacks(); send("======================================"); return this.update(a); }
java.security.cert.CertificateFactory中的generateCertificate这个方法其实也可以进行hook(在实战练习中遇到过这种情况,但是正常的hook是hook不到这种情况的,所以也可以加上CertificateFactory的generateCertificate hook),但是自己这里在js代码中不知道该如何转换,因为generateCertificate方法参数是InputStream类型的,该InputStream对象中存储着密钥的字节流,所以还需要转换为ByteArrayOutputStream类型,然后再调用toByteArray转换为字节数据最后new String,这些思路在frida中的js不知道该咋写,所以这个就先留着先(有大佬知道的话 也可以发个消息教一下哈)!
最终的代码如下:
jsCode = """function showStacks() {
Java.perform(function() {
send(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new())); });}function bytesToHex(arr) {
var str = ""; for (var i = 0; i < arr.length; i++) {
var tmp = arr[i]; if (tmp < 0) {
tmp = (255 + tmp + 1).toString(16); } else {
tmp = tmp.toString(16); } if (tmp.length == 1) {
tmp = "0" + tmp; } str += tmp; } return str;}function bytesToBase64(e) {
var base64EncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; var r, a, c, h, o, t; for (c = e.length, a = 0, r = ''; a < c;) {
if (h = 255 & e[a++], a == c) {
r += base64EncodeChars.charAt(h >> 2), r += base64EncodeChars.charAt((3 & h) << 4), r += '=='; break }