<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          原生安卓開發(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ā)的時(shí)候,如果想使用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,這個家伙豈不是無敵了?別想太多。自吐算法只是輔助工具罷了,并且打印出來堆棧,更方便的分析罷了。

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

          越努力,越幸運(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í)群請?jiān)诤笈_回復(fù)【入群

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

          /今日留言主題/

          隨便說一兩句吧~~

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

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩乱轮小说与视频 | 久久日成人电影 | 天天日天天干天天透 | 色婷婷国产成人精品视频 | 红桃视频一区二区三区四区 |