android 使用Frida检测加密密钥生成/类型

ie3xauqp  于 2024-01-04  发布在  Android
关注(0)|答案(1)|浏览(233)

我想知道这个应用程序是怎么工作的。
在注册开始时,它会向服务器发送两个名为“keyA”和“keyB”的参数,服务器会回复两个名为“signe”和“data”的参数,然后应用程序会使用RSA/ECB/PKCS 1解密“data”。
要求:

  1. {"keyA":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz8Hb9tbjtYAxNQi19h75CGBdsAuSCenn/t9p0DjLUOfh75qCvqJzkrE9gv6fXo1GcyMrfVAgRxjR37F3gOzilWVJiUk9VGq/1mGV/UXI8cK6Lkae+Zie3l5L1Qc0YjeBmkQiSjSkq3zo9AVgom473TFerQpcvukzqzQFN0k2sYBQWxpN3SDnpNSeiiHIEStw25WNPkSjQlrJB4RMiO2bKeBfTPjKFAG5/iSZVzRZ/P8fdv10m/D/F5AbIFgl4OXKzbLriAsBpmcXOPV3+LQ5OUfNgKFj1khs6JMo2GT5xMfAeIw4eqo77e7RSkQxocIg9ed4GNHvC9KDKXt6rBZJfQIDAQAB","keyB":"JhDGG3QVjn6Nosxg/kTfTR40MV1XetdZ2m/i314XFoUkA8f6Mgb/lQ38iVnEZpKULZ5y3ShnPa9lR1ZP/xhkttI9e0F67UTj/FNM2837qHMbNK7ZGtFCfuXfE6bokDci6eptIVIgsSL3Is9PFlc47g5E179jjeB8Bhtr4H+6CRoB5R+Ru82XfCI1xH45EbKVqEL+it2/NoiT0EzL892jKOd8qOMvrNxjRnl14TJrdY2KBsRzgVExSX03Bzg/+QLuMa1fBBPtONZjRSIBNK40z9rDBy9Ibdc1xBESWcZMZh2glPhaZe4oy3LQa8XFrEgKJolIMznA6UGdnVck0rXP9w=="}

字符串
回应:

  1. {"signe":"bWnUVR9NURGqpA2RPXr68u+7hCkSfkEUDVEZ8BxkjjYSOUarcEivYCU6QB5trk0n17hrSD5c/xlV0Hz4FiYm+r5eYVs2hqFj21C78/TKAyEQKeuwdSaCJo2rbnE9IUQwiIP96IYj2SZ6SelBSoRgIYi0gNIqR2tr89fBFeDtbz76J0tyFoxiqydKM+Oclir7nj8ZybkfdadzGhvCjikQIsjtEpvAK34Msmow3G73YbmIgwIRn1e/YmE0uphGXrY24V2lhkm1PH+9Ngt8qoQjMAedxnwAW7JfqFKEHmPBjfs7NOpHISG7e255Eh8m4/q8vbvfmP1UU18iIR5yr9EQ6q/yUzecp6VJeclSP0rjTPhRUbLqdLCv0bVbqZLziHCEiMcqnT6N+rkOoVsj7IdqnP6qP79L/blhc8FlRSRx4L7y5CWM3MHZ0RJWykVJVDZKnF4LnNJ+m/7CdrxXyI9LUxzwlY94RQdGWhpmElh7BY7DBSZqIA0ly4SLUxRJt5Wc","data":"hzo3Y3biJ1+YKsmKL+pwiuBIUC332dEbV/ooy2ilb5yem5kF75fLKXCNjVdPUPZgQbx0wHTuQsjFgIIeabmUqzegKebxqtUOtDVIMEj54cmfJ1itDhZIJxivb42/x1LbBYuUi91hZy/xRx2opwA+gULMyJwbNlQlcp016KLCh9AiNFYtE77hSlbriO72G3ukD8s/7uMQfpdNcDwl7wWh4L4oIZCji3G/YPJW49CMvmsTnuUhK34E2ka1h9dfwMUvZT+CFEv/anC6gXktMzqmhI6enZB9bb33bwIBiF6k+MkI11Ea9wYdvlwVhbEvOLDYYt41L5UgTCBR5pH01MY06Q=="}


我知道keyA是RSA公钥(2048位),但我不知道keyB是什么。
我尝试使用https://codeshare.frida.re/@ensingerphilipp/frinja-crypto-fixed/来查看这些键是如何生成的,但它没有显示任何生成的键。
我已经尝试了很多次,我的观察结果是,

  1. KeyA和KeyB之间存在某种关联,如果它们不匹配,服务器会返回一个错误。
    1.它可以用相同的KeyA发送不同的KeyB。
    1.如果我多次发送相同的请求,signe不会改变,但数据会改变(我猜这只是因为填充)。
    我猜它使用了另一种方法来生成这些键,但我不是Java开发人员。
    我无法访问这些应用程序的源代码,它们被严重混淆,所以从源代码中找到任何东西都不是一个选择。
    任何帮助将不胜感激。
8wtpewkr

8wtpewkr1#

我在一个中文网站上找到了一些frida js代码,它帮助我挖掘了更多
KeyB是一个singature,我还可以看到使用此代码签名的字符串:

  1. function showStacks2() {
  2. return;
  3. console.log(
  4. Java.use("android.util.Log")
  5. .getStackTraceString(
  6. Java.use("java.lang.Throwable").$new()
  7. )
  8. );
  9. }
  10. var ByteString = Java.use("com.android.okhttp.okio.ByteString");
  11. function toBase64(tag, data) {
  12. console.log(tag + " Base64: ", ByteString.of(data).base64());
  13. }
  14. function toHex(tag, data) {
  15. console.log(tag + " Hex: ", ByteString.of(data).hex());
  16. }
  17. function toUtf8(tag, data) {
  18. console.log(tag + " Utf8: ", ByteString.of(data).utf8());
  19. }
  20. var messageDigest = Java.use("java.security.MessageDigest");
  21. messageDigest.update.overload('byte').implementation = function(data) {
  22. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  23. console.log("MessageDigest.update('byte') is called!");
  24. showStacks2();
  25. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  26. return this.update(data);
  27. }
  28. messageDigest.update.overload('java.nio.ByteBuffer').implementation = function(data) {
  29. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  30. console.log("MessageDigest.update('java.nio.ByteBuffer') is called!");
  31. showStacks2();
  32. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  33. return this.update(data);
  34. }
  35. messageDigest.update.overload('[B').implementation = function(data) {
  36. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  37. console.log("MessageDigest.update('[B') is called!");
  38. var algorithm = this.getAlgorithm();
  39. var tag = algorithm + " update data";
  40. toUtf8(tag, data);
  41. toHex(tag, data);
  42. toBase64(tag, data);
  43. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  44. return this.update(data);
  45. }
  46. messageDigest.update.overload('[B', 'int', 'int').implementation = function(data, start, length) {
  47. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  48. console.log("MessageDigest.update('[B', 'int', 'int') is called!");
  49. var algorithm = this.getAlgorithm();
  50. var tag = algorithm + " update data";
  51. toUtf8(tag, data);
  52. toHex(tag, data);
  53. toBase64(tag, data);
  54. console.log("start:", start);
  55. console.log("length:", length);
  56. showStacks2();
  57. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  58. return this.update(data, start, length);
  59. }
  60. messageDigest.digest.overload().implementation = function() {
  61. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  62. console.log("MessageDigest.digest() is called!");
  63. var result = this.digest();
  64. var algorithm = this.getAlgorithm();
  65. var tag = algorithm + " digest result";
  66. toHex(tag, result);
  67. toBase64(tag, result);
  68. showStacks2();
  69. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  70. return result;
  71. }
  72. messageDigest.digest.overload('[B').implementation = function(data) {
  73. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  74. console.log("MessageDigest.digest('[B') is called!");
  75. var algorithm = this.getAlgorithm();
  76. var tag = algorithm + " digest data";
  77. toUtf8(tag, data);
  78. toHex(tag, data);
  79. toBase64(tag, data);
  80. var result = this.digest(data);
  81. var tags = algorithm + " digest result";
  82. toHex(tags, result);
  83. toBase64(tags, result);
  84. showStacks2();
  85. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  86. return result;
  87. }
  88. messageDigest.digest.overload('[B', 'int', 'int').implementation = function(data, start, length) {
  89. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  90. console.log("MessageDigest.digest('[B', 'int', 'int') is called!");
  91. var algorithm = this.getAlgorithm();
  92. var tag = algorithm + " digest data";
  93. toUtf8(tag, data);
  94. toHex(tag, data);
  95. toBase64(tag, data);
  96. var result = this.digest(data, start, length);
  97. var tags = algorithm + " digest result";
  98. toHex(tags, result);
  99. toBase64(tags, result);
  100. console.log("start:", start);
  101. console.log("length:", length);
  102. showStacks2();
  103. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  104. return result;
  105. }
  106. var mac = Java.use("javax.crypto.Mac");
  107. mac.init.overload('java.security.Key', 'java.security.spec.AlgorithmParameterSpec').implementation = function(key, AlgorithmParameterSpec) {
  108. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  109. console.log("Mac.init('java.security.Key', 'java.security.spec.AlgorithmParameterSpec') is called!");
  110. showStacks2();
  111. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  112. return this.init(key, AlgorithmParameterSpec);
  113. }
  114. mac.init.overload('java.security.Key').implementation = function(key) {
  115. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  116. console.log("Mac.init('java.security.Key') is called!");
  117. var algorithm = this.getAlgorithm();
  118. var tag = algorithm + " init Key";
  119. var keyBytes = key.getEncoded();
  120. toUtf8(tag, keyBytes);
  121. toHex(tag, keyBytes);
  122. toBase64(tag, keyBytes);
  123. showStacks2();
  124. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  125. return this.init(key);
  126. }
  127. mac.update.overload('byte').implementation = function(data) {
  128. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  129. console.log("Mac.update('byte') is called!");
  130. showStacks2();
  131. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  132. return this.update(data);
  133. }
  134. mac.update.overload('java.nio.ByteBuffer').implementation = function(data) {
  135. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  136. console.log("Mac.update('java.nio.ByteBuffer') is called!");
  137. showStacks2();
  138. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  139. return this.update(data);
  140. }
  141. mac.update.overload('[B').implementation = function(data) {
  142. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  143. console.log("Mac.update('[B') is called!");
  144. var algorithm = this.getAlgorithm();
  145. var tag = algorithm + " update data";
  146. toUtf8(tag, data);
  147. toHex(tag, data);
  148. toBase64(tag, data);
  149. showStacks2();
  150. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  151. return this.update(data);
  152. }
  153. mac.update.overload('[B', 'int', 'int').implementation = function(data, start, length) {
  154. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  155. console.log("Mac.update('[B', 'int', 'int') is called!");
  156. var algorithm = this.getAlgorithm();
  157. var tag = algorithm + " update data";
  158. toUtf8(tag, data);
  159. toHex(tag, data);
  160. toBase64(tag, data);
  161. console.log("start:", start);
  162. console.log("length:", length);
  163. showStacks2();
  164. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  165. return this.update(data, start, length);
  166. }
  167. mac.doFinal.overload().implementation = function() {
  168. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  169. console.log("Mac.doFinal() is called!");
  170. var result = this.doFinal();
  171. var algorithm = this.getAlgorithm();
  172. var tag = algorithm + " doFinal result";
  173. toHex(tag, result);
  174. toBase64(tag, result);
  175. showStacks2();
  176. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  177. return result;
  178. }
  179. // DES/DESede/AES/RSA
  180. var cipher = Java.use("javax.crypto.Cipher");
  181. cipher.init.overload('int', 'java.security.cert.Certificate').implementation = function() {
  182. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  183. console.log("Cipher.init('int', 'java.security.cert.Certificate') is called!");
  184. showStacks2();
  185. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  186. return this.init.apply(this, arguments);
  187. }
  188. cipher.init.overload('int', 'java.security.Key', 'java.security.SecureRandom').implementation = function() {
  189. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  190. console.log("Cipher.init('int', 'java.security.Key', 'java.security.SecureRandom') is called!");
  191. showStacks2();
  192. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  193. return this.init.apply(this, arguments);
  194. }
  195. cipher.init.overload('int', 'java.security.cert.Certificate', 'java.security.SecureRandom').implementation = function() {
  196. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  197. console.log("Cipher.init('int', 'java.security.cert.Certificate', 'java.security.SecureRandom') is called!");
  198. showStacks2();
  199. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  200. return this.init.apply(this, arguments);
  201. }
  202. cipher.init.overload('int', 'java.security.Key', 'java.security.AlgorithmParameters', 'java.security.SecureRandom').implementation = function() {
  203. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  204. console.log("Cipher.init('int', 'java.security.Key', 'java.security.AlgorithmParameters', 'java.security.SecureRandom') is called!");
  205. showStacks2();
  206. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  207. return this.init.apply(this, arguments);
  208. }
  209. cipher.init.overload('int', 'java.security.Key', 'java.security.spec.AlgorithmParameterSpec', 'java.security.SecureRandom').implementation = function() {
  210. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  211. console.log("Cipher.init('int', 'java.security.Key', 'java.security.spec.AlgorithmParameterSpec', 'java.security.SecureRandom') is called!");
  212. showStacks2();
  213. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  214. return this.init.apply(this, arguments);
  215. }
  216. cipher.init.overload('int', 'java.security.Key', 'java.security.AlgorithmParameters').implementation = function() {
  217. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  218. console.log("Cipher.init('int', 'java.security.Key', 'java.security.AlgorithmParameters') is called!");
  219. showStacks2();
  220. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  221. return this.init.apply(this, arguments);
  222. }
  223. cipher.init.overload('int', 'java.security.Key').implementation = function() {
  224. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  225. console.log("Cipher.init('int', 'java.security.Key') is called!");
  226. var algorithm = this.getAlgorithm();
  227. var tag = algorithm + " init Key";
  228. var className = JSON.stringify(arguments[1]);
  229. if (className.indexOf("OpenSSLRSAPrivateKey") === -1) {
  230. var keyBytes = arguments[1].getEncoded();
  231. toUtf8(tag, keyBytes);
  232. toHex(tag, keyBytes);
  233. toBase64(tag, keyBytes);
  234. }
  235. showStacks2();
  236. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  237. return this.init.apply(this, arguments);
  238. }
  239. cipher.init.overload('int', 'java.security.Key', 'java.security.spec.AlgorithmParameterSpec').implementation = function() {
  240. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  241. console.log("Cipher.init('int', 'java.security.Key', 'java.security.spec.AlgorithmParameterSpec') is called!");
  242. var algorithm = this.getAlgorithm();
  243. var tag = algorithm + " init Key";
  244. var keyBytes = arguments[1].getEncoded();
  245. toUtf8(tag, keyBytes);
  246. toHex(tag, keyBytes);
  247. toBase64(tag, keyBytes);
  248. var tags = algorithm + " init iv";
  249. var iv = Java.cast(arguments[2], Java.use("javax.crypto.spec.IvParameterSpec"));
  250. var ivBytes = iv.getIV();
  251. toUtf8(tags, ivBytes);
  252. toHex(tags, ivBytes);
  253. toBase64(tags, ivBytes);
  254. showStacks2();
  255. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  256. return this.init.apply(this, arguments);
  257. }
  258. cipher.doFinal.overload('java.nio.ByteBuffer', 'java.nio.ByteBuffer').implementation = function() {
  259. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  260. console.log("Cipher.doFinal('java.nio.ByteBuffer', 'java.nio.ByteBuffer') is called!");
  261. showStacks2();
  262. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  263. return this.doFinal.apply(this, arguments);
  264. }
  265. cipher.doFinal.overload('[B', 'int').implementation = function() {
  266. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  267. console.log("Cipher.doFinal('[B', 'int') is called!");
  268. showStacks2();
  269. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  270. return this.doFinal.apply(this, arguments);
  271. }
  272. cipher.doFinal.overload('[B', 'int', 'int', '[B').implementation = function() {
  273. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  274. console.log("Cipher.doFinal('[B', 'int', 'int', '[B') is called!");
  275. showStacks2();
  276. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  277. return this.doFinal.apply(this, arguments);
  278. }
  279. cipher.doFinal.overload('[B', 'int', 'int', '[B', 'int').implementation = function() {
  280. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  281. console.log("Cipher.doFinal('[B', 'int', 'int', '[B', 'int') is called!");
  282. showStacks2();
  283. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  284. return this.doFinal.apply(this, arguments);
  285. }
  286. cipher.doFinal.overload().implementation = function() {
  287. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  288. console.log("Cipher.doFinal() is called!");
  289. showStacks2();
  290. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  291. return this.doFinal.apply(this, arguments);
  292. }
  293. cipher.doFinal.overload('[B').implementation = function() {
  294. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  295. console.log("Cipher.doFinal('[B') is called!");
  296. var algorithm = this.getAlgorithm();
  297. var tag = algorithm + " doFinal data";
  298. var data = arguments[0];
  299. toBase64(tag, data);
  300. toHex(tag, data);
  301. toBase64(tag, data);
  302. var result = this.doFinal.apply(this, arguments);
  303. var tags = algorithm + " doFinal result";
  304. toHex(tags, result);
  305. toBase64(tags, result);
  306. showStacks2();
  307. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  308. return result;
  309. }
  310. cipher.doFinal.overload('[B', 'int', 'int').implementation = function() {
  311. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  312. console.log("Cipher.doFinal('[B', 'int', 'int') is called!");
  313. var algorithm = this.getAlgorithm();
  314. var tag = algorithm + " doFinal data";
  315. var data = arguments[0];
  316. toUtf8(tag, data);
  317. toHex(tag, data);
  318. toBase64(tag, data);
  319. var result = this.doFinal.apply(this, arguments);
  320. var tags = algorithm + " doFinal result";
  321. toHex(tags, result);
  322. toBase64(tags, result);
  323. console.log("arguments[1]:", arguments[1], );
  324. console.log("arguments[2]:", arguments[2]);
  325. showStacks2();
  326. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  327. return result;
  328. }
  329. var signature = Java.use("java.security.Signature");
  330. signature.update.overload('byte').implementation = function(data) {
  331. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  332. console.log("Signature.update('byte') is called!");
  333. showStacks2();
  334. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  335. return this.update(data);
  336. }
  337. signature.update.overload('java.nio.ByteBuffer').implementation = function(data) {
  338. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  339. console.log("Signature.update('java.nio.ByteBuffer') is called!");
  340. showStacks2();
  341. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  342. return this.update(data);
  343. }
  344. signature.update.overload('[B', 'int', 'int').implementation = function(data, start, length) {
  345. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  346. console.log("Signature.update('[B', 'int', 'int') is called!");
  347. var algorithm = this.getAlgorithm();
  348. var tag = algorithm + " update data";
  349. toUtf8(tag, data);
  350. toHex(tag, data);
  351. toBase64(tag, data);
  352. console.log("start:", start);
  353. console.log("length:", length);
  354. showStacks2();
  355. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  356. return this.update(data, start, length);
  357. }
  358. signature.sign.overload('[B', 'int', 'int').implementation = function() {
  359. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  360. console.log("Signature.sign('[B', 'int', 'int') is called!");
  361. showStacks2();
  362. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  363. return this.sign.apply(this, arguments);
  364. }
  365. signature.sign.overload().implementation = function() {
  366. console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
  367. console.log("Signature.sign() is called!");
  368. var result = this.sign();
  369. var algorithm = this.getAlgorithm();
  370. var tag = algorithm + " sign result";
  371. toHex(tag, result);
  372. toBase64(tag, result);
  373. showStacks2();
  374. console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  375. return result;
  376. }

字符串
我也可以用我自己生成的密钥对模拟这个过程。当我解密响应数据时,它会给我一些我不知道其用途的二进制数据!!但现在这无关紧要

展开查看全部

相关问题