1. 原生安卓開發(fā)app的框架frida自吐算法開發(fā)

        共 26370字,需瀏覽 53分鐘

         ·

        2022-06-24 17:33

        點(diǎn)擊上方“Python爬蟲與數(shù)據(jù)挖掘”,進(jìn)行關(guān)注

        回復(fù)“書籍”即可獲贈Python從入門到進(jìn)階共10本電子書

        繁華事散逐香塵,流水無情草自春。

        大家好,我是碼農(nóng)星期八。本教程只用于學(xué)習(xí)探討,不允許任何人使用技術(shù)進(jìn)行違法操作,閱讀教程即表示同意!

        前言

        大家好,我是碼農(nóng)星期八,上次有一篇密碼學(xué)的文章,里面大概說了一下常用的安卓加密。

        本次來搞一下Java層的自吐算法。

        前置工作

        因?yàn)榧用芩惴ㄗ罱K的格式都需要轉(zhuǎn)成base64或者h(yuǎn)ex,所以需要把這些函數(shù)先定義一下

        //打印堆棧
        function showStacks({
            console.log(
                Java.use("android.util.Log")
                    .getStackTraceString(
                        Java.use("java.lang.Throwable").$new()
                    )
            );
        }

        var ByteString = Java.use("com.android.okhttp.okio.ByteString");
        //輸出base64格式數(shù)據(jù)
        function toBase64(tag, data{
            console.log(tag + " Base64: ", ByteString.of(data).base64());
        }
        //輸出hex格式數(shù)據(jù)
        function toHex(tag, data{
            console.log(tag + " Hex: ", ByteString.of(data).hex());
        }
        //輸出10格式數(shù)據(jù)
        function toUtf8(tag, data{
            console.log(tag + " Utf8: ", ByteString.of(data).utf8());
        }

        什么是自吐算法

        我們在進(jìn)行安卓開發(fā)的時候,如果想使用Java層的加密函數(shù)進(jìn)行加密,那必定是要觸發(fā)相關(guān)函數(shù)的。

        并且即使是字符串混淆,這些系統(tǒng)的關(guān)鍵字是不能混淆的。

        比如MD5是由MessageDigest這個類生成的。

        所以如果我們整理一下,hook了相關(guān)的關(guān)鍵字,如果調(diào)用了相關(guān)加密庫,必定是要經(jīng)過我們的hook。

        這樣,嘿嘿嘿,似乎又方便了一步。

        MD5和SHA1自吐

        MD5加密主要邏輯

        SHA加密主要邏輯

        其實(shí)可以發(fā)現(xiàn),MD5和SHA1的流程基本是一樣的,除了后面寫入的算法名不同。

        所以這倆是可以用一個的。

        根據(jù)整理,需要hook updatedigest即可。

        • update拿到的是壓入的數(shù)據(jù)。
        • digest可以拿到壓入的數(shù)據(jù)和返回的加密數(shù)據(jù)。

        代碼

        var messageDigest = Java.use("java.security.MessageDigest");
        messageDigest.update.overload('byte').implementation = function (data{
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("MessageDigest.update('byte') is called!");
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.update(data);
        }
        messageDigest.update.overload('java.nio.ByteBuffer').implementation = function (data{
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("MessageDigest.update('java.nio.ByteBuffer') is called!");
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.update(data);
        }
        messageDigest.update.overload('[B').implementation = function (data{
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("MessageDigest.update('[B') is called!");
            var algorithm = this.getAlgorithm();
            var tag = algorithm + " update data";
            toUtf8(tag, data);
            toHex(tag, data);
            toBase64(tag, data);
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.update(data);
        }
        messageDigest.update.overload('[B''int''int').implementation = function (data, start, length{
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("MessageDigest.update('[B', 'int', 'int') is called!");
            var algorithm = this.getAlgorithm();
            var tag = algorithm + " update data";
            toUtf8(tag, data);
            toHex(tag, data);
            toBase64(tag, data);
            console.log("start:", start);
            console.log("length:", length);
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.update(data, start, length);
        }
        messageDigest.digest.overload().implementation = function ({
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("MessageDigest.digest() is called!");
            var result = this.digest();
            var algorithm = this.getAlgorithm();
            var tag = algorithm + " digest result";
            toHex(tag, result);
            toBase64(tag, result);
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return result;
        }
        messageDigest.digest.overload('[B').implementation = function (data{
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("MessageDigest.digest('[B') is called!");
            var algorithm = this.getAlgorithm();
            var tag = algorithm + " digest data";
            toUtf8(tag, data);
            toHex(tag, data);
            toBase64(tag, data);
            var result = this.digest(data);
            var tags = algorithm + " digest result";
            toHex(tags, result);
            toBase64(tags, result);
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return result;
        }
        messageDigest.digest.overload('[B''int''int').implementation = function (data, start, length{
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("MessageDigest.digest('[B', 'int', 'int') is called!");
            var algorithm = this.getAlgorithm();
            var tag = algorithm + " digest data";
            toUtf8(tag, data);
            toHex(tag, data);
            toBase64(tag, data);
            var result = this.digest(data, start, length);
            var tags = algorithm + " digest result";
            toHex(tags, result);
            toBase64(tags, result);
            console.log("start:", start);
            console.log("length:", length);
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return result;
        }

        效果

        MAC自吐

        MAC加密主要邏輯

        MAC主要是需要一個密鑰。壓入數(shù)據(jù)用的是update。獲取數(shù)據(jù)用的是doFinal。

        所以需要hook initupdatedoFinal

        代碼

        var mac = Java.use("javax.crypto.Mac");
        mac.init.overload('java.security.Key''java.security.spec.AlgorithmParameterSpec').implementation = function (key, AlgorithmParameterSpec{
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Mac.init('java.security.Key', 'java.security.spec.AlgorithmParameterSpec') is called!");
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.init(key, AlgorithmParameterSpec);
        }
        mac.init.overload('java.security.Key').implementation = function (key{
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Mac.init('java.security.Key') is called!");
            var algorithm = this.getAlgorithm();
            var tag = algorithm + " init Key";
            var keyBytes = key.getEncoded();
            toUtf8(tag, keyBytes);
            toHex(tag, keyBytes);
            toBase64(tag, keyBytes);
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.init(key);
        }
        mac.update.overload('byte').implementation = function (data{
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Mac.update('byte') is called!");
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.update(data);
        }
        mac.update.overload('java.nio.ByteBuffer').implementation = function (data{
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Mac.update('java.nio.ByteBuffer') is called!");
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.update(data);
        }
        mac.update.overload('[B').implementation = function (data{
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Mac.update('[B') is called!");
            var algorithm = this.getAlgorithm();
            var tag = algorithm + " update data";
            toUtf8(tag, data);
            toHex(tag, data);
            toBase64(tag, data);
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.update(data);
        }
        mac.update.overload('[B''int''int').implementation = function (data, start, length{
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Mac.update('[B', 'int', 'int') is called!");
            var algorithm = this.getAlgorithm();
            var tag = algorithm + " update data";
            toUtf8(tag, data);
            toHex(tag, data);
            toBase64(tag, data);
            console.log("start:", start);
            console.log("length:", length);
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.update(data, start, length);
        }
        mac.doFinal.overload().implementation = function ({
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Mac.doFinal() is called!");
            var result = this.doFinal();
            var algorithm = this.getAlgorithm();
            var tag = algorithm + " doFinal result";
            toHex(tag, result);
            toBase64(tag, result);
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return result;
        }

        示例

        DES/DESede/AES/RSA

        DES/DESede/AES/RSA這幾個加密。都是通過Cipher來進(jìn)行實(shí)例化的。

        基本加密邏輯一樣

        • init壓入key。
        • 因?yàn)?code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;color: #1e6bb8;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;">DES/DESede/AES/RSA的update壓入有問題,所以直接hook doFinal就好了。

        代碼

        // DES/DESede/AES/RSA
        var cipher = Java.use("javax.crypto.Cipher");
        cipher.init.overload('int''java.security.cert.Certificate').implementation = function ({
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Cipher.init('int', 'java.security.cert.Certificate') is called!");
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.init.apply(thisarguments);
        }
        cipher.init.overload('int''java.security.Key''java.security.SecureRandom').implementation = function ({
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Cipher.init('int', 'java.security.Key', 'java.security.SecureRandom') is called!");
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.init.apply(thisarguments);
        }
        cipher.init.overload('int''java.security.cert.Certificate''java.security.SecureRandom').implementation = function ({
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Cipher.init('int', 'java.security.cert.Certificate', 'java.security.SecureRandom') is called!");
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.init.apply(thisarguments);
        }
        cipher.init.overload('int''java.security.Key''java.security.AlgorithmParameters''java.security.SecureRandom').implementation = function ({
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Cipher.init('int', 'java.security.Key', 'java.security.AlgorithmParameters', 'java.security.SecureRandom') is called!");
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.init.apply(thisarguments);
        }
        cipher.init.overload('int''java.security.Key''java.security.spec.AlgorithmParameterSpec''java.security.SecureRandom').implementation = function ({
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Cipher.init('int', 'java.security.Key', 'java.security.spec.AlgorithmParameterSpec', 'java.security.SecureRandom') is called!");
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.init.apply(thisarguments);
        }
        cipher.init.overload('int''java.security.Key''java.security.AlgorithmParameters').implementation = function ({
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Cipher.init('int', 'java.security.Key', 'java.security.AlgorithmParameters') is called!");
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.init.apply(thisarguments);
        }

        cipher.init.overload('int''java.security.Key').implementation = function ({
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Cipher.init('int', 'java.security.Key') is called!");
            var algorithm = this.getAlgorithm();
            var tag = algorithm + " init Key";
            var className = JSON.stringify(arguments[1]);
            if (className.indexOf("OpenSSLRSAPrivateKey") === -1) {
                var keyBytes = arguments[1].getEncoded();
                toUtf8(tag, keyBytes);
                toHex(tag, keyBytes);
                toBase64(tag, keyBytes);
            }
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.init.apply(thisarguments);
        }
        cipher.init.overload('int''java.security.Key''java.security.spec.AlgorithmParameterSpec').implementation = function ({
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Cipher.init('int', 'java.security.Key', 'java.security.spec.AlgorithmParameterSpec') is called!");
            var algorithm = this.getAlgorithm();
            var tag = algorithm + " init Key";
            var keyBytes = arguments[1].getEncoded();
            toUtf8(tag, keyBytes);
            toHex(tag, keyBytes);
            toBase64(tag, keyBytes);
            var tags = algorithm + " init iv";
            var iv = Java.cast(arguments[2], Java.use("javax.crypto.spec.IvParameterSpec"));
            var ivBytes = iv.getIV();
            toUtf8(tags, ivBytes);
            toHex(tags, ivBytes);
            toBase64(tags, ivBytes);
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.init.apply(thisarguments);
        }

        cipher.doFinal.overload('java.nio.ByteBuffer''java.nio.ByteBuffer').implementation = function ({
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Cipher.doFinal('java.nio.ByteBuffer', 'java.nio.ByteBuffer') is called!");
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.doFinal.apply(thisarguments);
        }
        cipher.doFinal.overload('[B''int').implementation = function ({
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Cipher.doFinal('[B', 'int') is called!");
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.doFinal.apply(thisarguments);
        }
        cipher.doFinal.overload('[B''int''int''[B').implementation = function ({
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Cipher.doFinal('[B', 'int', 'int', '[B') is called!");
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.doFinal.apply(thisarguments);
        }
        cipher.doFinal.overload('[B''int''int''[B''int').implementation = function ({
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Cipher.doFinal('[B', 'int', 'int', '[B', 'int') is called!");
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.doFinal.apply(thisarguments);
        }
        cipher.doFinal.overload().implementation = function ({
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Cipher.doFinal() is called!");
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.doFinal.apply(thisarguments);
        }

        cipher.doFinal.overload('[B').implementation = function ({
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Cipher.doFinal('[B') is called!");
            var algorithm = this.getAlgorithm();
            var tag = algorithm + " doFinal data";
            var data = arguments[0];
            toUtf8(tag, data);
            toHex(tag, data);
            toBase64(tag, data);
            var result = this.doFinal.apply(thisarguments);
            var tags = algorithm + " doFinal result";
            toHex(tags, result);
            toBase64(tags, result);
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return result;
        }
        cipher.doFinal.overload('[B''int''int').implementation = function ({
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Cipher.doFinal('[B', 'int', 'int') is called!");
            var algorithm = this.getAlgorithm();
            var tag = algorithm + " doFinal data";
            var data = arguments[0];
            toUtf8(tag, data);
            toHex(tag, data);
            toBase64(tag, data);
            var result = this.doFinal.apply(thisarguments);
            var tags = algorithm + " doFinal result";
            toHex(tags, result);
            toBase64(tags, result);
            console.log("arguments[1]:"arguments[1],);
            console.log("arguments[2]:"arguments[2]);
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return result;
        }

        效果

        簽名算法

        簽名算法是混合算法,先記著就行。

        代碼

        //簽名算法
        var signature = Java.use("java.security.Signature");
        signature.update.overload('byte').implementation = function (data{
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Signature.update('byte') is called!");
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.update(data);
        }
        signature.update.overload('java.nio.ByteBuffer').implementation = function (data{
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Signature.update('java.nio.ByteBuffer') is called!");
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.update(data);
        }
        signature.update.overload('[B''int''int').implementation = function (data, start, length{
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Signature.update('[B', 'int', 'int') is called!");
            var algorithm = this.getAlgorithm();
            var tag = algorithm + " update data";
            toUtf8(tag, data);
            toHex(tag, data);
            toBase64(tag, data);
            console.log("start:", start);
            console.log("length:", length);
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.update(data, start, length);
        }
        signature.sign.overload('[B''int''int').implementation = function ({
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Signature.sign('[B', 'int', 'int') is called!");
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return this.sign.apply(thisarguments);
        }
        signature.sign.overload().implementation = function ({
            console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
            console.log("Signature.sign() is called!");
            var result = this.sign();
            var algorithm = this.getAlgorithm();
            var tag = algorithm + " sign result";
            toHex(tag, result);
            toBase64(tag, result);
            showStacks();
            console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
            return result;
        }

        實(shí)戰(zhàn)效果

        xx牛.apk

        只要用了Java層的加密,這個方式就能直接都hook出來。

        完整代碼

        z_Java層自吐.js

        總結(jié)

        可能你會想,wc,這個家伙豈不是無敵了?別想太多。自吐算法只是輔助工具罷了,并且打印出來堆棧,更方便的分析罷了。

        人生沒有白走的路,加油!如果在操作過程中有任何問題,記得下面留言,我們看到會第一時間解決問題。

        越努力,越幸運(yùn)。我是碼農(nóng)星期八,如果覺得還不錯,記得動手點(diǎn)贊一下哈。感謝你的觀看。

        小伙伴們,快快用實(shí)踐一下吧!如果在學(xué)習(xí)過程中,有遇到任何問題,歡迎加我好友,我拉你進(jìn)Python學(xué)習(xí)交流群共同探討學(xué)習(xí)。

        ------------------- End -------------------

        往期精彩文章推薦:

        歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

        想加入Python學(xué)習(xí)群請在后臺回復(fù)【入群

        萬水千山總是情,點(diǎn)個【在看】行不行

        /今日留言主題/

        隨便說一兩句吧~~

        瀏覽 140
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
          
          

            1. 欧美成人乱码一区二区三区 | 午夜免费久久 | 熟女露脸 嗷嗷叫 91 | 黄色在线视频观看 | 他的粗大挺进了护士的湿润 |