工具与环境:

IDA7.0

JEB2.2.5

Nexus 5

Android 4.4

目录:

一:app简单分析与java层反编译

二: compatible.so反调试与反反调试

三: compatible.so注册jni函数分析

四: stub.so反调试与反反调试

五: stub.so注册jni函数分析

六: Assembly-CSharp.dll解密分析

七: libengine模块分析

八:总结

一:app简单分析与java层反编译

整体图:

1.最近在学习手游保护方面的技术,本文是学习过程中分析某反外挂的一点记录,高手莫要见笑,有不对的地方还请指教,首先简单通过资源目录中文件名做基本了解,

在lib目录中有libmono.so、libunity.so,资源目录中存在(assets\bin\Data\Managed\Assembly-CSharp.dll),应该是unity 3D编写,通过反编译发现该文件己被加密,在资源目录下armeabi文件夹中还存放着libengine.sox与libstub.sox文件,看名字猜测很可能这两个文件就是反外挂其中的一些模块了,在看看lib目录下只有libcompatible.so模块比较可疑。如下图所示:

当我们用调试器附加游戏程进时会有如下提示:

被发现有调试器附加,下节我们将分析它的反调试机制。

2.通过JEB反编译来看看大致流程,反编译后先找到application类,代码如下图:

主要是加载so模块,so名称字符串被加密了,解密出来后so名称"compatible",将compatible.so放到IDA中反编译发现函数名被混淆了,字符串己加密,如下图:

通过以上简单分析,我们主要关注的重点关注的模块主要有lib目录下的libcompatible.so与资源目录中的libengine.sox与libstub.sox,还有就是发现java层的字符串与函数名都被混淆,so模块中的字符串也函数名也被混淆。

3.拷贝资源,解密libstub.sox并加载 。

在Lcom/inca/security/Core/AppGuardEngine初始函数<init>(Landroid/content/Context;Lcom/inca/security/AppGuard/AppGuardEventListener;Z)V中将判断X86或ARM平台并将对应的\assets\appguard中的libengine.sox、libstub.sox、update.dat拷贝到程序安装目录。JEB未能正常反编译出java代码,看smali代码。

  1. :1946
  2. 00001946 const/4 v9, 3
  3. 00001948 if-ge v6, v9, :1C16
  4. :194C
  5. 0000194C invoke-static Binder->getABI()I
  6. 00001952 move-result v6
  7. 00001954 move-object/from16 v0, p0
  8. 00001958 move-object/from16 v1, p1
  9. 0000195C invoke-virtual AppGuardEngine->iiIIIiiiIi(Context, I)Z, v0, v1, v6 # 拷贝资源
  10. 00001962 move-result v6
  11. 00001964 if-eqz v6, :1BE0
  12. :1968
  13. 00001968 new-instance v6, qb
  14. 0000196C invoke-static JNISoxProxy->getContext()Context
  15. 00001972 move-result-object v9
  16. 00001974 invoke-direct qb-><init>(Context)V, v6, v9
  17. 0000197A const-string v9, "fChY~_h\u0004yEr" # libstub.sox
  18. 0000197E invoke-virtual qb->iiIIIiiiIi([B)V, v6, v8
  19. 00001984 invoke-static b->iiIIIiiiIi(String)String, v9
  20. 0000198A move-result-object v9
  21. 0000198C const-string v10, "j\u000Fd\u0015r\u0013dHu\t" # libstub.so
  22. 00001990 invoke-static yb->iiIIIiiiIi(String)String, v10
  23. 00001996 move-result-object v10
  24. 00001998 const/4 v11, 0
  25. 0000199A invoke-virtual qb->iiIIIiiiIi(String, String, [B)Z, v6, v9, v10, v11 # 解密libstub.sox((最终传入so层解密private static native byte[] iIiIIIiIiI(byte[] arg0, int arg1)))
  26. 000019A0 move-result v6
  27. 000019A2 if-eqz v6, :1BE0
  28. :19A6
  29. 000019A6 new-instance v6, File
  30. 000019AA new-instance v9, StringBuilder
  31. 000019AE invoke-direct StringBuilder-><init>()V, v9
  32. 000019B4 const/4 v10, 0
  33. 000019B6 invoke-static JNISoxProxy->getContext()Context
  34. 000019BC move-result-object v11
  35. 000019BE invoke-virtual Context->getFilesDir()File, v11
  36. 000019C4 move-result-object v11
  37. 000019C6 invoke-virtual File->getAbsolutePath()String, v11
  38. 000019CC move-result-object v11
  39. 000019CE invoke-virtual StringBuilder->insert(I, String)StringBuilder, v9, v10, v11
  40. 000019D4 move-result-object v9
  41. 000019D6 const-string v10, "%FcHy^\u007FH$Ye" # /libstub.so
  42. 000019DA invoke-static b->iiIIIiiiIi(String)String, v10
  43. 000019E0 move-result-object v10
  44. 000019E2 invoke-virtual StringBuilder->append(String)StringBuilder, v9, v10
  45. 000019E8 move-result-object v9
  46. 000019EA invoke-virtual StringBuilder->toString()String, v9
  47. 000019F0 move-result-object v9
  48. 000019F2 invoke-direct File-><init>(String)V, v6, v9
  49. 000019F8 invoke-virtual File->exists()Z, v6
  50. :19FE
  51. 000019FE move-result v9
  52. 00001A00 if-eqz v9, :1BE0
  53. :1A04
  54. 00001A04 invoke-virtual File->getAbsolutePath()String, v6
  55. 00001A0A move-result-object v9
  56. 00001A0C invoke-static System->load(String)V, v9 # 加载指定路径的SO
  57. 00001A12 invoke-direct/range AppGuardEngine->lllIIIlllI(Context)V, p0 .. p1 # 调用Native
  58. :1A18
  59. 00001A18 invoke-virtual File->delete()Z, v6
  60. 00001A1E new-instance v6, File
  61. 00001A22 new-instance v9, StringBuilder
  62. 00001A26 invoke-direct StringBuilder-><init>()V, v9
  63. 00001A2C const/4 v10, 0
  64. 00001A2E invoke-static JNISoxProxy->getContext()Context
  65. 00001A34 move-result-object v11
  66. 00001A36 invoke-virtual Context->getFilesDir()File, v11
  67. 00001A3C move-result-object v11
  68. 00001A3E invoke-virtual File->getAbsolutePath()String, v11
  69. 00001A44 move-result-object v11
  70. 00001A46 invoke-virtual StringBuilder->insert(I, String)StringBuilder, v9, v10, v11
  71. 00001A4C move-result-object v9
  72. 00001A4E const-string v10, ")\no\u0004u\u0012s\u0004(\u0015i\u001E" # /libstub.sox
  73. 00001A52 invoke-static yb->iiIIIiiiIi(String)String, v10
  74. 00001A58 move-result-object v10
  75. 00001A5A invoke-virtual StringBuilder->append(String)StringBuilder, v9, v10
  76. 00001A60 move-result-object v9
  77. 00001A62 invoke-virtual StringBuilder->toString()String, v9
  78. 00001A68 move-result-object v9
  79. 00001A6A invoke-direct File-><init>(String)V, v6, v9
  80. 00001A70 invoke-virtual File->delete()Z, v6

4. 解密libstub.sox模块。

解密函数在类com/inca/security/qb中iiIIIiiiIi函数,代码如下:

  1. @SuppressLint(value={"SdCardPath"}) public boolean iiIIIiiiIi(String arg25, String arg26, byte[] arg27) throws IOException, InvalidKeyException {
  2. Object v18;
  3. Object v5_2;
  4. long v16_1;
  5. Method v8_3;
  6. Class v11_2;
  7. Object v7_2;
  8. Object v4_7;
  9. Method v15; // doFinal
  10. Method v14_1; // init java.security.Key
  11. Object v13_1; // RSA/ECB/PKCS1Padding
  12. int v8_1;
  13. int v7;
  14. FileInputStream v13;
  15. Method v4_6;
  16. byte[] v7_1;
  17. boolean v4_2;
  18. Method v5_1; // read
  19. byte[] v12;
  20. byte[] v11;
  21. Object v10; // /
  22. Class v9; // java.io.FileInputStream
  23. try {
  24. v9 = Class.forName(vb.iiIIIiiiIi("&3:3b;#|\n; 7\u0005<<\'8\u00018 )3!")); // java.io.FileInputStream
  25. Constructor v4_1 = v9.getConstructor(String.class);
  26. v10 = v4_1.newInstance(arg25.indexOf(yb.iiIIIiiiIi("I")) == 0 ? arg25 : new StringBuilder().insert(0, this.iiIiiiIIIi).append(arg25).toString()); // /
  27. v11 = new byte[16];
  28. v12 = new byte[4];
  29. v5_1 = v9.getMethod(vb.iiIIIiiiIi(" )3("), byte[].class, Integer.TYPE, Integer.TYPE); // read
  30. v5_1.invoke(v10, v11, Integer.valueOf(0), Integer.valueOf(3));
  31. if(v11[0] == 83 && v11[1] == 79 && v11[2] == 88) { // 判断开头是否为SOX
  32. goto label_82;
  33. }
  34.  
  35. v4_2 = false;
  36. return v4_2;
  37. }
  38. catch(Exception v4) {
  39. goto label_78;
  40. }
  41.  
  42. label_82:
  43. int v4_3 = 3;
  44. try {
  45. v5_1.invoke(v10, v11, Integer.valueOf(0), Integer.valueOf(2));
  46. if((((short)((((short)v11[0])) | (((short)v11[1])) << 8))) != 1) {
  47. return false;
  48. }
  49.  
  50. v5_1.invoke(v10, v11, Integer.valueOf(0), Integer.valueOf(1));
  51. v5_1.invoke(v10, v11, Integer.valueOf(0), Integer.valueOf(2));
  52. v5_1.invoke(v10, v11, Integer.valueOf(0), Integer.valueOf(2));
  53. v5_1.invoke(v10, v11, Integer.valueOf(0), Integer.valueOf(4));
  54. v5_1.invoke(v10, v11, Integer.valueOf(0), Integer.valueOf(4));
  55. v5_1.invoke(v10, v12, Integer.valueOf(0), Integer.valueOf(4));
  56. v5_1.invoke(v10, v11, Integer.valueOf(0), Integer.valueOf(12));
  57. v5_1.invoke(v10, v11, Integer.valueOf(0), Integer.valueOf(16));
  58. v5_1.invoke(v10, v11, Integer.valueOf(0), Integer.valueOf(16));
  59. byte[] v4_5 = null;
  60. if(v11[0] == 0 || v11[1] == 0 || v11[14] == 0 || v11[15] == 0) {
  61. v7_1 = v4_5;
  62. v4_6 = v5_1;
  63. goto label_291;
  64. label_276:
  65. while(v7 < 64) {
  66. v13.read(v11);
  67. if(v8_1 == v14) {
  68. v4_5 = new byte[16];
  69. System.arraycopy(v11, 0, v4_5, 0, 16);
  70. }
  71.  
  72. v7 = v8_1 + 1;
  73. v8_1 = v7;
  74. }
  75.  
  76. v13.close();
  77. v7_1 = v4_5;
  78. v4_6 = v5_1;
  79. }
  80. else {
  81. File v8 = new File(String.format(yb.iiIIIiiiIi("CuI#\u0015(\u0012v\r"), arg25.substring(0, arg25.lastIndexOf(47)), qb.iiIIIiiiIi(v11))); // %s/%s.tpk
  82. if(v8.exists()) {
  83. v13 = new FileInputStream(v8);
  84. v13.read(v11);
  85. int v14 = (Math.abs(v11[0] << 24 | v11[4] << 16 | v11[8] << 8 | v11[12]) + 1) % 64;
  86. v7 = 1;
  87. v8_1 = 1;
  88. goto label_276;
  89. }
  90. else {
  91. return false;
  92. }
  93. }
  94.  
  95. label_291:
  96. v4_6.invoke(v10, v11, Integer.valueOf(0), Integer.valueOf(4));
  97. v4_5 = new byte[(v11[3] & 255) << 24 | 0 | (v11[2] & 255) << 16 | (v11[1] & 255) << 8 | v11[0] & 255];
  98. v5_1 = v9.getMethod(vb.iiIIIiiiIi(" )3("), byte[].class); // read
  99. v5_1.invoke(v10, v4_5);
  100. Class v8_2 = Class.forName(yb.iiIIIiiiIi("\fg\u0010g\u001E(\u0005t\u001Fv\u0012iHE\u000Fv\u000Ec\u0014")); // javax.crypto.Cipher
  101. Method v11_1 = v8_2.getMethod(vb.iiIIIiiiIi("+78\u001B\"!83\"1)"), String.class); // getInstance
  102. v13_1 = v11_1.invoke(null, yb.iiIIIiiiIi("T5GIC%DIV-E576g\u0002b\u000Fh\u0001")); // RSA/ECB/PKCS1Padding
  103. v14_1 = v8_2.getMethod(vb.iiIIIiiiIi(";\";8"), Integer.TYPE, Class.forName(yb.iiIIIiiiIi("\fg\u0010gHu\u0003e\u0013t\u000Fr\u001F(-c\u001F"))); // init java.security.Key
  104. v14_1.invoke(v13_1, Integer.valueOf(2), this.iIiIIiIiIi);
  105. v15 = v8_2.getMethod(vb.iiIIIiiiIi("(=\n;\"3 "), byte[].class); // doFinal
  106. v4_7 = v15.invoke(v13_1, v4_5);
  107. if(v7_1 != null) {
  108. v13_1 = v11_1.invoke(null, yb.iiIIIiiiIi("\'C5")); // AES
  109. v14_1.invoke(v13_1, Integer.valueOf(2), Class.forName(vb.iiIIIiiiIi("&3:34|/ 5\"8=b!<7/|\u001F7/ )&\u000775\u0001<7/")).getConstructor(byte[].class, String.class).newInstance(v7_1, yb.iiIIIiiiIi("\'C5"))); // javax.crypto.spec.SecretKeySpec AES
  110. v4_7 = v15.invoke(v13_1, v4_7);
  111. }
  112.  
  113. v7_2 = null;
  114. v7_2 = v11_1.invoke(v7_2, vb.iiIIIiiiIi("\r\u0017\u001F"));
  115. v14_1.invoke(v7_2, Integer.valueOf(2), Class.forName(yb.iiIIIiiiIi("\fg\u0010g\u001E(\u0005t\u001Fv\u0012iHu\u0016c\u0005(5c\u0005t\u0003r-c\u001FU\u0016c\u0005")).getConstructor(byte[].class, String.class).newInstance(v4_7, vb.iiIIIiiiIi("\r\u0017\u001F")));
  116. v11_2 = Class.forName(yb.iiIIIiiiIi("\fg\u0010gHo\t($\u007F\u0012c\'t\u0014g\u001FI\u0013r\u0016s\u0012U\u0012t\u0003g\u000B"));
  117. v13_1 = v11_2.getConstructor(null).newInstance(null);
  118. byte[] v14_2 = new byte[1024];
  119. v15 = v8_2.getMethod(vb.iiIIIiiiIi("\'<6-&)"), byte[].class, Integer.TYPE, Integer.TYPE);
  120. Method v16 = v11_2.getMethod(yb.iiIIIiiiIi("\u0011t\u000Fr\u0003"), byte[].class);
  121. for(v4_6 = v5_1; true; v4_6 = v5_1) {
  122. v4_3 = v4_6.invoke(v10, v14_2).intValue();
  123. if(v4_3 == -1) {
  124. break;
  125. }
  126.  
  127. v16.invoke(v13_1, v15.invoke(v7_2, v14_2, Integer.valueOf(0), Integer.valueOf(v4_3)));
  128. }
  129.  
  130. v16.invoke(v13_1, v8_2.getMethod(vb.iiIIIiiiIi("(=\n;\"3 "), null).invoke(v7_2, null));
  131. v4_7 = v11_2.getMethod(yb.iiIIIiiiIi("\u0012i$\u007F\u0012c\'t\u0014g\u001F"), null).invoke(v13_1, null);
  132. if(arg25.indexOf(vb.iiIIIiiiIi("c")) != 0) {
  133. arg26 = new StringBuilder().insert(0, this.iiIiiiIIIi).append(arg26).toString();
  134. }
  135.  
  136. Class v7_3 = Class.forName(yb.iiIIIiiiIi("l\u0007p\u0007(\u000FiH@\u000Fj\u0003I\u0013r\u0016s\u0012U\u0012t\u0003g\u000B"));
  137. v8_3 = v7_3.getMethod(vb.iiIIIiiiIi("; %&)"), byte[].class);
  138. v14_1 = v7_3.getMethod(yb.iiIIIiiiIi("\u0005j\tu\u0003"), null);
  139. v15 = v7_3.getMethod(vb.iiIIIiiiIi("*>9!$"), null);
  140. v7_2 = v7_3.getConstructor(String.class).newInstance(arg26);
  141. v16_1 = na.iIIIiiiIII(((byte[])v4_7), 5);
  142. v5_2 = null;
  143. }
  144. catch(Exception v4) {
  145. goto label_78;
  146. }
  147.  
  148. try {
  149. v18 = Binder.getReserved1();
  150. if(v18 == null) {
  151. goto label_761;
  152. }
  153. }
  154. catch(Exception v4) {
  155. goto label_760;
  156. }
  157.  
  158. try {
  159. v5_2 = v18.getClass().getMethod(yb.iiIIIiiiIi("o/o/O\u000Fo/o/"), byte[].class, Integer.TYPE).invoke(v18, v4_7, Integer.valueOf(((int)v16_1)));
  160. }
  161. catch(Exception v4) {
  162. try {
  163. v4.printStackTrace();
  164. goto label_659;
  165. label_761:
  166. byte[] v5_3 = AppGuardEngine.iiIIIiiiIi(((byte[])v4_7), ((int)v16_1)); // 传入SO层解密 (该Native函数在compatible.so进行动态注册)
  167. label_760:
  168. }
  169. catch(Exception v4) {
  170. goto label_760;
  171. }
  172. }
  173.  
  174. label_659:
  175. v4_3 = 3;
  176. try {
  177. int v12_1 = v12[0] & 255 | ((v12[v4_3] & 255) << 24 | 0 | (v12[2] & 255) << 16 | (v12[1] & 255) << 8);
  178. Class v16_2 = Class.forName(vb.iiIIIiiiIi("&3:3b\'8; |6;<|\r6 7>a~"));
  179. Object v17 = v16_2.getConstructor(null).newInstance(null);
  180. v16_2.getMethod(yb.iiIIIiiiIi("s\u0016b\u0007r\u0003"), byte[].class, Integer.TYPE, Integer.TYPE).invoke(v17, v5_2, Integer.valueOf(0), Integer.valueOf(v5_2.length));
  181. v16_1 = v16_2.getMethod(vb.iiIIIiiiIi("5)&\u001A3 \')"), null).invoke(v17, null).longValue();
  182. if(v12_1 != 0 && v12_1 != (((int)v16_1))) {
  183. v14_1.invoke(v7_2, null);
  184. v4_2 = false;
  185. }
  186. else {
  187. v8_3.invoke(v7_2, v5_2);
  188. v15.invoke(v7_2, null);
  189. v14_1.invoke(v7_2, null);
  190. v9.getMethod(yb.iiIIIiiiIi("\u0005j\tu\u0003"), null).invoke(v10, null);
  191. v11_2.getMethod(vb.iiIIIiiiIi("/>#!)"), null).invoke(v13_1, null);
  192. v9.getMethod(yb.iiIIIiiiIi("\u0005j\tu\u0003"), null).invoke(v10, null);
  193. v4_2 = true;
  194. }
  195.  
  196. return v4_2;
  197. }
  198. catch(Exception v4) {
  199. label_78:
  200. Exception v5_4 = v4;
  201. v4_2 = false;
  202. v5_4.printStackTrace();
  203. return v4_2;
  204. }
  205. }

java层AES解密再传入传入so层解密private static native byte[] iIiIIIiIiI(byte[] arg0, int arg1)。

5. 解密libengine.sox模块

在Lcom/inca/security/Core/AppGuardEngine;->iiIIIiiiIi([B)Z生成一个随机数后SHA1后字会串做为解密后的文件名存放在/data/data/包名/files/目录下,解密函数与上一步相同。

生成随机数代码:

  1. .method private synthetic iiIIIiiiIi([B)Z
  2. .registers 12
  3. .annotation build SuppressLint
  4. value = {
  5. "TrulyRandom"
  6. }
  7. .end annotation
  8. .annotation system Throws
  9. value = {
  10. AppGuardException
  11. }
  12. .end annotation
  13. 00000000 const/4 v9, 2
  14. 00000002 const/16 v8, -0x007E
  15. 00000006 const/16 v7, 0x0030
  16. 0000000A const/4 v2, 0
  17. 0000000C const/4 v3, 1
  18. :E
  19. 0000000E const-string v1, "U.GW" # SHA1
  20. 00000012 invoke-static yb->iiIIIiiiIi(String)String, v1
  21. 00000018 move-result-object v1
  22. 0000001A invoke-static MessageDigest->getInstance(String)MessageDigest, v1
  23. :20
  24. 00000020 move-result-object v1
  25. :22
  26. 00000022 new-instance v4, SecureRandom
  27. 00000026 invoke-direct SecureRandom-><init>()V, v4
  28. 0000002C const/16 v5, 0x0100
  29. 00000030 new-array v5, v5, [B
  30. 00000034 const/16 v6, 0x0126
  31. 00000038 invoke-virtual SecureRandom->nextBytes([B)V, v4, v5
  32. 0000003E invoke-virtual MessageDigest->update([B)V, v1, v5
  33. 00000044 invoke-virtual SecureRandom->nextBytes([B)V, v4, v5
  34. 0000004A invoke-virtual MessageDigest->update([B)V, v1, v5
  35. 00000050 new-instance v4, BigInteger
  36. 00000054 invoke-virtual MessageDigest->digest()[B, v1
  37. 0000005A move-result-object v1
  38. 0000005C invoke-direct BigInteger-><init>(I, [B)V, v4, v3, v1
  39. 00000062 const/16 v1, 0x0010
  40. 00000066 invoke-virtual BigInteger->toString(I)String, v4, v1 # 随机数后SHA1值
  41. 0000006C move-result-object v1
  42. 0000006E iput-object v1, p0, AppGuardEngine->IiIIiiiiii_Random_SHA1:String # 解密后文件名
  43. //解密并调用
  44. 00000D7A new-instance v4, qb
  45. 00000D7E invoke-static JNISoxProxy->getContext()Context
  46. 00000D84 move-result-object v5
  47. 00000D86 invoke-direct qb-><init>(Context)V, v4, v5
  48. 00000D8C const-string v5, "fChOdMcDo\u0004yEr" # libengine.sox
  49. 00000D90 invoke-virtual qb->iiIIIiiiIi([B)V, v4, v1
  50. 00000D96 invoke-static b->iiIIIiiiIi(String)String, v5
  51. 00000D9C move-result-object v1
  52. 00000D9E iget-object v5, p0, AppGuardEngine->IiIIiiiiii_Random_SHA1:String
  53. 00000DA2 const/4 v6, 0
  54. 00000DA4 invoke-virtual qb->iiIIIiiiIi(String, String, [B)Z, v4, v1, v5, v6 # 解密libengine.sox(最终传入so层解密private static native byte[] iIiIIIiIiI(byte[] arg0, int arg1))
  55. :DAA
  56. 00000DAA move-object v0, p0
  57. :DAC
  58. 00000DAC invoke-static JNISoxProxy->getContext()Context
  59. 00000DB2 move-result-object v1
  60. 00000DB4 new-instance v4, StringBuilder
  61. 00000DB8 invoke-direct StringBuilder-><init>()V, v4
  62. 00000DBE invoke-static JNISoxProxy->getContext()Context
  63. 00000DC4 move-result-object v5
  64. 00000DC6 invoke-virtual Context->getFilesDir()File, v5
  65. 00000DCC move-result-object v5
  66. 00000DCE invoke-virtual File->getAbsolutePath()String, v5
  67. 00000DD4 move-result-object v5
  68. 00000DD6 invoke-virtual StringBuilder->insert(I, String)StringBuilder, v4, v2, v5
  69. 00000DDC move-result-object v4
  70. 00000DDE const-string v5, "%" # /
  71. 00000DE2 invoke-static b->iiIIIiiiIi(String)String, v5
  72. 00000DE8 move-result-object v5
  73. 00000DEA invoke-virtual StringBuilder->append(String)StringBuilder, v4, v5
  74. 00000DF0 move-result-object v4
  75. 00000DF2 iget-object v5, p0, AppGuardEngine->IiIIiiiiii_Random_SHA1:String
  76. 00000DF6 invoke-virtual StringBuilder->append(String)StringBuilder, v4, v5
  77. 00000DFC move-result-object v4
  78. 00000DFE invoke-virtual StringBuilder->toString()String, v4
  79. 00000E04 move-result-object v4
  80. 00000E06 invoke-direct AppGuardEngine->IIIIIIIlIl(Context, String, [B)I, v0, v1, v4, p1 # 将解密后将libengine文件路径传入该Native函数中调用
  81. 00000E0C move-result v1
  82. 00000E0E if-gez v1, :E9A

解密后的so会在Native函数中通过dlopen、dlsym来调用。

二: compatible.so反调试与反反调试

1. 反调试 (文件偏移 13284)

  1. /data/app-lib/com.digitalsky.girlsfrontline.cn-/libcompatible.so 757C8000 0005F000
  2. .text:757DB284 loc_757DB284 ; CODE XREF: JNI_OnLoad+254j
  3. .text:757DB284 5C E3 CMP R12, #
  4. .text:757DB288 BA BLT loc_757DB2F0
  5. .text:757DB28C E2 RSB R3, R8, #
  6. .text:757DB290 E0 EOR R0, R0, R3
  7. .text:757DB294 E0 ADD R8, R0, R8
  8. .text:757DB298 0D E3 CMP R8, #0xD ; 判断SDK版本
  9. .text:757DB29C 9F FF FF DA BLE loc_757DB120
  10. .text:757DB2A0
  11. .text:757DB2A0 loc_757DB2A0 ; CODE XREF: JNI_OnLoad+2E4j
  12. .text:757DB2A0 7D 2B EB BL _Z11lIlIlIIIIIIv ; 创建3进程和多线程反调试
  13. .text:757DB2A4 E2 SUBS R2, R0, # ; char *

如果SDK大于0XD时就创建3进程与多线程反调试:

  1. .text:756F84B0 EXPORT _Z11IIIIIIIllllv
  2. .text:756F84B0 _Z11IIIIIIIllllv ; CODE XREF: JNI_OnLoad:loc_756EE6E4p
  3. .text:756F84B0
  4. .text:756F84B0 var_2C= -0x2C
  5. .text:756F84B0 var_28= -0x28
  6. .text:756F84B0 var_24= -0x24
  7. .text:756F84B0 var_20= -0x20
  8. .text:756F84B0
  9. .text:756F84B0 ; __unwind {
  10. .text:756F84B0 F0 2D E9 STMFD SP!, {R4-R9,LR}
  11. .text:756F84B4 C0 9F E5 LDR R4, =(_GLOBAL_OFFSET_TABLE_ - 0x756F84C8)
  12. .text:756F84B8 C0 9F E5 LDR R2, =(__stack_chk_guard_ptr - 0x7572FED0)
  13. .text:756F84BC C0 9F E5 LDR R3, =(_ZN6Global10lIlIIllIIlE_ptr - 0x7572FED0)
  14. .text:756F84C0 8F E0 ADD R4, PC, R4 ; _GLOBAL_OFFSET_TABLE_
  15. .text:756F84C4 E7 LDR R7, [R4,R2]
  16. .text:756F84C8 D0 4D E2 SUB SP, SP, #0x14
  17. .text:756F84CC E5 LDR R2, [R7]
  18. .text:756F84D0 0C 8D E5 STR R2, [SP,#0x30+var_24]
  19. .text:756F84D4 E7 LDR R6, [R4,R3]
  20. .text:756F84D8 A0 E1 MOV R0, R6 ; int *
  21. .text:756F84DC F2 FF EB BL pipi
  22. .text:756F84E0 E3 CMP R0, #
  23. .text:756F84E4 BA BLT loc_756F8538
  24. .text:756F84E8 E2 ADD R0, R6, # ; int *
  25. .text:756F84EC 6E F2 FF EB BL pipi
  26. .text:756F84F0 E3 CMP R0, #
  27. .text:756F84F4 0F BA BLT loc_756F8538
  28. .text:756F84F8 E2 ADD R0, R6, #0x48 ; int *
  29. .text:756F84FC 6A F2 FF EB BL pipi
  30. .text:756F8500 E3 CMP R0, #
  31. .text:756F8504 0B BA BLT loc_756F8538
  32. .text:756F8508 E2 ADD R0, R6, #0x30 ; int *
  33. .text:756F850C F2 FF EB BL pipi
  34. .text:756F8510 E3 CMP R0, #
  35. .text:756F8514 BA BLT loc_756F8538
  36. .text:756F8518 E2 ADD R0, R6, #0x38 ; int *
  37. .text:756F851C F2 FF EB BL pipi
  38. .text:756F8520 E3 CMP R0, #
  39. .text:756F8524 BA BLT loc_756F8538
  40. .text:756F8528 E2 ADD R0, R6, #0x40 ; int *
  41. .text:756F852C 5E F2 FF EB BL pipi
  42. .text:756F8530 E3 CMP R0, #
  43. .text:756F8534 AA BGE loc_756F8540
  44. .text:756F8538
  45. .text:756F8538 loc_756F8538 ; CODE XREF: IIIIIIIllll(void)+34j
  46. .text:756F8538 ; IIIIIIIllll(void)+44j ...
  47. .text:756F8538 A0 E3 MOV R0, # ; int
  48. .text:756F853C 4E F2 FF EB BL _Z10llIIlIIIlli ; llIIlIIIll(int)
  49. .text:756F8540
  50. .text:756F8540 loc_756F8540 ; CODE XREF: IIIIIIIllll(void)+84j
  51. .text:756F8540 A0 E3 MOV R1, #
  52. .text:756F8544 A0 E3 MOV R0, # ; option
  53. .text:756F8548 AF CB FF EB BL prctl
  54. .text:756F854C F2 FF EB BL getpid_0
  55. .text:756F8550 9F E5 LDR R3, =(_ZN6Global10lIllllIllIE_ptr - 0x7572FED0)
  56. .text:756F8554 E7 LDR R5, [R4,R3]
  57. .text:756F8558 E5 STR R0, [R5] ; Global::lIllllIllI
  58. .text:756F855C F2 FF EB BL fork
  59. .text:756F8560 E3 CMN R0, #
  60. .text:756F8564 E5 STR R0, [R5,#(dword_757309F4 - 0x757309F0)]
  61. .text:756F8568 0A BEQ loc_756F87B8
  62. .text:756F856C
  63. .text:756F856C loc_756F856C ; CODE XREF: IIIIIIIllll(void)+314j
  64. .text:756F856C E3 CMP R0, #
  65. .text:756F8570 DA BLE loc_756F8648
  66. .text:756F8574 A0 E3 MOV R8, #
  67. .text:756F8578 A0 E3 MOV R9, #
  68. .text:756F857C 9F E5 LDR R3, =(_ZN6Global10IIlIIlIIlIE_ptr - 0x7572FED0)
  69. .text:756F8580 8D E2 ADD R1, SP, #0x30+var_20
  70. .text:756F8584 E5 LDR R0, [R6,#(dword_75730EBC - 0x75730E84)] ; int
  71. .text:756F8588 E7 LDR R3, [R4,R3]
  72. .text:756F858C A0 E3 MOV R2, # ; unsigned int
  73. .text:756F8590 E5 STR R8, [R1,#-0x10]!
  74. .text:756F8594 C3 E5 STRB R9, [R3] ; Global::IIlIIlIIlI
  75. .text:756F8598 7B F2 FF EB BL read
  76. .text:756F859C EC 9F E5 LDR R1, =(_ZN6Global6ThreadE_ptr - 0x7572FED0)
  77. .text:756F85A0 EC 9F E5 LDR R2, =(_Z10IlIIlllIIlPv_ptr - 0x7572FED0)
  78. .text:756F85A4 E2 ADD R3, R5, # ; void *
  79. .text:756F85A8 E7 LDR R6, [R4,R1]
  80. .text:756F85AC E7 LDR R2, [R4,R2] ; void *(__cdecl *)(void *)
  81. .text:756F85B0 A0 E1 MOV R1, R8 ; pthread_attr_t *
  82. .text:756F85B4 A0 E1 MOV R0, R6 ; int *
  83. .text:756F85B8 6D F1 FF EB BL pthread_create_0
  84. .text:756F85BC E1 CMP R0, R8
  85. .text:756F85C0 BA BLT loc_756F87C8
  86. .text:756F85C4
  87. .text:756F85C4 loc_756F85C4 ; CODE XREF: IIIIIIIllll(void)+334j
  88. .text:756F85C4 CC 9F E5 LDR R3, =(_Z10IIlIlllllIPv_ptr - 0x7572FED0)
  89. .text:756F85C8 E2 ADD R0, R6, # ; int *
  90. .text:756F85CC A0 E3 MOV R1, # ; pthread_attr_t *
  91. .text:756F85D0 E7 LDR R2, [R4,R3] ; void *(__cdecl *)(void *)
  92. .text:756F85D4 A0 E3 MOV R3, # ; void *
  93. .text:756F85D8 F1 FF EB BL pthread_create_0
  94. .text:756F85DC E3 CMP R0, #
  95. .text:756F85E0 6C BA BLT loc_756F8798
  96. .text:756F85E4
  97. .text:756F85E4 loc_756F85E4 ; CODE XREF: IIIIIIIllll(void)+304j
  98. .text:756F85E4 A0 E3 MOV R1, # ; pthread_attr_t *
  99. .text:756F85E8 AC 9F E5 LDR R2, =(_Z11IIIlllIIIIIPv_ptr - 0x7572FED0)
  100. .text:756F85EC A0 E1 MOV R3, R1 ; void *
  101. .text:756F85F0 E7 LDR R2, [R4,R2] ; void *(__cdecl *)(void *)
  102. .text:756F85F4 E2 ADD R0, R6, #0x10 ; int *
  103. .text:756F85F8 5D F1 FF EB BL pthread_create_0
  104. .text:756F85FC A0 E3 MOV R1, # ; pthread_attr_t *
  105. .text:756F8600 9F E5 LDR R2, =(_Z11IIIlIIlIllIPv_ptr - 0x7572FED0)
  106. .text:756F8604 A0 E1 MOV R3, R1 ; void *
  107. .text:756F8608 E7 LDR R2, [R4,R2] ; void *(__cdecl *)(void *)
  108. .text:756F860C 8D E2 ADD R0, SP, #0x30+var_2C ; int *
  109. .text:756F8610 F1 FF EB BL pthread_create_0
  110. .text:756F8614 9F E5 LDR R3, =(_Z10IIllIIlIlIPv_ptr - 0x7572FED0)
  111. .text:756F8618 8D E2 ADD R0, SP, #0x30+var_28 ; int *
  112. .text:756F861C A0 E3 MOV R1, # ; pthread_attr_t *
  113. .text:756F8620 E7 LDR R2, [R4,R3] ; void *(__cdecl *)(void *)
  114. .text:756F8624 A0 E3 MOV R3, # ; void *
  115. .text:756F8628 F1 FF EB BL pthread_create_0
  116. .text:756F862C
  117. .text:756F862C loc_756F862C ; CODE XREF: IIIIIIIllll(void)+250j
  118. .text:756F862C 0C 9D E5 LDR R2, [SP,#0x30+var_24]
  119. .text:756F8630 E5 LDR R3, [R7]
  120. .text:756F8634 A0 E3 MOV R0, #
  121. .text:756F8638 E1 CMP R2, R3
  122. .text:756F863C 8D 1A BNE loc_756F8878
  123. .text:756F8640 D0 8D E2 ADD SP, SP, #0x14
  124. .text:756F8644 F0 BD E8 LDMFD SP!, {R4-R9,PC}
  125. .text:756F8648 ; ---------------------------------------------------------------------------
  126. .text:756F8648
  127. .text:756F8648 loc_756F8648 ; CODE XREF: IIIIIIIllll(void)+C0j
  128. .text:756F8648 CB FF EB BL getpid
  129. .text:756F864C E5 STR R0, [R5,#(dword_757309F4 - 0x757309F0)]
  130. .text:756F8650 F2 FF EB BL fork
  131. .text:756F8654 E2 ADD R1, R5, # ; void *
  132. .text:756F8658 E5 STR R0, [R5,#(dword_757309F8 - 0x757309F0)]
  133. .text:756F865C A0 E3 MOV R2, # ; unsigned int
  134. .text:756F8660 3C E5 LDR R0, [R6,#(dword_75730EC0 - 0x75730E84)] ; int
  135. .text:756F8664 F2 FF EB BL write_0
  136. .text:756F8668 E5 LDR R3, [R5,#(dword_757309F8 - 0x757309F0)]
  137. .text:756F866C E3 CMN R3, #
  138. .text:756F8670 0A BEQ loc_756F8808
  139. .text:756F8674
  140. .text:756F8674 loc_756F8674 ; CODE XREF: IIIIIIIllll(void)+364j
  141. .text:756F8674 E3 CMP R3, #
  142. .text:756F8678 A0 E3 MOV R0, # ; option
  143. .text:756F867C A0 E3 MOV R1, #
  144. .text:756F8680 1F DA BLE loc_756F8704
  145. .text:756F8684 CB FF EB BL prctl
  146. .text:756F8688 9F E5 LDR R1, =(_ZN6Global6ThreadE_ptr - 0x7572FED0)
  147. .text:756F868C 9F E5 LDR R2, =(_Z10IlIIlllIIlPv_ptr - 0x7572FED0)
  148. .text:756F8690 E2 ADD R3, R5, # ; void *
  149. .text:756F8694 E7 LDR R6, [R4,R1]
  150. .text:756F8698 E7 LDR R2, [R4,R2] ; void *(__cdecl *)(void *)
  151. .text:756F869C A0 E3 MOV R1, # ; pthread_attr_t *
  152. .text:756F86A0 A0 E1 MOV R0, R6 ; int *
  153. .text:756F86A4 F1 FF EB BL pthread_create_0
  154. .text:756F86A8 E3 CMP R0, #
  155. .text:756F86AC BA BLT loc_756F8818
  156. .text:756F86B0
  157. .text:756F86B0 loc_756F86B0 ; CODE XREF: IIIIIIIllll(void)+384j
  158. .text:756F86B0 E0 9F E5 LDR R3, =(_Z10IIlIlllllIPv_ptr - 0x7572FED0)
  159. .text:756F86B4 E2 ADD R0, R6, # ; int *
  160. .text:756F86B8 A0 E3 MOV R1, # ; pthread_attr_t *
  161. .text:756F86BC E7 LDR R2, [R4,R3] ; void *(__cdecl *)(void *)
  162. .text:756F86C0 A0 E3 MOV R3, # ; void *
  163. .text:756F86C4 2A F1 FF EB BL pthread_create_0
  164. .text:756F86C8 E3 CMP R0, #
  165. .text:756F86CC BA BLT loc_756F87E8
  166. .text:756F86D0
  167. .text:756F86D0 loc_756F86D0 ; CODE XREF: IIIIIIIllll(void)+354j
  168. .text:756F86D0 CC 9F E5 LDR R3, =(_Z10IIllIIlIlIPv_ptr - 0x7572FED0)
  169. .text:756F86D4 A0 E3 MOV R1, # ; pthread_attr_t *
  170. .text:756F86D8 E7 LDR R2, [R4,R3] ; void *(__cdecl *)(void *)
  171. .text:756F86DC A0 E3 MOV R3, # ; void *
  172. .text:756F86E0 8D E2 ADD R0, SP, #0x30+var_28 ; int *
  173. .text:756F86E4
  174. .text:756F86E4 loc_756F86E4 ; CODE XREF: IIIIIIIllll(void)+2E4j
  175. .text:756F86E4 F1 FF EB BL pthread_create_0
  176. .text:756F86E8 9D E5 LDR R0, [SP,#0x30+var_28] ; int
  177. .text:756F86EC A0 E3 MOV R1, # ; void **
  178. .text:756F86F0 A9 F1 FF EB BL pthread_join
  179. .text:756F86F4 E5 LDR R0, [R6] ; int
  180. .text:756F86F8 A0 E3 MOV R1, # ; void **
  181. .text:756F86FC A6 F1 FF EB BL pthread_join
  182. .text:756F8700 C9 FF FF EA B loc_756F862C
  183. .text:756F8704 ; ---------------------------------------------------------------------------
  184. .text:756F8704
  185. .text:756F8704 loc_756F8704 ; CODE XREF: IIIIIIIllll(void)+1D0j
  186. .text:756F8704 CB FF EB BL prctl
  187. .text:756F8708 F2 FF EB BL getpid_0
  188. .text:756F870C A0 E1 MOV R1, R5
  189. .text:756F8710 A0 E3 MOV R2, # ; unsigned int
  190. .text:756F8714 A1 E5 STR R0, [R1,#(dword_757309F8 - 0x757309F0)]!
  191. .text:756F8718 E5 LDR R0, [R6,#(dword_75730EB8 - 0x75730E84)] ; int
  192. .text:756F871C F2 FF EB BL write_0
  193. .text:756F8720 9F E5 LDR R2, =(_ZN6Global6ThreadE_ptr - 0x7572FED0)
  194. .text:756F8724 9F E5 LDR R3, =(_Z10IlIIlllIIlPv_ptr - 0x7572FED0)
  195. .text:756F8728 A0 E3 MOV R1, # ; pthread_attr_t *
  196. .text:756F872C E7 LDR R6, [R4,R2]
  197. .text:756F8730 E7 LDR R2, [R4,R3] ; void *(__cdecl *)(void *)
  198. .text:756F8734 A0 E1 MOV R3, R5 ; void *
  199. .text:756F8738 A0 E1 MOV R0, R6 ; int *
  200. .text:756F873C 0C F1 FF EB BL pthread_create_0
  201. .text:756F8740 E3 CMP R0, #
  202. .text:756F8744 BA BLT loc_756F8858
  203. .text:756F8748
  204. .text:756F8748 loc_756F8748 ; CODE XREF: IIIIIIIllll(void)+3C4j
  205. .text:756F8748 A0 E3 MOV R1, # ; pthread_attr_t *
  206. .text:756F874C 9F E5 LDR R2, =(_Z10IIlIlllllIPv_ptr - 0x7572FED0)
  207. .text:756F8750 A0 E1 MOV R3, R1 ; void *
  208. .text:756F8754 E7 LDR R2, [R4,R2] ; void *(__cdecl *)(void *)
  209. .text:756F8758 E2 ADD R0, R6, # ; int *
  210. .text:756F875C F1 FF EB BL pthread_create_0
  211. .text:756F8760 E3 CMP R0, #
  212. .text:756F8764 BA BLT loc_756F8838
  213. .text:756F8768
  214. .text:756F8768 loc_756F8768 ; CODE XREF: IIIIIIIllll(void)+3A4j
  215. .text:756F8768 A0 E3 MOV R1, # ; pthread_attr_t *
  216. .text:756F876C 9F E5 LDR R2, =(_Z10IIllIIlIlIPv_ptr - 0x7572FED0)
  217. .text:756F8770 A0 E1 MOV R3, R1 ; void *
  218. .text:756F8774 E7 LDR R2, [R4,R2] ; void *(__cdecl *)(void *)
  219. .text:756F8778 8D E2 ADD R0, SP, #0x30+var_28 ; int *
  220. .text:756F877C FC F0 FF EB BL pthread_create_0
  221. .text:756F8780 9F E5 LDR R2, =(_Z11IlIIllIIlIlPv_ptr - 0x7572FED0)
  222. .text:756F8784 A0 E1 MOV R3, R5
  223. .text:756F8788 E7 LDR R2, [R4,R2]
  224. .text:756F878C A0 E1 MOV R0, R6
  225. .text:756F8790 A0 E3 MOV R1, #
  226. .text:756F8794 D2 FF FF EA B loc_756F86E4
  227. .text:756F8798 ; ---------------------------------------------------------------------------
  228. .text:756F8798
  229. .text:756F8798 loc_756F8798 ; CODE XREF: IIIIIIIllll(void)+130j
  230. .text:756F8798 A0 E3 MOV R0, # ; int
  231. .text:756F879C 0E A0 E3 MOV R1, #0xE ; int
  232. .text:756F87A0 A0 E1 MOV R3, R0 ; int
  233. .text:756F87A4 A0 E3 MOV R2, # ; char *
  234. .text:756F87A8 DB EB BL _Z10IIIIIllIIliiPKci ; IIIIIllIIl(int,int,char const*,int)
  235. .text:756F87AC A0 E3 MOV R0, # ; int
  236. .text:756F87B0 B1 F1 FF EB BL _Z10llIIlIIIlli ; llIIlIIIll(int)
  237. .text:756F87B4 8A FF FF EA B loc_756F85E4
  238. .text:756F87B8 ; ---------------------------------------------------------------------------
  239. .text:756F87B8
  240. .text:756F87B8 loc_756F87B8 ; CODE XREF: IIIIIIIllll(void)+B8j
  241. .text:756F87B8 A0 E3 MOV R0, # ; int
  242. .text:756F87BC AE F1 FF EB BL _Z10llIIlIIIlli ; llIIlIIIll(int)
  243. .text:756F87C0 E5 LDR R0, [R5,#(dword_757309F4 - 0x757309F0)]
  244. .text:756F87C4 FF FF EA B loc_756F856C
  245. .text:756F87C8 ; ---------------------------------------------------------------------------
  246. .text:756F87C8
  247. .text:756F87C8 loc_756F87C8 ; CODE XREF: IIIIIIIllll(void)+110j
  248. .text:756F87C8 A0 E1 MOV R0, R9 ; int
  249. .text:756F87CC A0 E1 MOV R2, R8 ; char *
  250. .text:756F87D0 0D A0 E3 MOV R1, #0xD ; int
  251. .text:756F87D4 A0 E1 MOV R3, R9 ; int
  252. .text:756F87D8 CF EB BL _Z10IIIIIllIIliiPKci ; IIIIIllIIl(int,int,char const*,int)
  253. .text:756F87DC A0 E1 MOV R0, R9 ; int
  254. .text:756F87E0 A5 F1 FF EB BL _Z10llIIlIIIlli ; llIIlIIIll(int)
  255. .text:756F87E4 FF FF EA B loc_756F85C4
  256. .text:756F87E8 ; ---------------------------------------------------------------------------
  257. .text:756F87E8
  258. .text:756F87E8 loc_756F87E8 ; CODE XREF: IIIIIIIllll(void)+21Cj
  259. .text:756F87E8 A0 E3 MOV R0, # ; int
  260. .text:756F87EC 0E A0 E3 MOV R1, #0xE ; int
  261. .text:756F87F0 A0 E1 MOV R3, R0 ; int
  262. .text:756F87F4 A0 E3 MOV R2, # ; char *
  263. .text:756F87F8 C7 EB BL _Z10IIIIIllIIliiPKci ; IIIIIllIIl(int,int,char const*,int)
  264. .text:756F87FC A0 E3 MOV R0, # ; int
  265. .text:756F8800 9D F1 FF EB BL _Z10llIIlIIIlli ; llIIlIIIll(int)
  266. .text:756F8804 B1 FF FF EA B loc_756F86D0
  267. .text:756F8808 ; ---------------------------------------------------------------------------
  268. .text:756F8808
  269. .text:756F8808 loc_756F8808 ; CODE XREF: IIIIIIIllll(void)+1C0j
  270. .text:756F8808 A0 E3 MOV R0, # ; int
  271. .text:756F880C 9A F1 FF EB BL _Z10llIIlIIIlli ; llIIlIIIll(int)
  272. .text:756F8810 E5 LDR R3, [R5,#(dword_757309F8 - 0x757309F0)]
  273. .text:756F8814 FF FF EA B loc_756F8674
  274. .text:756F8818 ; ---------------------------------------------------------------------------
  275. .text:756F8818
  276. .text:756F8818 loc_756F8818 ; CODE XREF: IIIIIIIllll(void)+1FCj
  277. .text:756F8818 A0 E3 MOV R0, # ; int
  278. .text:756F881C 0D A0 E3 MOV R1, #0xD ; int
  279. .text:756F8820 A0 E1 MOV R3, R0 ; int
  280. .text:756F8824 A0 E3 MOV R2, # ; char *
  281. .text:756F8828 BB EB BL _Z10IIIIIllIIliiPKci ; IIIIIllIIl(int,int,char const*,int)
  282. .text:756F882C A0 E3 MOV R0, # ; int
  283. .text:756F8830 F1 FF EB BL _Z10llIIlIIIlli ; llIIlIIIll(int)
  284. .text:756F8834 9D FF FF EA B loc_756F86B0
  285. .text:756F8838 ; ---------------------------------------------------------------------------
  286. .text:756F8838
  287. .text:756F8838 loc_756F8838 ; CODE XREF: IIIIIIIllll(void)+2B4j
  288. .text:756F8838 A0 E3 MOV R0, # ; int
  289. .text:756F883C 0E A0 E3 MOV R1, #0xE ; int
  290. .text:756F8840 A0 E1 MOV R3, R0 ; int
  291. .text:756F8844 A0 E3 MOV R2, # ; char *
  292. .text:756F8848 B3 EB BL _Z10IIIIIllIIliiPKci ; IIIIIllIIl(int,int,char const*,int)
  293. .text:756F884C A0 E3 MOV R0, # ; int
  294. .text:756F8850 F1 FF EB BL _Z10llIIlIIIlli ; llIIlIIIll(int)
  295. .text:756F8854 C3 FF FF EA B loc_756F8768
  296. .text:756F8858 ; ---------------------------------------------------------------------------
  297. .text:756F8858
  298. .text:756F8858 loc_756F8858 ; CODE XREF: IIIIIIIllll(void)+294j
  299. .text:756F8858 A0 E3 MOV R0, # ; int
  300. .text:756F885C 0D A0 E3 MOV R1, #0xD ; int
  301. .text:756F8860 A0 E1 MOV R3, R0 ; int
  302. .text:756F8864 A0 E3 MOV R2, # ; char *
  303. .text:756F8868 AB EB BL _Z10IIIIIllIIliiPKci ; IIIIIllIIl(int,int,char const*,int)
  304. .text:756F886C A0 E3 MOV R0, # ; int
  305. .text:756F8870 F1 FF EB BL _Z10llIIlIIIlli ; llIIlIIIll(int)
  306. .text:756F8874 B3 FF FF EA B loc_756F8748

2.反反调试

过3进程互相调试我是通过hook ptrace直接让它返回0,多线程循环读取进程状态判断是否有调试器,我是通过hook open 函数过虑掉,还有就是直接让SDK版本小于0XD,或者直接NOP掉函数。

  1. int new_ptrace(int request, int pid, int addr, int data){
  2. //LOGD("new_ptrace..");
  3. return ;
  4. }
  5. int new_open(char *pathname, int oflag, mode_t mode)
  6. {
  7. char* anit = "stat";
  8. char* tmp = "";
  9. if (NULL == pathname)
  10. {
  11. goto exitret;
  12. }
  13. //LOGD("new_open..%s", pathname);
  14. if(strstr(pathname, anit) != NULL)
  15. {
  16. return -;
  17. }
  18. exitret:
  19. return old_open(pathname, oflag, mode);
  20.  
  21. }

三: compatible.so注册jni函数分析

1.获取动态jni注册函数

通过在dvmUseJNIBridge函数下好断点,来获取注册的jni函数地址,最后注册完后对照表:

注册类名com/inca/security/Core/AppGuardEngine

/data/app-lib/com.digitalsky.girlsfrontline.cn-1/libcompatible.so   757C8000 0005F000

Number     内存地址 函数名       文件偏移   签名

第1个函数   .text:757D9AF8  IiiiIIiIii (文件偏移 11AF8)  ()I

第2个函数   .text:757DA058  iIiIIIiIiI (文件偏移 12058)  ([BI)[B

第3个函数   .text:757DC268  IiIiiIiIiI (文件偏移 14268)  (Landroid/content/Context;)V

第4个函数   .text:757D9914  IIiIiIIIiI (文件偏移 11914)  (I)V

第5个函数   .text:757D8A28  IIIIiIIIiI (文件偏移 10A28)  (J)V

2. jni函数功能分析

当JNI_OnLoad函数执行完后第一个执行的jni函数是上面注册的第3个函数, 反射获取包名与签名等。

第2个jni函数就是解密libengine.sox与libstub.sox,(assets\appguard\armeabi\)先在上面java层分析时AES解密后数据传入的就是这个函数 (文件偏移 12058)。

  1. .text:757DA058 ; __unwind {
  2. .text:757DA058 F0 2D E9 STMFD SP!, {R4-R9,LR}
  3. .text:757DA05C A0 E1 MOV R7, R2
  4. .text:757DA060 E5 LDR R2, [R0]
  5. .text:757DA064 A0 E1 MOV R4, R0
  6. .text:757DA068 0C D0 4D E2 SUB SP, SP, #0xC
  7. .text:757DA06C A0 E1 MOV R1, R7
  8. .text:757DA070 AC E5 LDR R2, [R2,#0x2AC]
  9. .text:757DA074 A0 E1 MOV R5, R3
  10. .text:757DA078 FF 2F E1 BLX R2
  11. .text:757DA07C E5 LDR R3, [R4]
  12. .text:757DA080 A0 E1 MOV R1, R7
  13. .text:757DA084 A0 E1 MOV R9, R0
  14. .text:757DA088 E0 E5 LDR R3, [R3,#0x2E0]
  15. .text:757DA08C A0 E3 MOV R2, #
  16. .text:757DA090 A0 E1 MOV R0, R4
  17. .text:757DA094 FF 2F E1 BLX R3
  18. .text:757DA098 A0 E1 MOV R8, R0
  19. .text:757DA09C A0 E1 MOV R0, R5 ; unsigned int
  20. .text:757DA0A0 1E EB BL malloc_0 ; 分配存放空间存放解密后so数据
  21. .text:757DA0A4 A0 E1 MOV R6, R0
  22. .text:757DA0A8 A0 E1 MOV R1, R9
  23. .text:757DA0AC A0 E1 MOV R0, R8
  24. .text:757DA0B0 A0 E1 MOV R2, R6
  25. .text:757DA0B4 A0 E1 MOV R3, R5
  26. .text:757DA0B8 BA FF FF EB BL Dec_sodata ; 解密so
  27. .text:757DA0BC E5 LDR R3, [R4]
  28. .text:757DA0C0 A0 E1 MOV R2, R8
  29. .text:757DA0C4 C3 E5 LDR R12, [R3,#0x300]
  30. .text:757DA0C8 A0 E1 MOV R1, R7
  31. .text:757DA0CC A0 E1 MOV R0, R4
  32. .text:757DA0D0 A0 E3 MOV R3, #
  33. .text:757DA0D4 3C FF 2F E1 BLX R12
  34. .text:757DA0D8 E5 LDR R3, [R4]
  35. .text:757DA0DC A0 E1 MOV R1, R5
  36. .text:757DA0E0 A0 E1 MOV R0, R4
  37. .text:757DA0E4 C0 E5 LDR R3, [R3,#0x2C0]
  38. .text:757DA0E8 FF 2F E1 BLX R3
  39. .text:757DA0EC A0 E1 MOV R7, R0
  40. .text:757DA0F0 E5 LDR R2, [R4]
  41. .text:757DA0F4 8D E5 STR R6, [SP,#0x28+var_28]
  42. .text:757DA0F8 A0 E1 MOV R3, R5
  43. .text:757DA0FC C3 E5 LDR R12, [R2,#0x340]
  44. .text:757DA100 A0 E1 MOV R0, R4
  45. .text:757DA104 A0 E1 MOV R1, R7
  46. .text:757DA108 A0 E3 MOV R2, #
  47. .text:757DA10C 3C FF 2F E1 BLX R12
  48. .text:757DA110 A0 E1 MOV R0, R6 ; ptr
  49. .text:757DA114 DD F6 FF EB BL free
  50. .text:757DA118 A0 E1 MOV R0, R7
  51. .text:757DA11C 0C D0 8D E2 ADD SP, SP, #0xC
  52. .text:757DA120 F0 BD E8 LDMFD SP!, {R4-R9,PC}
  53. 解密完后R5是大小,R6基址,将其dump出来,如下图所示:

  1. static main(void)
  2. {
  3. auto fp, begin, end, dexbyte;
  4. fp = fopen("d:\\libstub.so", "wb"); //打开或创建一个文件
  5. begin = R6; //so基址
  6. end = begin + R5; //so基址 + so文件大小
  7. for ( dexbyte = begin; dexbyte < end;dexbyte ++ )
  8. {
  9. fputc(Byte(dexbyte), fp); //按字节将其dump到本地文件中
  10. }
  11. }

libstub.sox解密后将最终的明文写到/data/data/包名/files/libstub.so目录下,后然加载,接下来分析libstub.so。

四: stub.so反调试与反反调试

1.反调试在JNI_onLoad中读取进程状态,前面通过hook open函数己过了反调试。

五: stub.so注册jni函数分析

1.注册jni

通过在dvmUseJNIBridge函数下好断点,来获取注册的jni函数地址,最后注册完后对照表:

注册类名com/inca/security/Core/UnsafeDexLoader

/data/data/com.digitalsky.girlsfrontline.cn/files/libstub.so  75C6E000   00052000

Number     内存地址 函数名       文件偏移   签名

第1个函数   .text:75C80704  IlIIIIIIII (文件偏移 12704)  (Ljava/lang/String;Ljava/lang/String;I)I

第2个函数   .text:75C808C4  IIIIIIIIIl (文件偏移 128C4)  ([B)I

第3个函数   .text:75C80A7C  IIIIIIIIlI (文件偏移 12A7C)  (Ljava/lang/String;Ljava/lang/ClassLoader;I)Ljava/lang/Class;

第4个函数   .text:75C80C3C  IIIIIIIIll (文件偏移 12C3C)  (I)[Ljava/lang/String;

第5个函数   .text:75C80DF4  IIIIIIIlII (文件偏移 12DF4)  (I)V

//

注册类名com/inca/security/Core/AppGuardEngine

/data/data/com.digitalsky.girlsfrontline.cn/files/libstub.so  75C6E000   00052000

Number     内存地址 函数名       文件偏移   签名

第1个函数   .text:75C81168  IlIIIIIIII (文件偏移 13168)  (Landroid/content/Context;Ljava/lang/String;[B)I

第2个函数   .text:75C814AC  IIIIIIIllI (文件偏移 134AC)  ()V

第3个函数   .text:75C81618  IIIIIIIlll (文件偏移 13618)  (I[B[B)I

第4个函数   .text:75C81724  IIIIIIlIII (文件偏移 13724)  (I[B[B)I

第5个函数   .text:75C817CC  IIIIIIIlII (文件偏移 137CC)  (I[B[B)I

第6个函数   .text:75C8186C  IllIIIlIII (文件偏移 1386C)  (I)I

第7个函数   .text:75C818AC  IIIIIIlIlI (文件偏移 138AC)  (I)I

第8个函数   .text:75C81810  llIIIIlIIl (文件偏移 13810)  (I[B)I

第9个函数   .text:75C81844  IlIIIIlllI (文件偏移 13844)  (Z)V

第10个函数   .text:75C81D10  lllIIIlllI (文件偏移 13D10) (Landroid/content/Context;)V

注册类名com/inca/security/AppGuard/TestCase

/data/data/com.digitalsky.girlsfrontline.cn/files/libstub.so  75C6E000   00052000

第1个函数   .text:75C82608  IIIIIIlIll (文件偏移 14608)  (Landroid/content/Context;Z)Z

第2个函数   .text:75C8267C  IIIIIIllII (文件偏移 1467C)  (Landroid/content/Context;)Z

第3个函数   .text:75C826F0  IIIIIIllIl (文件偏移 146F0)  (Landroid/content/Context;)Z

第4个函数   .text:75C82764  IIIIIIlllI (文件偏移 14764)  (Landroid/content/Context;)Z

2.在com/inca/security/Core/AppGuardEngine类中第10个函数jni函数中hook mono函数 (文件偏移 18D04)

  1. /data/data/com.digitalsky.girlsfrontline.cn/files/libstub.so 75C6E000
  2.  
  3. .text:75C86D04 EXPORT hook_mono_func
  4. .text:75C86D04 hook_mono_func ; CODE XREF: Hook_Thread+4p
  5. .text:75C86D04
  6. .text:75C86D04 var_280= -0x280
  7. .text:75C86D04 var_27C= -0x27C
  8. .text:75C86D04 var_278= -0x278
  9. .text:75C86D04 format= -0x274
  10. .text:75C86D04 var_26C= -0x26C
  11. .text:75C86D04 var_24C= -0x24C
  12. .text:75C86D04 s= -0x22C
  13. .text:75C86D04 var_12C= -0x12C
  14. .text:75C86D04 var_2C= -0x2C
  15. .text:75C86D04
  16. .text:75C86D04 ; __unwind { // 75C9B220
  17. .text:75C86D04 F0 4F 2D E9 STMFD SP!, {R4-R11,LR}
  18. .text:75C86D08 9F E5 LDR R5, =(_GLOBAL_OFFSET_TABLE_ - 0x75C86D1C)
  19. .text:75C86D0C 9F E5 LDR R3, =(__stack_chk_guard_ptr - 0x75CBEEC0)
  20. .text:75C86D10 DF 4D E2 SUB SP, SP, #0x25C
  21. .text:75C86D14 8F E0 ADD R5, PC, R5 ; _GLOBAL_OFFSET_TABLE_
  22. .text:75C86D18 A0 E7 LDR R10, [R5,R3]
  23. .text:75C86D1C 8D E2 ADD R8, SP, #0x280+s
  24. .text:75C86D20 A0 E3 MOV R1, # ; c
  25. .text:75C86D24 9A E5 LDR R3, [R10]
  26. .text:75C86D28 FF A0 E3 MOV R2, #0xFF ; n
  27. .text:75C86D2C A0 E1 MOV R0, R8 ; s
  28. .text:75C86D30 8D E5 STR R3, [SP,#0x280+var_2C]
  29. .text:75C86D34 D7 FF EB BL memset
  30. .text:75C86D38 E0 9F E5 LDR R1, =(unk_75CB8B70 - 0x75C86D4C)
  31. .text:75C86D3C 8D E2 ADD R4, SP, #0x280+var_24C
  32. .text:75C86D40 A0 E1 MOV R0, R4 ; this
  33. .text:75C86D44 8F E0 ADD R1, PC, R1 ; unk_75CB8B70
  34. .text:75C86D48 F0 E2 ADD R1, R1, #0xF0 ; char *
  35. .text:75C86D4C F8 FF EB BL DecString
  36. .text:75C86D50 A0 E1 MOV R0, R4
  37. .text:75C86D54 F7 FF EB BL _ZN10lIIIlIlIIlcvPcEv ; lIIIlIlIIl::operator char *(void)
  38. .text:75C86D58 A0 E3 MOV R1, # ; mode
  39. .text:75C86D5C D7 FF EB BL dlopen
  40. .text:75C86D60 A0 E1 MOV R6, R0
  41. .text:75C86D64 A0 E1 MOV R0, R4 ; this
  42. .text:75C86D68 F7 FF EB BL _ZN10lIIIlIlIIlD2Ev ; lIIIlIlIIl::~lIIIlIlIIl()
  43. .text:75C86D6C B0 9F E5 LDR R1, =(unk_75CB8B70 - 0x75C86D80)
  44. .text:75C86D70 E3 CMP R6, #
  45. .text:75C86D74 A0 E1 MOV R0, R4 ; this
  46. .text:75C86D78 8F E0 ADD R1, PC, R1 ; unk_75CB8B70
  47. .text:75C86D7C 1D E2 ADD R1, R1, #0x140 ; char *
  48. .text:75C86D80 E0 MOVEQ R6, #0xFFFFFFFF
  49. .text:75C86D84 F8 FF EB BL DecString
  50. .text:75C86D88 A0 E1 MOV R0, R4
  51. .text:75C86D8C F7 FF EB BL _ZN10lIIIlIlIIlcvPcEv ; lIIIlIlIIl::operator char *(void)
  52. .text:75C86D90 A0 E1 MOV R1, R0 ; name
  53. .text:75C86D94 A0 E1 MOV R0, R6 ; handle
  54. .text:75C86D98 F8 D6 FF EB BL dlsym
  55. .text:75C86D9C A0 E1 MOV R6, R0
  56. .text:75C86DA0 A0 E1 MOV R0, R4 ; this
  57. .text:75C86DA4 F7 FF EB BL _ZN10lIIIlIlIIlD2Ev ; lIIIlIlIIl::~lIIIlIlIIl()
  58. .text:75C86DA8 E3 CMP R6, #
  59. .text:75C86DAC 0A BEQ loc_75C86DB8
  60. .text:75C86DB0 FF 2F E1 BLX R6
  61. .text:75C86DB4 A0 E1 MOV R6, R0
  62. .text:75C86DB8
  63. .text:75C86DB8 loc_75C86DB8 ; CODE XREF: hook_mono_func+A8j
  64. .text:75C86DB8 A0 E1 MOV R0, R6 ; unsigned int
  65. .text:75C86DBC EB BL _Z11llllIIlllIlj ; libil2cpp.so没有
  66. .text:75C86DC0 9F E5 LDR R1, =(unk_75CB8B70 - 0x75C86DD4)
  67. .text:75C86DC4 8D E2 ADD R7, SP, #0x280+var_26C
  68. .text:75C86DC8 A0 E1 MOV R0, R7 ; this
  69. .text:75C86DCC 8F E0 ADD R1, PC, R1 ; unk_75CB8B70
  70. .text:75C86DD0 1E E2 ADD R1, R1, #0x190 ; char *
  71. .text:75C86DD4 F8 FF EB BL DecString
  72. .text:75C86DD8 A0 E1 MOV R0, R7
  73. .text:75C86DDC F7 FF EB BL _ZN10lIIIlIlIIlcvPcEv ; lIIIlIlIIl::operator char *(void)
  74. .text:75C86DE0 9F E5 LDR R1, =(unk_75CB8B70 - 0x75C86DF0)
  75. .text:75C86DE4 A0 E1 MOV R9, R0
  76. .text:75C86DE8 8F E0 ADD R1, PC, R1 ; unk_75CB8B70
  77. .text:75C86DEC A0 E1 MOV R0, R4 ; this
  78. .text:75C86DF0 1E 1E E2 ADD R1, R1, #0x1E0 ; char *
  79. .text:75C86DF4 F8 FF EB BL DecString
  80. .text:75C86DF8 A0 E1 MOV R0, R4
  81. .text:75C86DFC 3D F7 FF EB BL _ZN10lIIIlIlIIlcvPcEv ; lIIIlIlIIl::operator char *(void)
  82. .text:75C86E00 9F E5 LDR R2, =(_ZN6Global10llIllllIlIE_ptr - 0x75CBEEC0)
  83. .text:75C86E04 A0 E1 MOV R3, R0
  84. .text:75C86E08 E7 LDR R2, [R5,R2]
  85. .text:75C86E0C A0 E1 MOV R1, R9 ; format
  86. .text:75C86E10 A0 E1 MOV R0, R8 ; s
  87. .text:75C86E14 8D E5 STR R2, [SP,#0x280+var_280]
  88. .text:75C86E18 F9 D6 FF EB BL sprintf
  89. .text:75C86E1C A0 E1 MOV R0, R4 ; this
  90. .text:75C86E20 F7 FF EB BL _ZN10lIIIlIlIIlD2Ev ; lIIIlIlIIl::~lIIIlIlIIl()
  91. .text:75C86E24 A0 E1 MOV R0, R7 ; this
  92. .text:75C86E28 F7 FF EB BL _ZN10lIIIlIlIIlD2Ev ; lIIIlIlIIl::~lIIIlIlIIl()
  93. .text:75C86E2C A0 E1 MOV R0, R8 ; file
  94. .text:75C86E30 A0 E3 MOV R1, # ; mode
  95. .text:75C86E34 DD D6 FF EB BL dlopen ; 打开libmono.so
  96. .text:75C86E38 E2 SUBS R9, R0, #
  97. .text:75C86E3C 5B 0A BEQ loc_75C86FB0
  98. .text:75C86E40 EC 9F E5 LDR R1, =(unk_75CB8B70 - 0x75C86E50)
  99. .text:75C86E44 A0 E1 MOV R0, R4 ; this
  100. .text:75C86E48 8F E0 ADD R1, PC, R1 ; unk_75CB8B70
  101. .text:75C86E4C 1E E2 ADD R1, R1, #0x230 ; char *
  102. .text:75C86E50 F8 FF EB BL DecString
  103. .text:75C86E54 A0 E1 MOV R0, R4
  104. .text:75C86E58 F7 FF EB BL _ZN10lIIIlIlIIlcvPcEv ; lIIIlIlIIl::operator char *(void)
  105. .text:75C86E5C A0 E1 MOV R1, R0 ; name
  106. .text:75C86E60 A0 E1 MOV R0, R9 ; handle
  107. .text:75C86E64 C5 D6 FF EB BL dlsym ; 获取mono_assembly_load_from_full地址
  108. .text:75C86E68 C8 9F E5 LDR R3, =(IIlIlIIllll_ptr - 0x75CBEEC0)
  109. .text:75C86E6C C8 9F E5 LDR R2, =(dword_75CC0068 - 0x75C86E7C)
  110. .text:75C86E70 E7 LDR R3, [R5,R3]
  111. .text:75C86E74 8F E0 ADD R2, PC, R2 ; dword_75CC0068
  112. .text:75C86E78 E2 ADD R2, R2, #0x10 ; void **
  113. .text:75C86E7C A0 E1 MOV R1, R3 ; void *
  114. .text:75C86E80 8D E5 STR R3, [SP,#0x280+var_278]
  115. .text:75C86E84 F8 FF EB BL hook ; hook mono_assembly_load_from_full
  116. .text:75C86E88 A0 E1 MOV R0, R4 ; this
  117. .text:75C86E8C F7 F6 FF EB BL _ZN10lIIIlIlIIlD2Ev ; lIIIlIlIIl::~lIIIlIlIIl()
  118. .text:75C86E90 A8 9F E5 LDR R1, =(unk_75CB8B70 - 0x75C86EA0)
  119. .text:75C86E94 A0 E1 MOV R0, R4 ; this
  120. .text:75C86E98 8F E0 ADD R1, PC, R1 ; unk_75CB8B70
  121. .text:75C86E9C 0A 1D E2 ADD R1, R1, #0x280 ; char *
  122. .text:75C86EA0 2E F8 FF EB BL DecString
  123. .text:75C86EA4 A0 E1 MOV R0, R4
  124. .text:75C86EA8 F7 FF EB BL _ZN10lIIIlIlIIlcvPcEv ; lIIIlIlIIl::operator char *(void)
  125. .text:75C86EAC A0 E1 MOV R1, R0 ; name
  126. .text:75C86EB0 A0 E1 MOV R0, R9 ; handle
  127. .text:75C86EB4 B1 D6 FF EB BL dlsym ; 获取mono_image_open_from_data_with_name地址
  128. .text:75C86EB8 9F E5 LDR R3, =(lIlIllIllIl_ptr - 0x75CBEEC0)
  129. .text:75C86EBC 9F E5 LDR R2, =(dword_75CC0068 - 0x75C86ECC)
  130. .text:75C86EC0 E7 LDR R3, [R5,R3]
  131. .text:75C86EC4 8F E0 ADD R2, PC, R2 ; dword_75CC0068
  132. .text:75C86EC8 E2 ADD R2, R2, # ; void **
  133. .text:75C86ECC A0 E1 MOV R1, R3 ; void *
  134. .text:75C86ED0 8D E5 STR R3, [SP,#0x280+var_27C]
  135. .text:75C86ED4 F8 FF EB BL hook ; hook mono_image_open_from_data_with_name
  136. .text:75C86ED8 A0 E1 MOV R0, R4 ; this
  137. .text:75C86EDC E3 F6 FF EB BL _ZN10lIIIlIlIIlD2Ev ; lIIIlIlIIl::~lIIIlIlIIl()
  138. .text:75C86EE0 9F E5 LDR R3, =(dword_75CC0068 - 0x75C86EEC)
  139. .text:75C86EE4 8F E0 ADD R3, PC, R3 ; dword_75CC0068
  140. .text:75C86EE8 E5 LDR R2, [R3,#(dword_75CC0078 - 0x75CC0068)]
  141. .text:75C86EEC E3 CMP R2, #
  142. .text:75C86EF0 0A BEQ loc_75C86FC8
  143. .text:75C86EF4 E5 LDR R3, [R3,#(dword_75CC0070 - 0x75CC0068)]
  144. .text:75C86EF8 E3 CMP R3, #
  145. .text:75C86EFC 0A BEQ loc_75C86FC8
  146. .text:75C86F00
  147. .text:75C86F00 loc_75C86F00 ; CODE XREF: hook_mono_func+364j
  148. .text:75C86F00 ; hook_mono_func+38Cj ...
  149. .text:75C86F00 E3 CMP R6, #0x17
  150. .text:75C86F04 9A BLS loc_75C86F1C
  151. .text:75C86F08 9F E5 LDR R3, =(_ZN6Global10lIlllIIllIE_ptr - 0x75CBEEC0)
  152. .text:75C86F0C E7 LDR R3, [R5,R3]
  153. .text:75C86F10 E5 LDR R3, [R3] ; Global::lIlllIIllI
  154. .text:75C86F14 E3 CMP R3, #0x17
  155. .text:75C86F18 6E CA BGT loc_75C870D8
  156. .text:75C86F1C
  157. .text:75C86F1C loc_75C86F1C ; CODE XREF: hook_mono_func+200j
  158. .text:75C86F1C 9F E5 LDR R1, =(unk_75CB8B70 - 0x75C86F2C)
  159. .text:75C86F20 A0 E1 MOV R0, R4 ; this
  160. .text:75C86F24 8F E0 ADD R1, PC, R1 ; unk_75CB8B70
  161. .text:75C86F28 1E E2 ADD R1, R1, #0x320 ; char *
  162. .text:75C86F2C 0B F8 FF EB BL DecString
  163. .text:75C86F30 A0 E1 MOV R0, R4
  164. .text:75C86F34 EF F6 FF EB BL _ZN10lIIIlIlIIlcvPcEv ; lIIIlIlIIl::operator char *(void)
  165. .text:75C86F38 9F E5 LDR R3, =(dword_75CC0068 - 0x75C86F4C)
  166. .text:75C86F3C 9F E5 LDR R2, =(lIIIlIIlII_ptr - 0x75CBEEC0)
  167. .text:75C86F40 A0 E1 MOV R1, R0 ; char *
  168. .text:75C86F44 8F E0 ADD R3, PC, R3 ; dword_75CC0068
  169. .text:75C86F48 E7 LDR R2, [R5,R2] ; void *
  170. .text:75C86F4C E2 ADD R3, R3, # ; void **
  171. .text:75C86F50 A0 E1 MOV R0, R9 ; void *
  172. .text:75C86F54 F8 FF EB BL IAT_HOOK ; hook memcpy
  173. .text:75C86F58 A0 E1 MOV R0, R4 ; this
  174. .text:75C86F5C C3 F6 FF EB BL _ZN10lIIIlIlIIlD2Ev ; lIIIlIlIIl::~lIIIlIlIIl()
  175. .text:75C86F60 F8 9F E5 LDR R1, =(unk_75CB8B70 - 0x75C86F70)
  176. .text:75C86F64 A0 E1 MOV R0, R4 ; this
  177. .text:75C86F68 8F E0 ADD R1, PC, R1 ; unk_75CB8B70
  178. .text:75C86F6C 1E E2 ADD R1, R1, #0x370 ; char *
  179. .text:75C86F70 FA F7 FF EB BL DecString
  180. .text:75C86F74 A0 E1 MOV R0, R4
  181. .text:75C86F78 DE F6 FF EB BL _ZN10lIIIlIlIIlcvPcEv ; lIIIlIlIIl::operator char *(void)
  182. .text:75C86F7C E0 9F E5 LDR R3, =(IlIIIlIIlI_ptr - 0x75CBEEC0)
  183. .text:75C86F80 A0 E1 MOV R1, R0 ; char *
  184. .text:75C86F84 E7 LDR R2, [R5,R3] ; void *
  185. .text:75C86F88 D8 9F E5 LDR R3, =(dword_75CC0068 - 0x75C86F98)
  186. .text:75C86F8C A0 E1 MOV R0, R9 ; void *
  187. .text:75C86F90 8F E0 ADD R3, PC, R3 ; dword_75CC0068 ; void **
  188. .text:75C86F94 F8 FF EB BL IAT_HOOK ; hook mmap
  189. .text:75C86F98
  190. .text:75C86F98 loc_75C86F98 ; CODE XREF: hook_mono_func+4C0j
  191. .text:75C86F98 A0 E1 MOV R0, R4 ; this
  192. .text:75C86F9C B3 F6 FF EB BL _ZN10lIIIlIlIIlD2Ev ; lIIIlIlIIl::~lIIIlIlIIl()
  193. .text:75C86FA0
  194. .text:75C86FA0 loc_75C86FA0 ; CODE XREF: hook_mono_func+484j
  195. .text:75C86FA0 A0 E3 MOV R2, #
  196. .text:75C86FA4 C0 9F E5 LDR R3, =(_ZN6Global10lllllllIIIE_ptr - 0x75CBEEC0)
  197. .text:75C86FA8 E7 LDR R3, [R5,R3]
  198. .text:75C86FAC C3 E5 STRB R2, [R3] ; Global::lllllllIII
  199. .text:75C86FB0
  200. .text:75C86FB0 loc_75C86FB0 ; CODE XREF: hook_mono_func+138j
  201. .text:75C86FB0 9D E5 LDR R2, [SP,#0x280+var_2C]
  202. .text:75C86FB4 9A E5 LDR R3, [R10]
  203. .text:75C86FB8 E1 CMP R2, R3
  204. .text:75C86FBC A4 1A BNE loc_75C87254
  205. .text:75C86FC0 DF 8D E2 ADD SP, SP, #0x25C
  206. .text:75C86FC4 F0 8F BD E8 LDMFD SP!, {R4-R11,PC}

六: Assembly-CSharp.dll解密分析

1. 在mono的hook函数中解密Assembly-CSharp.dll,代码如下:

  1. .text:75C7A138 EXPORT hook_mono_image_open_from_data_with_name
  2. .text:75C7A138 hook_mono_image_open_from_data_with_name
  3. .text:75C7A138 ; DATA XREF: .got:lIlIllIllIl_ptro
  4. .text:75C7A138
  5. .text:75C7A138 var_4F0= -0x4F0
  6. .text:75C7A138 var_4EC= -0x4EC
  7. .text:75C7A138 var_4E8= -0x4E8
  8. .text:75C7A138 var_4E4= -0x4E4
  9. .text:75C7A138 var_4DC= -0x4DC
  10. .text:75C7A138 var_4D8= -0x4D8
  11. .text:75C7A138 var_4D4= -0x4D4
  12. .text:75C7A138 var_4D0= -0x4D0
  13. .text:75C7A138 var_4CC= -0x4CC
  14. .text:75C7A138 var_4C8= -0x4C8
  15. .text:75C7A138 var_4C4= -0x4C4
  16. .text:75C7A138 var_60= -0x60
  17. .text:75C7A138 var_54= -0x54
  18. .text:75C7A138 var_50= -0x50
  19. .text:75C7A138 var_4C= -0x4C
  20. .text:75C7A138 var_48= -0x48
  21. .text:75C7A138 var_44= -0x44
  22. .text:75C7A138 var_43= -0x43
  23. .text:75C7A138 var_42= -0x42
  24. .text:75C7A138 var_41= -0x41
  25. .text:75C7A138 var_40= -0x40
  26. .text:75C7A138 var_3F= -0x3F
  27. .text:75C7A138 var_3E= -0x3E
  28. .text:75C7A138 var_3D= -0x3D
  29. .text:75C7A138 var_2C= -0x2C
  30. .text:75C7A138 arg_0=
  31. .text:75C7A138 arg_4=
  32. .text:75C7A138
  33. .text:75C7A138 ; __unwind { // 75C8F220
  34. .text:75C7A138 F0 4F 2D E9 STMFD SP!, {R4-R11,LR}
  35. .text:75C7A13C DD 4D E2 SUB SP, SP, #0x4C0
  36. .text:75C7A140 0C D0 4D E2 SUB SP, SP, #0xC
  37. .text:75C7A144 F4 9D E5 LDR R7, [SP,#0x4F0+arg_4]
  38. .text:75C7A148 9F E5 LDR R8, =(_GLOBAL_OFFSET_TABLE_ - 0x75C7A168)
  39. .text:75C7A14C C4 9F E5 LDR R12, =(__stack_chk_guard_ptr - 0x75CB2EC0)
  40. .text:75C7A150 E2 MOVS R6, R7
  41. .text:75C7A154 A0 MOVNE R6, #
  42. .text:75C7A158 E3 CMP R7, #
  43. .text:75C7A15C FF CMPNE R1, #0xFF
  44. .text:75C7A160 8F E0 ADD R8, PC, R8 ; _GLOBAL_OFFSET_TABLE_
  45. .text:75C7A164 0C C0 E7 LDR R12, [R8,R12]
  46. .text:75C7A168 A0 E1 MOV R5, R1
  47. .text:75C7A16C C0 8D E5 STR R12, [SP,#0x4F0+var_4E8]
  48. .text:75C7A170 C0 9C E5 LDR R12, [R12]
  49. .text:75C7A174 A0 E1 MOV R4, R0
  50. .text:75C7A178 0C 8D E5 STR R2, [SP,#0x4F0+var_4E4]
  51. .text:75C7A17C C4 C4 8D E5 STR R12, [SP,#0x4F0+var_2C]
  52. .text:75C7A180 DE 9A BLS loc_75C7A500
  53. .text:75C7A184 9F E5 LDR R1, =(unk_75CACB70 - 0x75C7A198)
  54. .text:75C7A188 2C 8D E2 ADD R6, SP, #0x4F0+var_4C4
  55. .text:75C7A18C A0 E1 MOV R0, R6 ; this
  56. .text:75C7A190 8F E0 ADD R1, PC, R1 ; unk_75CACB70 ; char *
  57. .text:75C7A194 A0 E1 MOV R9, R3
  58. .text:75C7A198 FB FF EB BL DecString
  59. .text:75C7A19C A0 E1 MOV R0, R6
  60. .text:75C7A1A0 FA FF EB BL _ZN10lIIIlIlIIlcvPcEv ; lIIIlIlIIl::operator char *(void)
  61. .text:75C7A1A4 A0 E1 MOV R1, R0 ; needle
  62. .text:75C7A1A8 A0 E1 MOV R0, R7 ; haystack
  63. .text:75C7A1AC DA FF EB BL strstr ; 判断是否加载Assembly-CSharp.dll
  64. .text:75C7A1B0 A0 A0 E1 MOV R10, R0
  65. .text:75C7A1B4 A0 E1 MOV R0, R6 ; this
  66. .text:75C7A1B8 2C FA FF EB BL _ZN10lIIIlIlIIlD2Ev ; lIIIlIlIIl::~lIIIlIlIIl()
  67. .text:75C7A1BC 5A E3 CMP R10, #
  68. .text:75C7A1C0 A5 0A BEQ loc_75C7A45C
  69. .text:75C7A1C4 E4 A3 9F E5 LDR R10, =unk_49F54EEB ; 准备解密
  70. .text:75C7A1C8 E4 E3 9F E5 LDR LR, =0x8B3BE89F
  71. .text:75C7A1CC E4 C3 9F E5 LDR R12, =0xC6EF3720
  72. .text:75C7A1D0 0A A0 E1 MOV R3, R10
  73. .text:75C7A1D4
  74. .text:75C7A1D4 loc_75C7A1D4 ; CODE XREF: hook_mono_image_open_from_data_with_name+104j
  75. .text:75C7A1D4 E0 9F E5 LDR R1, =0x815AA0CD
  76. .text:75C7A1D8 E0 9F E5 LDR R2, =0xA1C489F7
  77. .text:75C7A1DC B2 A0 E1 MOV R11, R3,LSL#
  78. .text:75C7A1E0 A3 A0 E1 MOV R0, R3,LSR#
  79. .text:75C7A1E4 8B E0 ADD R1, R11, R1
  80. .text:75C7A1E8 E0 ADD R2, R0, R2
  81. .text:75C7A1EC 8C E0 ADD R3, R12, R3
  82. .text:75C7A1F0 E0 EOR R2, R2, R1
  83. .text:75C7A1F4 E0 EOR R2, R2, R3
  84. .text:75C7A1F8 C4 9F E5 LDR R1, =0x95A8882C
  85. .text:75C7A1FC C4 9F E5 LDR R3, =0x9D2CC113
  86. .text:75C7A200 0E E0 E0 RSB LR, R2, LR
  87. .text:75C7A204 0C 8E E0 ADD R2, LR, R12
  88. .text:75C7A208 0E B2 A0 E1 MOV R11, LR,LSL#
  89. .text:75C7A20C AE A0 E1 MOV R0, LR,LSR#
  90. .text:75C7A210 C4 8C E2 ADD R12, R12, #0x61000000
  91. .text:75C7A214 8B E0 ADD R1, R11, R1
  92. .text:75C7A218 E0 ADD R3, R0, R3
  93. .text:75C7A21C C7 8C E2 ADD R12, R12, #0xC80000
  94. .text:75C7A220 E0 EOR R3, R3, R1
  95. .text:75C7A224 CC 8C E2 ADD R12, R12, #0x8600
  96. .text:75C7A228 E0 EOR R3, R3, R2
  97. .text:75C7A22C C0 8C E2 ADD R12, R12, #0x47
  98. .text:75C7A230 0A E0 RSB R3, R3, R10
  99. .text:75C7A234 5C E3 CMP R12, #
  100. .text:75C7A238 A0 A0 E1 MOV R10, R3
  101. .text:75C7A23C E4 FF FF 1A BNE loc_75C7A1D4
  102. .text:75C7A240 D4 E5 LDRB R1, [R4]
  103. .text:75C7A244 FF E2 AND R2, R3, #0xFF
  104. .text:75C7A248 E0 8D E5 STR LR, [SP,#0x4F0+var_4C8]
  105. .text:75C7A24C E1 CMP R1, R2
  106. .text:75C7A250 8D E5 STR R3, [SP,#0x4F0+var_4CC]
  107. .text:75C7A254 1A BNE loc_75C7A45C
  108. .text:75C7A258 D4 E5 LDRB R2, [R4,#]
  109. .text:75C7A25C DD E5 LDRB R3, [SP,#0x4F0+var_4CC+]
  110. .text:75C7A260 E1 CMP R2, R3
  111. .text:75C7A264 7C 1A BNE loc_75C7A45C
  112. .text:75C7A268 D4 E5 LDRB R2, [R4,#]
  113. .text:75C7A26C DD E5 LDRB R3, [SP,#0x4F0+var_4CC+]
  114. .text:75C7A270 E1 CMP R2, R3
  115. .text:75C7A274 1A BNE loc_75C7A45C
  116. .text:75C7A278 D4 E5 LDRB R2, [R4,#]
  117. .text:75C7A27C DD E5 LDRB R3, [SP,#0x4F0+var_4CC+]
  118. .text:75C7A280 E1 CMP R2, R3
  119. .text:75C7A284 1A BNE loc_75C7A45C
  120. .text:75C7A288 D4 E5 LDRB R2, [R4,#]
  121. .text:75C7A28C DD E5 LDRB R3, [SP,#0x4F0+var_4C8]
  122. .text:75C7A290 E1 CMP R2, R3
  123. .text:75C7A294 1A BNE loc_75C7A45C
  124. .text:75C7A298 2C 9F E5 LDR R3, =(_ZN6Global10IIlllllllIE_ptr - 0x75CB2EC0)
  125. .text:75C7A29C 9C C4 8D E5 STR R12, [SP,#0x4F0+var_54]
  126. .text:75C7A2A0 A0 C4 8D E5 STR R12, [SP,#0x4F0+var_50]
  127. .text:75C7A2A4 E7 LDR R3, [R8,R3]
  128. .text:75C7A2A8 D3 E5 LDRB R3, [R3] ; Global::IIlllllllI
  129. .text:75C7A2AC E3 CMP R3, #
  130. .text:75C7A2B0 A7 0A BEQ loc_75C7A554
  131. .text:75C7A2B4 9F E5 LDR R3, =(_ZN6Global10IllIlIIllIE_ptr - 0x75CB2EC0)
  132. .text:75C7A2B8 E7 LDR R3, [R8,R3]
  133. .text:75C7A2BC E5 LDR R3, [R3] ; Global::IllIlIIllI
  134. .text:75C7A2C0 A0 D3 E5 LDRB R10, [R3]
  135. .text:75C7A2C4 D3 E5 LDRB R8, [R3,#]
  136. .text:75C7A2C8 E0 D3 E5 LDRB LR, [R3,#]
  137. .text:75C7A2CC C0 D3 E5 LDRB R12, [R3,#]
  138. .text:75C7A2D0 D3 E5 LDRB R0, [R3,#]
  139. .text:75C7A2D4 D3 E5 LDRB R1, [R3,#]
  140. .text:75C7A2D8 D3 E5 LDRB R2, [R3,#]
  141. .text:75C7A2DC D3 E5 LDRB R3, [R3,#]
  142. .text:75C7A2E0 9C A4 CD E5 STRB R10, [SP,#0x4F0+var_54]
  143. .text:75C7A2E4 9D CD E5 STRB R8, [SP,#0x4F0+var_54+]
  144. .text:75C7A2E8 9E E4 CD E5 STRB LR, [SP,#0x4F0+var_54+]
  145. .text:75C7A2EC 9F C4 CD E5 STRB R12, [SP,#0x4F0+var_54+]
  146. .text:75C7A2F0 A0 CD E5 STRB R0, [SP,#0x4F0+var_50]
  147. .text:75C7A2F4 A1 CD E5 STRB R1, [SP,#0x4F0+var_50+]
  148. .text:75C7A2F8 A2 CD E5 STRB R2, [SP,#0x4F0+var_50+]
  149. .text:75C7A2FC A3 CD E5 STRB R3, [SP,#0x4F0+var_50+]
  150. .text:75C7A300
  151. .text:75C7A300 loc_75C7A300 ; CODE XREF: hook_mono_image_open_from_data_with_name+440j
  152. .text:75C7A300 A0 E1 MOV R0, R6 ; this
  153. .text:75C7A304 2E F1 FF EB BL _ZN10llIlIlIlllC2Ev ; llIlIlIlll::llIlIlIlll(void)
  154. .text:75C7A308 A0 E3 MOV R3, #0x10 ; int
  155. .text:75C7A30C C0 D4 E5 LDRB R12, [R4,#]
  156. .text:75C7A310 9C E4 9D E5 LDR LR, [SP,#0x4F0+var_54]
  157. .text:75C7A314 D4 E5 LDRB R1, [R4,#]
  158. .text:75C7A318 D4 E5 LDRB R2, [R4,#]
  159. .text:75C7A31C D4 E5 LDRB R0, [R4,#]
  160. .text:75C7A320 A0 D4 E5 LDRB R10, [R4,#]
  161. .text:75C7A324 8D E5 STR R3, [SP,#0x4F0+var_4F0] ; int
  162. .text:75C7A328 A0 B4 9D E5 LDR R11, [SP,#0x4F0+var_50]
  163. .text:75C7A32C A4 E4 8D E5 STR LR, [SP,#0x4F0+var_4C]
  164. .text:75C7A330 0A D4 E5 LDRB R8, [R4,#0xA]
  165. .text:75C7A334 0B E0 D4 E5 LDRB LR, [R4,#0xB]
  166. .text:75C7A338 AC C4 CD E5 STRB R12, [SP,#0x4F0+var_44]
  167. .text:75C7A33C 0C C0 D4 E5 LDRB R12, [R4,#0xC]
  168. .text:75C7A340 AF CD E5 STRB R1, [SP,#0x4F0+var_41]
  169. .text:75C7A344 B0 CD E5 STRB R2, [SP,#0x4F0+var_40]
  170. .text:75C7A348 4A 1E 8D E2 ADD R1, SP, #0x4F0+var_50
  171. .text:75C7A34C 4B 2E 8D E2 ADD R2, SP, #0x4F0+var_40
  172. .text:75C7A350 AE CD E5 STRB R0, [SP,#0x4F0+var_42]
  173. .text:75C7A354 E2 ADD R1, R1, # ; char *
  174. .text:75C7A358 A0 E1 MOV R0, R6 ; this
  175. .text:75C7A35C E2 ADD R2, R2, # ; char *
  176. .text:75C7A360 A8 B4 8D E5 STR R11, [SP,#0x4F0+var_48]
  177. .text:75C7A364 AD A4 CD E5 STRB R10, [SP,#0x4F0+var_43]
  178. .text:75C7A368 B1 CD E5 STRB R8, [SP,#0x4F0+var_3F]
  179. .text:75C7A36C B2 E4 CD E5 STRB LR, [SP,#0x4F0+var_3E]
  180. .text:75C7A370 B3 C4 CD E5 STRB R12, [SP,#0x4F0+var_3D]
  181. .text:75C7A374 F1 FF EB BL _ZN10llIlIlIlll10lIIIIlIlIIEPKcS1_ii ; llIlIlIlll::lIIIIlIlII(char const*,char const*,int,int)
  182. .text:75C7A378 0F D4 E5 LDRB R2, [R4,#0xF]
  183. .text:75C7A37C D4 E5 LDRB R3, [R4,#0x10]
  184. .text:75C7A380 0D D4 E5 LDRB R0, [R4,#0xD]
  185. .text:75C7A384 0E D4 E5 LDRB R1, [R4,#0xE]
  186. .text:75C7A388 CD E5 STRB R2, [SP,#0x4F0+var_4DC+]
  187. .text:75C7A38C CD E5 STRB R3, [SP,#0x4F0+var_4DC+]
  188. .text:75C7A390 D4 E5 LDRB R2, [R4,#0x11]
  189. .text:75C7A394 D4 E5 LDRB R3, [R4,#0x12]
  190. .text:75C7A398 CD E5 STRB R0, [SP,#0x4F0+var_4DC]
  191. .text:75C7A39C CD E5 STRB R1, [SP,#0x4F0+var_4DC+]
  192. .text:75C7A3A0 A0 9D E5 LDR R10, [SP,#0x4F0+var_4DC]
  193. .text:75C7A3A4 D4 E5 LDRB R8, [R4,#0x13]
  194. .text:75C7A3A8 E0 D4 E5 LDRB LR, [R4,#0x14]
  195. .text:75C7A3AC C0 D4 E5 LDRB R12, [R4,#0x15]
  196. .text:75C7A3B0 D4 E5 LDRB R1, [R4,#0x16]
  197. .text:75C7A3B4 CD E5 STRB R2, [SP,#0x4F0+var_4D8]
  198. .text:75C7A3B8 CD E5 STRB R3, [SP,#0x4F0+var_4D8+]
  199. .text:75C7A3BC D4 E5 LDRB R2, [R4,#0x17]
  200. .text:75C7A3C0 D4 E5 LDRB R3, [R4,#0x18]
  201. .text:75C7A3C4 0A A0 E1 MOV R0, R10 ; unsigned int
  202. .text:75C7A3C8 1A CD E5 STRB R8, [SP,#0x4F0+var_4D8+]
  203. .text:75C7A3CC 1B E0 CD E5 STRB LR, [SP,#0x4F0+var_4D8+]
  204. .text:75C7A3D0 1C C0 CD E5 STRB R12, [SP,#0x4F0+var_4D4]
  205. .text:75C7A3D4 1D CD E5 STRB R1, [SP,#0x4F0+var_4D4+]
  206. .text:75C7A3D8 1E CD E5 STRB R2, [SP,#0x4F0+var_4D4+]
  207. .text:75C7A3DC 1F CD E5 STRB R3, [SP,#0x4F0+var_4D4+]
  208. .text:75C7A3E0 9C E0 FF EB BL malloc_0
  209. .text:75C7A3E4 A0 E3 MOV R1, #
  210. .text:75C7A3E8 A0 E1 MOV R8, R0
  211. .text:75C7A3EC A0 E1 MOV R2, R0 ; char *
  212. .text:75C7A3F0 8D E5 STR R1, [SP,#0x4F0+var_4F0] ; int
  213. .text:75C7A3F4 0A A0 E1 MOV R3, R10 ; unsigned int
  214. .text:75C7A3F8 A0 E1 MOV R0, R6 ; this
  215. .text:75C7A3FC E2 ADD R1, R4, #0x19 ; char *
  216. .text:75C7A400 F9 FF EB BL _ZN10llIlIlIlll10lllIIIllIIEPKcPcji ; llIlIlIlll::lllIIIllII(char const*,char *,uint,int)
  217. .text:75C7A404 1C B0 9D E5 LDR R11, [SP,#0x4F0+var_4D4]
  218. .text:75C7A408 0B A0 E1 MOV R0, R11 ; unsigned int
  219. .text:75C7A40C E0 FF EB BL malloc_0 ; 分配内存放解密后数据
  220. .text:75C7A410 C0 A0 E3 MOV R12, #
  221. .text:75C7A414 8D E2 ADD R3, SP, #0x4F0+var_4D0
  222. .text:75C7A418 A0 A0 E1 MOV R10, R0
  223. .text:75C7A41C 8D E5 STR R3, [SP,#0x4F0+var_4EC]
  224. .text:75C7A420 9D E5 LDR R2, [SP,#0x4F0+var_4D8]
  225. .text:75C7A424 A0 E1 MOV R3, R0
  226. .text:75C7A428 B0 8D E5 STR R11, [SP,#0x4F0+var_4F0]
  227. .text:75C7A42C A0 E3 MOV R0, #
  228. .text:75C7A430 A0 E1 MOV R1, R8
  229. .text:75C7A434 C0 8D E5 STR R12, [SP,#0x4F0+var_4D0]
  230. .text:75C7A438 1E EB BL _Z10IlllIIIIll10IIlIlIlllIPKhjPhjPj ; 解密出明文dll
  231. .text:75C7A43C E3 CMP R0, #
  232. .text:75C7A440 3A 0A BEQ loc_75C7A530
  233. .text:75C7A444
  234. .text:75C7A444 loc_75C7A444 ; CODE XREF: hook_mono_image_open_from_data_with_name+418j
  235. .text:75C7A444 0A A0 E1 MOV R0, R10 ; void *
  236. .text:75C7A448 E0 FF EB BL _Z10IIIIIllIIlPv ; IIIIIllIIl(void *)
  237. .text:75C7A44C A0 E1 MOV R0, R8 ; void *
  238. .text:75C7A450 8E E0 FF EB BL _Z10IIIIIllIIlPv ; IIIIIllIIl(void *)
  239. .text:75C7A454 A0 E1 MOV R0, R6 ; this
  240. .text:75C7A458 DC F0 FF EB BL _ZN10llIlIlIlllD2Ev ; llIlIlIlll::~llIlIlIlll()
  241. .text:75C7A45C
  242. .text:75C7A45C loc_75C7A45C ; CODE XREF: hook_mono_image_open_from_data_with_name+88j
  243. .text:75C7A45C ; hook_mono_image_open_from_data_with_name+11Cj ...
  244. .text:75C7A45C F0 9D E5 LDR R3, [SP,#0x4F0+arg_0]
  245. .text:75C7A460 6C 9F E5 LDR R1, =(dword_75CB4068 - 0x75C7A474)
  246. .text:75C7A464 8D E5 STR R7, [SP,#0x4F0+var_4EC]
  247. .text:75C7A468 8D E5 STR R3, [SP,#0x4F0+var_4F0]
  248. .text:75C7A46C 8F E0 ADD R1, PC, R1 ; dword_75CB4068
  249. .text:75C7A470 C0 E5 LDR R12, [R1,#(dword_75CB4070 - 0x75CB4068)]
  250. .text:75C7A474 0C 9D E5 LDR R2, [SP,#0x4F0+var_4E4]
  251. .text:75C7A478 A0 E1 MOV R3, R9
  252. .text:75C7A47C A0 E1 MOV R0, R4
  253. .text:75C7A480 A0 E1 MOV R1, R5
  254. .text:75C7A484 3C FF 2F E1 BLX R12
  255. .text:75C7A488 A0 E1 MOV R8, R0
  256. .text:75C7A48C
  257. .text:75C7A48C loc_75C7A48C ; CODE XREF: hook_mono_image_open_from_data_with_name+3F4j
  258. .text:75C7A48C 9F E5 LDR R1, =(unk_75CACB70 - 0x75C7A49C)
  259. .text:75C7A490 A0 E1 MOV R0, R6 ; this
  260. .text:75C7A494 8F E0 ADD R1, PC, R1 ; unk_75CACB70 ; char *
  261. .text:75C7A498 B0 FA FF EB BL DecString
  262. .text:75C7A49C A0 E1 MOV R0, R6
  263. .text:75C7A4A0 F9 FF EB BL _ZN10lIIIlIlIIlcvPcEv ; lIIIlIlIIl::operator char *(void)
  264. .text:75C7A4A4 A0 E1 MOV R1, R0 ; needle
  265. .text:75C7A4A8 A0 E1 MOV R0, R7 ; haystack
  266. .text:75C7A4AC D9 FF EB BL strstr
  267. .text:75C7A4B0 A0 E1 MOV R7, R0
  268. .text:75C7A4B4 A0 E1 MOV R0, R6 ; this
  269. .text:75C7A4B8 6C F9 FF EB BL _ZN10lIIIlIlIIlD2Ev ; lIIIlIlIIl::~lIIIlIlIIl()
  270. .text:75C7A4BC E3 CMP R7, #
  271. .text:75C7A4C0 CMPNE R5, #
  272. .text:75C7A4C4 0A BEQ loc_75C7A4DC
  273. .text:75C7A4C8 A0 E3 MOV R3, #
  274. .text:75C7A4CC E0 ADD R5, R4, R5
  275. .text:75C7A4D0
  276. .text:75C7A4D0 loc_75C7A4D0 ; CODE XREF: hook_mono_image_open_from_data_with_name+3A0j
  277. .text:75C7A4D0 C4 E4 STRB R3, [R4],#
  278. .text:75C7A4D4 E1 CMP R4, R5
  279. .text:75C7A4D8 FC FF FF 1A BNE loc_75C7A4D0
  280. .text:75C7A4DC
  281. .text:75C7A4DC loc_75C7A4DC ; CODE XREF: hook_mono_image_open_from_data_with_name+38Cj
  282. .text:75C7A4DC ; hook_mono_image_open_from_data_with_name+3ECj
  283. .text:75C7A4DC 9D E5 LDR R3, [SP,#0x4F0+var_4E8]
  284. .text:75C7A4E0 C4 9D E5 LDR R2, [SP,#0x4F0+var_2C]
  285. .text:75C7A4E4 A0 E1 MOV R0, R8
  286. .text:75C7A4E8 E5 LDR R3, [R3]
  287. .text:75C7A4EC E1 CMP R2, R3
  288. .text:75C7A4F0 1A BNE loc_75C7A588
  289. .text:75C7A4F4 DD 8D E2 ADD SP, SP, #0x4C0
  290. .text:75C7A4F8 0C D0 8D E2 ADD SP, SP, #0xC
  291. .text:75C7A4FC F0 8F BD E8 LDMFD SP!, {R4-R11,PC}
  1. 解密后 dump dll R10是基址,R11是大小,如下图:

  1. static main(void)
  2. {
  3. auto fp, begin, end, dexbyte;
  4. fp = fopen("d:\\dump.dll", "wb"); //打开或创建一个文件
  5. begin = R10; //dll基址
  6. end = begin + R11; //dll基址 + dll文件大小
  7. for ( dexbyte = begin; dexbyte < end;dexbyte ++ )
  8. {
  9. fputc(Byte(dexbyte), fp); //按字节将其dump到本地文件中
  10. }
  11. }

将dump出来的dll反编后如下图:

3.在hook_mono_assembly_load_from_full主要是计算将解密dll的PE头清楚后的计算crc值。

七: libengine模块分析

1. 在com/inca/security/Core/AppGuardEngine类中注册的第一个Native函数中通过dlopen、dlsym调用libengine.sox解密的so

JNI比函数   .text:75C81168  IlIIIIIIII (文件偏移 13168)  (Landroid/content/Context;Ljava/lang/String;[B)I

2.通过dlopen、dlsym获取下面3个函数。

以下这几个函数被调用

Initialize (文件偏移27144)

CreateObject  (文件偏移2A2F4)

Clazz::IlIllllIIl (文件偏移2B1B0)

3. Initialize函数

  1. //反调试
  2. /data/data/com.digitalsky.girlsfrontline.cn/files/95c72528dc4c1ef12d2bf750585fed56eca973a8 7CE87000
  3. .text:7CEAE17A loc_7CEAE17A ; CODE XREF: Initialize+32j
  4. .text:7CEAE17A CC 4B LDR R3, =(_ZN10lllllIIIll11IIlIlIIIlllE_ptr - 0x7CF87D44)
  5. .text:7CEAE17C EB LDR R3, [R5,R3]
  6. .text:7CEAE17E 1E STR R6, [R3] ; lllllIIIll::IIlIlIIIlll
  7. .text:7CEAE180 F0 B6 FD BL Anit_Dbg ; 反调试(读进程状态)
  8. .text:7CEAE184 B8 CMP R0, R7
  9. .text:7CEAE186 D0 BEQ loc_7CEAE18A
  10. .text:7CEAE188 D4 E1 B loc_7CEAE534
  11.  
  12. //动态获取函数
  13. .text:7CEAE33A loc_7CEAE33A ; CODE XREF: Initialize+1F2j
  14. .text:7CEAE33A 1A STR R2, [R3] ; Global::llIlIllllI
  15. .text:7CEAE33C 1E F0 DA FC BL GetlibcFunc
  16. .text:7CEAE340 1F F0 FD BL GetlibdvmFunc
  17. .text:7CEAE344 CMP R0, #
  18. .text:7CEAE346 D0 BEQ loc_7CEAE352
  19. .text:7CEAE348 4B LDR R3, =(_ZN6Global11llllIIlIlIIE_ptr - 0x7CF87D44)
  20. .text:7CEAE34A EB LDR R3, [R5,R3]
  21. .text:7CEAE34C STR R3, [SP,#0x1A8+var_198]
  22. .text:7CEAE34E MOVS R3, #
  23. .text:7CEAE350 1E E0 B loc_7CEAE390

4. CreateObject函数

计算libengine.sox解密后的函数crc (文件偏移 2A1F6)

  1. /data/data/com.digitalsky.girlsfrontline.cn/files/95c72528dc4c1ef12d2bf750585fed56eca973a8 7CF7A000
  2.  
  3. .text:7CFA41F6 loc_7CFA41F6 ; CODE XREF: IlllIIIlll::IlllIIIlll(_JNIEnv *,void *)+324j
  4. .text:7CFA41F6 4B LDR R3, =(_ZN6Global11lIIIIIIIIIIE_ptr - 0x7D07AD44)
  5. .text:7CFA41F8 9A LDR R2, [SP,#0xF8+var_DC]
  6. .text:7CFA41FA F3 LDR R3, [R6,R3]
  7. .text:7CFA41FC 1C MOVS R0, R2 ; void *
  8. .text:7CFA41FE 1A STR R2, [R3] ; Global::lIIIIIIIIII
  9. .text:7CFA4200 F0 F8 BL GetCrc32 ; 计算libengine.sox解密后的函数crc
  10. .text:7CFA4204 4B LDR R3, =(_ZN6Global11lIIlIlIIIlIE_ptr - 0x7D07AD44)
  11. 计算CRC函数代码如下:
  12. .text:7CFD8250 EXPORT GetCrc32
  13. .text:7CFD8250 GetCrc32 ; CODE XREF: IlllIIIlll::IlllIIIlll(_JNIEnv *,void *)+2E4p
  14. .text:7CFD8250 ; IlllIllIll::lIIIllIlIll(lIIIllIlllII *,int,IIlIllIlllll *,bool *,char *,bool)+88p ...
  15. .text:7CFD8250 ; __unwind {
  16. .text:7CFD8250 F8 B5 PUSH {R3-R7,LR}
  17. .text:7CFD8252 4B LDR R3, =(_ZN6Global10lIIllIllIlE_ptr - 0x7CFD825A)
  18. .text:7CFD8254 MOVS R5, #
  19. .text:7CFD8256 7B ADD R3, PC ; _ZN6Global10lIIllIllIlE_ptr
  20. .text:7CFD8258 1B LDR R3, [R3] ; Global::lIIllIllIl
  21. .text:7CFD825A 1B LDR R3, [R3] ; Global::lIIllIllIl
  22. .text:7CFD825C 2B CMP R3, #0x17
  23. .text:7CFD825E 3B DC BGT loc_7CFD82D8
  24. .text:7CFD8260 1C MOVS R4, R0
  25. .text:7CFD8262 2B CMP R3, #0x17
  26. .text:7CFD8264 D1 BNE loc_7CFD8278
  27. .text:7CFD8266 1E LDR R0, =(_ZN6Global11IlIIIIlllllE_ptr - 0x7CFD826E)
  28. .text:7CFD8268 1E LDR R1, =(aN - 0x7CFD8272)
  29. .text:7CFD826A ADD R0, PC ; _ZN6Global11IlIIIIlllllE_ptr
  30. .text:7CFD826C LDR R0, [R0] ; Global::IlIIIIlllll
  31. .text:7CFD826E ADD R1, PC ; "N"
  32. .text:7CFD8270 F0 BE FB BL j_strcmp
  33. .text:7CFD8274 A8 CMP R0, R5
  34. .text:7CFD8276 2F D0 BEQ loc_7CFD82D8
  35. .text:7CFD8278
  36. .text:7CFD8278 loc_7CFD8278 ; CODE XREF: GetCrc32+14j
  37. .text:7CFD8278 MOVS R6, #
  38. .text:7CFD827A 1C MOVS R3, R4
  39. .text:7CFD827C 1C MOVS R0, R6 ; this
  40. .text:7CFD827E B0 ADDS R3, #0xB0
  41. .text:7CFD8280 1F LDR R7, [R3]
  42. .text:7CFD8282
  43. .text:7CFD8282 loc_7CFD8282 ; CODE XREF: GetCrc32+84j
  44. .text:7CFD8282 1C MOVS R3, R4
  45. .text:7CFD8284 B4 ADDS R3, #0xB4
  46. .text:7CFD8286 1B LDR R3, [R3]
  47. .text:7CFD8288 9E CMP R6, R3 ; 判断是否结束
  48. .text:7CFD828A D2 BCS loc_7CFD82D6
  49. .text:7CFD828C 1C MOVS R3, R4
  50. .text:7CFD828E BC ADDS R3, #0xBC
  51. .text:7CFD8290 1B LDR R3, [R3]
  52. .text:7CFD8292 B2 LSLS R2, R6, #
  53. .text:7CFD8294 D5 LDR R5, [R2,R3]
  54. .text:7CFD8296
  55. .text:7CFD8296 loc_7CFD8296 ; CODE XREF: GetCrc32+80j
  56. .text:7CFD8296 2D CMP R5, #
  57. .text:7CFD8298 1B D0 BEQ loc_7CFD82D2
  58. .text:7CFD829A 2B LSLS R3, R5, #
  59. .text:7CFD829C FB ADDS R3, R7, R3 ; unsigned int
  60. .text:7CFD829E 7B LDRB R1, [R3,#0xC]
  61. .text:7CFD82A0 0A ASRS R2, R1, #
  62. .text:7CFD82A2 3A SUBS R2, #
  63. .text:7CFD82A4 2A CMP R2, #
  64. .text:7CFD82A6 0E D8 BHI loc_7CFD82C6
  65. .text:7CFD82A8 DA LDRH R2, [R3,#0xE]
  66. .text:7CFD82AA 2A CMP R2, #
  67. .text:7CFD82AC 0B D0 BEQ loc_7CFD82C6
  68. .text:7CFD82AE 0F MOVS R2, #0xF
  69. .text:7CFD82B0 0A ANDS R2, R1
  70. .text:7CFD82B2 2A CMP R2, #
  71. .text:7CFD82B4 D1 BNE loc_7CFD82C6
  72. .text:7CFD82B6 1C MOVS R2, R4
  73. .text:7CFD82B8 8C ADDS R2, #0x8C
  74. .text:7CFD82BA LDR R1, [R2]
  75. .text:7CFD82BC 5A LDR R2, [R3,#]
  76. .text:7CFD82BE ADDS R1, R2, R1 ; unsigned int
  77. .text:7CFD82C0 9A LDR R2, [R3,#] ; unsigned __int8 *
  78. .text:7CFD82C2 E5 F7 F1 FF BL adler_adler32 ; R1函数首地址,R2函数大小
  79. .text:7CFD82C6
  80. .text:7CFD82C6 loc_7CFD82C6 ; CODE XREF: GetCrc32+56j
  81. .text:7CFD82C6 ; GetCrc32+5Cj ...
  82. .text:7CFD82C6 1C MOVS R3, R4
  83. .text:7CFD82C8 C0 ADDS R3, #0xC0
  84. .text:7CFD82CA 1B LDR R3, [R3]
  85. .text:7CFD82CC AD LSLS R5, R5, #
  86. .text:7CFD82CE 5D LDR R5, [R3,R5]
  87. .text:7CFD82D0 E1 E7 B loc_7CFD8296
  88. .text:7CFD82D2 ; ---------------------------------------------------------------------------
  89. .text:7CFD82D2
  90. .text:7CFD82D2 loc_7CFD82D2 ; CODE XREF: GetCrc32+48j
  91. .text:7CFD82D2 ADDS R6, #
  92. .text:7CFD82D4 D5 E7 B loc_7CFD8282
  93. .text:7CFD82D6 ; ---------------------------------------------------------------------------
  94. .text:7CFD82D6
  95. .text:7CFD82D6 loc_7CFD82D6 ; CODE XREF: GetCrc32+3Aj
  96. .text:7CFD82D6 1C ADDS R5, R0, #
  97. .text:7CFD82D8
  98. .text:7CFD82D8 loc_7CFD82D8 ; CODE XREF: GetCrc32+Ej
  99. .text:7CFD82D8 ; GetCrc32+26j
  100. .text:7CFD82D8 1C MOVS R0, R5
  101. .text:7CFD82DA F8 BD POP {R3-R7,PC}

5. IlIllllIIl 函数

计算libc.so代码节的crc值 与.text节的CRC(文件偏移398AE)

  1. /data/data/com.digitalsky.girlsfrontline.cn/files/95c72528dc4c1ef12d2bf750585fed56eca973a8
  2. .text:7779C8AE LDR R1, [R3,#]
  3. .text:7779C8B0 LDR R3, [R6,#0x10] ; unsigned int
  4. .text:7779C8B2 C9 ADDS R1, R1, R3 ; unsigned int
  5. .text:7779C8B4 0A F0 F8 FC BL _ZN5adler7adler32EmPKhj ; 计算libc.so代码节的crc AA4AC826

6.计算libcompatible.so函数的Crc与.text节的CRC

  1. .text:7C88BAB2
  2. .text:7C88BAB2 ; IlllIIIIlIl(IlIIlIIIll *)
  3. .text:7C88BAB2 EXPORT _Z11IlllIIIIlIlP10IlIIlIIIll
  4. .text:7C88BAB2 _Z11IlllIIIIlIlP10IlIIlIIIll ; CODE XREF: IlllIllIll::IlIllIllll(lIIIllIlllII *,int,IIlIllIlllll *,bool *,char *,bool)+196p
  5. .text:7C88BAB2 ; IlllIllIll::IlllIllIll(_jobject *,int,long long,long long,uint,char **,char **,char **,char **,char **)+80Cp
  6. .text:7C88BAB2 ; __unwind {
  7. .text:7C88BAB2 F8 B5 PUSH {R3-R7,LR}
  8. .text:7C88BAB4 MOVS R6, #
  9. .text:7C88BAB6 FC ADDS R0, #0xFC
  10. .text:7C88BAB8 1C MOVS R4, R0
  11. .text:7C88BABA 6C LDR R7, [R0,#0x48]
  12. .text:7C88BABC 1C ADDS R0, R6, # ; this
  13. .text:7C88BABE
  14. .text:7C88BABE loc_7C88BABE ; CODE XREF: IlllIIIIlIl(IlIIlIIIll *)+4Ej
  15. .text:7C88BABE A3 6A LDR R3, [R4,#0x28]
  16. .text:7C88BAC0 9E CMP R6, R3 ; 判断函数个数是否结束
  17. .text:7C88BAC2 1E D2 BCS locret_7C88BB02
  18. .text:7C88BAC4 6B LDR R2, [R4,#0x30]
  19. .text:7C88BAC6 B3 LSLS R3, R6, #
  20. .text:7C88BAC8 9D LDR R5, [R3,R2]
  21. .text:7C88BACA
  22. .text:7C88BACA loc_7C88BACA ; CODE XREF: IlllIIIIlIl(IlIIlIIIll *)+4Aj
  23. .text:7C88BACA 2D CMP R5, #
  24. .text:7C88BACC D0 BEQ loc_7C88BAFE ; i++
  25. .text:7C88BACE 2B LSLS R3, R5, #
  26. .text:7C88BAD0 FB ADDS R3, R7, R3 ; unsigned int
  27. .text:7C88BAD2 7B LDRB R1, [R3,#0xC]
  28. .text:7C88BAD4 0A ASRS R2, R1, #
  29. .text:7C88BAD6 3A SUBS R2, #
  30. .text:7C88BAD8 2A CMP R2, #
  31. .text:7C88BADA 0C D8 BHI loc_7C88BAF6
  32. .text:7C88BADC DA LDRH R2, [R3,#0xE]
  33. .text:7C88BADE 2A CMP R2, #
  34. .text:7C88BAE0 D0 BEQ loc_7C88BAF6
  35. .text:7C88BAE2 0F MOVS R2, #0xF
  36. .text:7C88BAE4 0A ANDS R2, R1
  37. .text:7C88BAE6 2A CMP R2, #
  38. .text:7C88BAE8 D1 BNE loc_7C88BAF6
  39. .text:7C88BAEA 5A LDR R2, [R3,#]
  40. .text:7C88BAEC 6A LDR R1, [R4,#0x20]
  41. .text:7C88BAEE ADDS R1, R2, R1 ; unsigned int
  42. .text:7C88BAF0 9A LDR R2, [R3,#] ; unsigned __int8 *
  43. .text:7C88BAF2 E5 F7 D9 FB BL adler_adler32 ; 计算crc32
  44. .text:7C88BAF6
  45. .text:7C88BAF6 loc_7C88BAF6 ; CODE XREF: IlllIIIIlIl(IlIIlIIIll *)+28j
  46. .text:7C88BAF6 ; IlllIIIIlIl(IlIIlIIIll *)+2Ej ...
  47. .text:7C88BAF6 6B LDR R3, [R4,#0x34]
  48. .text:7C88BAF8 AD LSLS R5, R5, #
  49. .text:7C88BAFA 5D LDR R5, [R3,R5]
  50. .text:7C88BAFC E5 E7 B loc_7C88BACA
  51. .text:7C88BAFE ; ---------------------------------------------------------------------------
  52. .text:7C88BAFE
  53. .text:7C88BAFE loc_7C88BAFE ; CODE XREF: IlllIIIIlIl(IlIIlIIIll *)+1Aj
  54. .text:7C88BAFE ADDS R6, # ; i++
  55. .text:7C88BB00 DD E7 B loc_7C88BABE
  56. .text:7C88BB02 ; ---------------------------------------------------------------------------
  57. .text:7C88BB02
  58. .text:7C88BB02 locret_7C88BB02 ; CODE XREF: IlllIIIIlIl(IlIIlIIIll *)+10j
  59. .text:7C88BB02 F8 BD POP {R3-R7,PC}
  60. 计算so的.text节代码的crc (文件偏移 )
  61. ,text:7C866860 ; IlllIllIll::IlllIllIll(_jobject *,int,long long,long long,uint,char **,char **,char **,char **,char **)+8E2j
  62. .text:7C866860 MOVS R3, #
  63. .text:7C866862 STR R3, [SP,#0xB20+var_B08]
  64. .text:7C866864 9B LDR R3, [SP,#0xB20+var_B14]
  65. .text:7C866866 2B CMP R3, #
  66. .text:7C866868 2C D0 BEQ loc_7C8668C4 ; 结束
  67. .text:7C86686A
  68. .text:7C86686A loc_7C86686A ; CODE XREF: IlllIllIll::IlllIllIll(_jobject *,int,long long,long long,uint,char **,char **,char **,char **,char **)+94Aj
  69. .text:7C86686A 9B LDR R3, [SP,#0xB20+var_B08]
  70. .text:7C86686C 9A LDR R2, [SP,#0xB20+var_AFC]
  71. .text:7C86686E CMP R3, R2 ; 判断是否结束
  72. .text:7C866870 D0 BEQ loc_7C8668C4 ; 结束
  73. .text:7C866872 1C MOVS R0, R5 ; this
  74. .text:7C866874 LDR R1, [SP,#0xB20+var_B08] ; unsigned int
  75. .text:7C866876 1C F0 FE BL _ZN10lIIIIllIII10lIlIIlIIll10IlIIlIlIllEj ; lIIIIllIII::lIlIIlIIll::IlIIlIlIll(uint)
  76. .text:7C86687A 9B LDR R3, [SP,#0xB20+var_B14]
  77. .text:7C86687C LDR R2, [R0]
  78. .text:7C86687E 1C MOVS R6, R0
  79. .text:7C866880 ADDS R0, R3, R2
  80. .text:7C866882 2B LDR R3, [R5]
  81. .text:7C866884 5A LDR R2, [R3,#]
  82. .text:7C866886 9B LDR R3, [R3,#]
  83. .text:7C866888 D3 ADDS R3, R2, R3
  84. .text:7C86688A CMP R0, R3
  85. .text:7C86688C 1C D8 BHI loc_7C8668C8
  86. .text:7C86688E LDR R1, =(aText - 0x7C866896)
  87. .text:7C866890 MOVS R2, #
  88. .text:7C866892 ADD R1, PC ; ".text"
  89. .text:7C866894 6C F0 FE BL j_strncmp ; 判断是否为.text
  90. .text:7C866898 CMP R0, #
  91. .text:7C86689A 0F D1 BNE loc_7C8668BC
  92. .text:7C86689C D7 MOVS R3, #0xD7
  93. .text:7C86689E LDR R2, [R6,#0x14] ; unsigned __int8 *
  94. .text:7C8668A0 9B LSLS R3, R3, #
  95. .text:7C8668A2 FA STR R2, [R7,R3]
  96. .text:7C8668A4 D8 MOVS R3, #0xD8
  97. .text:7C8668A6 LDR R1, [R6,#0x10]
  98. .text:7C8668A8 9B LSLS R3, R3, #
  99. .text:7C8668AA F9 STR R1, [R7,R3]
  100. .text:7C8668AC 2B LDR R3, [R5]
  101. .text:7C8668AE LDR R1, [R3,#]
  102. .text:7C8668B0 LDR R3, [R6,#0x10] ; unsigned int
  103. .text:7C8668B2 C9 ADDS R1, R1, R3 ; unsigned int
  104. .text:7C8668B4 0A F0 F8 FC BL adler_adler32 ; 计算libc.so代码节的crc
  105. .text:7C8668B8 0A 9B LDR R3, [SP,#0xB20+var_AF8]
  106. .text:7C8668BA F8 STR R0, [R7,R3]
  107. .text:7C8668BC
  108. .text:7C8668BC loc_7C8668BC ; CODE XREF: IlllIllIll::IlllIllIll(_jobject *,int,long long,long long,uint,char **,char **,char **,char **,char **)+922j
  109. .text:7C8668BC 9B LDR R3, [SP,#0xB20+var_B08]
  110. .text:7C8668BE ADDS R3, #

7.判断是否有种破解工具与是否在模拟器中运行,创建线程检测比较CRC值。

检测是否有的非法工具部分字符串如下:

  1. LuckyPatcher v4..(幸运破解器)
  2. LuckyPatcher v5..
  3. gamehacker (烧饼游戏修改器)
  4. com.cih.game_cih:*(金手指)
  5. (com.huluxia.gametools)葫芦侠
  6. Cheat Engine修改器
  7. tcpdump
  8. GenyMotion(模拟器)
  9. Windroy
  10. BlueStacks
  11. org.sbtools.gamespeed燒餅修改器
  12. org.game.master 游戏修改大师
  13. 在线程中比较CRC值。
  14. .text:7D34674C Cmp_Crc32 ; CODE XREF: IlllIllIll::IIIlllIlllII(lIIIllIlllII *,IIlIllIlllll *)+40Ap
  15. .text:7D34674C ; IlllIllIll::lIllllllIlII(lIIIllIlllII *,IIlIllIlllll *)+4EAp ...
  16. .text:7D34674C
  17. .text:7D34674C var_20 = -0x20
  18. .text:7D34674C var_1C = -0x1C
  19. .text:7D34674C arg_0 =
  20. .text:7D34674C arg_8 =
  21. .text:7D34674C
  22. .text:7D34674C ; __unwind {
  23. .text:7D34674C F7 B5 PUSH {R0-R2,R4-R7,LR}
  24. .text:7D34674E 0A AC ADD R4, SP, #0x20+arg_8
  25. .text:7D346750 LDRB R4, [R4]
  26. .text:7D346752 STR R4, [SP,#0x20+var_20]
  27. .text:7D346754 CMP R1, #
  28. .text:7D346756 D0 BEQ loc_7D346764
  29. .text:7D346758 MOVS R5, #
  30. .text:7D34675A D4 LSLS R4, R2, #
  31. .text:7D34675C 0C ADDS R4, R1, R4
  32. .text:7D34675E STR R5, [R4,#]
  33. .text:7D346760 MOVS R5, #
  34. .text:7D346762 A5 STR R5, [R4,#]
  35. .text:7D346764
  36. .text:7D346764 loc_7D346764 ; CODE XREF: Cmp_Crc32+Aj
  37. .text:7D346764 9C LDR R4, [SP,#0x20+var_20]
  38. .text:7D346766 2C CMP R4, #
  39. .text:7D346768 D1 BNE loc_7D34677A
  40. .text:7D34676A 8C E4 MOVS R4, #0x460
  41. .text:7D34676E ADDS R4, R0, R4
  42. .text:7D346770 LDR R4, [R4]
  43. .text:7D346772 A4 LSLS R4, R4, #0x16
  44. .text:7D346774 D5 BPL loc_7D34677A
  45. .text:7D346776
  46. .text:7D346776 loc_7D346776 ; CODE XREF: Cmp_Crc32+38j
  47. .text:7D346776 ; Cmp_Crc32+58j
  48. .text:7D346776 MOVS R0, #
  49. .text:7D346778 E0 B locret_7D346808
  50. .text:7D34677A ; ---------------------------------------------------------------------------
  51. .text:7D34677A
  52. .text:7D34677A loc_7D34677A ; CODE XREF: Cmp_Crc32+1Cj
  53. .text:7D34677A ; Cmp_Crc32+28j
  54. .text:7D34677A 4C LDR R4, =(_ZN6Global10llIIIlIlIIE_ptr - 0x7D346780)
  55. .text:7D34677C 7C ADD R4, PC ; _ZN6Global10llIIIlIlIIE_ptr
  56. .text:7D34677E LDR R4, [R4] ; Global::llIIIlIlII
  57. .text:7D346780 LDRB R6, [R4] ; Global::llIIIlIlII
  58. .text:7D346782 2E CMP R6, #
  59. .text:7D346784 F7 D1 BNE loc_7D346776
  60. .text:7D346786 1D 1C MOVS R5, R3
  61. .text:7D346788 4B LDR R3, =(_ZN6Global11lIIIIIIIIIIE_ptr - 0x7D346790)
  62. .text:7D34678A 1C MOVS R4, R0
  63. .text:7D34678C 7B ADD R3, PC ; _ZN6Global11lIIIIIIIIIIE_ptr
  64. .text:7D34678E 1B LDR R3, [R3] ; Global::lIIIIIIIIII
  65. .text:7D346790 STR R2, [SP,#0x20+var_1C]
  66. .text:7D346792 0F 1C MOVS R7, R1
  67. .text:7D346794 LDR R0, [R3] ; void *
  68. .text:7D346796 F0 5B FD BL GetCrc32
  69. .text:7D34679A 1E 4B LDR R3, =(_ZN6Global11lIIlIlIIIlIE_ptr - 0x7D3467A0)
  70. .text:7D34679C 7B ADD R3, PC ; _ZN6Global11lIIlIlIIIlIE_ptr
  71. .text:7D34679E 1B LDR R3, [R3] ; Crc32Dword_E13E1FA9
  72. .text:7D3467A0 1B LDR R3, [R3]
  73. .text:7D3467A2 CMP R0, R3 ; 比较crc32
  74. .text:7D3467A4 E7 D0 BEQ loc_7D346776
  75. .text:7D3467A6 1C 4A LDR R2, =(_ZN10IlllIllIll11llllIllIIIlE - 0x7D3467AC)
  76. .text:7D3467A8 7A ADD R2, PC ; IlllIllIll::llllIllIIIl
  77. .text:7D3467AA LDR R3, [R2] ; IlllIllIll::llllIllIIIl
  78. .text:7D3467AC ADDS R3, #
  79. .text:7D3467AE STR R3, [R2] ; IlllIllIll::llllIllIIIl
  80. .text:7D3467B0 2D CMP R5, #
  81. .text:7D3467B2 1D D0 BEQ loc_7D3467F0
  82. .text:7D3467B4 MOVS R1, #
  83. .text:7D3467B6 2A LDR R2, [R5]
  84. .text:7D3467B8 LSLS R3, R2, #
  85. .text:7D3467BA EB ADDS R3, R5, R3
  86. .text:7D3467BC STR R1, [R3,#]
  87. .text:7D3467BE 0A MOVS R1, #0xA
  88. .text:7D3467C0 DE STR R6, [R3,#0xC]
  89. .text:7D3467C2 STR R1, [R3,#]
  90. .text:7D3467C4 1E STR R6, [R3,#0x10]
  91. .text:7D3467C6 9B LDR R3, [SP,#0x20+arg_0]
  92. .text:7D3467C8 ADDS R2, #
  93. .text:7D3467CA 2A STR R2, [R5]
  94. .text:7D3467CC 2B CMP R3, #
  95. .text:7D3467CE D0 BEQ loc_7D3467D6
  96. .text:7D3467D0 MOVS R3, #
  97. .text:7D3467D2 9A LDR R2, [SP,#0x20+arg_0]
  98. .text:7D3467D4 STRB R3, [R2]
  99. .text:7D3467D6
  100. .text:7D3467D6 loc_7D3467D6 ; CODE XREF: Cmp_Crc32+82j
  101. .text:7D3467D6 9B LDR R3, [SP,#0x20+var_20]
  102. .text:7D3467D8 2B CMP R3, #
  103. .text:7D3467DA D1 BNE loc_7D3467F0
  104. .text:7D3467DC 8D DB MOVS R3, #0x468
  105. .text:7D3467E0 E3 ADDS R3, R4, R3
  106. .text:7D3467E2 1B LDR R3, [R3]
  107. .text:7D3467E4 9B LSLS R3, R3, #0x16
  108. .text:7D3467E6 D4 BMI loc_7D3467F0
  109. .text:7D3467E8 0C 4A LDR R2, =0x49C
  110. .text:7D3467EA A3 LDR R3, [R4,R2]
  111. .text:7D3467EC ADDS R3, #
  112. .text:7D3467EE A3 STR R3, [R4,R2]
  113. .text:7D3467F0
  114. .text:7D3467F0 loc_7D3467F0 ; CODE XREF: Cmp_Crc32+66j
  115. .text:7D3467F0 ; Cmp_Crc32+8Ej ...
  116. .text:7D3467F0 2F CMP R7, #
  117. .text:7D3467F2 D0 BEQ loc_7D3467FE
  118. .text:7D3467F4 9B LDR R3, [SP,#0x20+var_1C]
  119. .text:7D3467F6 DA LSLS R2, R3, #
  120. .text:7D3467F8 AA MOVS R3, #0xAA
  121. .text:7D3467FA BA ADDS R2, R7, R2
  122. .text:7D3467FC STR R3, [R2,#]
  123. .text:7D3467FE
  124. .text:7D3467FE loc_7D3467FE ; CODE XREF: Cmp_Crc32+A6j
  125. .text:7D3467FE MOVS R0, #
  126. .text:7D346800 4B LDR R3, =(_ZN6Global10lIlIIllIIlE_ptr - 0x7D346806)
  127. .text:7D346802 7B ADD R3, PC ; _ZN6Global10lIlIIllIIlE_ptr
  128. .text:7D346804 1B LDR R3, [R3] ; Global::lIlIIllIIl
  129. .text:7D346806 STRB R0, [R3,#(byte_7D413581 - 0x7D413578)]
  130. .text:7D346808
  131. .text:7D346808 locret_7D346808 ; CODE XREF: Cmp_Crc32+2Cj
  132. .text:7D346808 FE BD POP {R1-R7,PC}

截图监控

  1. .text:7D34B944 2A LDR R1, =(unk_7D3E51F8 - 0x7D34B94E)
  2. .text:7D34B946 3D LDR R5, [R7,R4]
  3. .text:7D34B948 7F AC ADD R4, SP, #0xB20+var_924
  4. .text:7D34B94A ADD R1, PC ; unk_7D3E51F8
  5. .text:7D34B94C 1C MOVS R0, R4 ; this
  6. .text:7D34B94E 4C ADDS R1, #0x4C ; 'L' ; char *
  7. .text:7D34B950 0A F0 F8 BL DecString
  8. .text:7D34B954 1C MOVS R0, R4
  9. .text:7D34B956 F0 FF BL _ZN10IIllIIlIIIcvPcEv ; IIllIIlIII::operator char *(void)
  10. .text:7D34B95A 1C MOVS R1, R0
  11. .text:7D34B95C MOVS R2, #
  12. .text:7D34B95E 1C MOVS R0, R5
  13. .text:7D34B960 6D F0 9E F8 BL j_inotify_add_watch ; 截图监控
  14. .text:7D34B964 E0 AD MOVS R5, #0x380
  15. .text:7D34B968 STR R0, [R7,R5]
  16. .text:7D34B96A 1C MOVS R0, R4 ; this
  17. .text:7D34B96C F0 FF BL _ZN10IIllIIlIIID2Ev ; IIllIIlIII::~IIllIIlIII()
  18. .text:7D34B970 7B LDR R3, [R7,R5]
  19. .text:7D34B972 2B CMP R3, #
  20. .text:7D34B974 DA BGE loc_7D34B998
  21. .text:7D34B976 MOVS R3, #
  22. .text:7D34B978 1E 4A LDR R2, =(a5eddcc418cda8d - 0x7D34B988)

八:总结

1.该反外挂系统主要有字符串加密保护,客户端完整性检查(CRC+签

名),函数及变量、反调试保护,系统so文件校验, 自身so文件校验,U3D防护,画面截屏保护,内存防修改保护,但是so本身只做了函数名混淆与字符串加密,代码没有做保护处理,逆向起来还是比较容易。

样本:链接: https://pan.baidu.com/s/1dFPbyLj 密码: 7h2r

欢迎关注公众号:

  1.  

nProtect APPGuard安卓反外挂分析的更多相关文章

  1. 帧同步(LockStep)该如何反外挂

    在中国的游戏环境下,反挂已经成为了游戏开发的重中之重,甚至能决定一款游戏的生死,吃鸡就是一个典型的案例.目前参与了了一款动作射击的MOBA类游戏的开发,同步方案上选择了帧同步技术(LockStep而非 ...

  2. 基于御安全APK加固的游戏反外挂方案

    一. 前言 随着移动互联网的兴起,移动游戏市场近几年突然爆发,收入规模快速增长.根据第三方数据统计,国内移动游戏2015年市场规模已达514.6亿.由于手游市场强势兴起,而且后续增长势头会愈加猛烈.火 ...

  3. 一文了解安卓APP逆向分析与保护机制

    "知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道."知物 ...

  4. Android敲诈者病毒“安卓性能激活”分析(2015年9月版)

    一.情况简介 前几天分析了论坛里的一个Android敲诈者病毒,感觉还是很有收获,后面有空多研究研究Android病毒.说句题外话, 根据前面分析的Android敲诈者病毒的隐藏手法,应该可以实现&q ...

  5. CNN卷积核反传分析

    CNN(卷积神经网络)的误差反传(error back propagation)中有一个非常关键的的步骤就是将某个卷积(Convolve)层的误差传到前一层的池化(Pool)层上,因为在CNN中是2D ...

  6. 安卓脱壳&&协议分析&&burp辅助分析插件编写

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 前言 本文以一个 app 为例,演示对 app脱壳,然后分析其 协 ...

  7. 163music 反爬分析

    # 网易163 音乐的  mp3下载 .mp3 下载的一个API吧 封 IP 的一种报错 网易云就给我返回了一个{"code":-460,"msg":" ...

  8. 唯品会安卓版app分析

    .................................................................................................... ...

  9. 安卓动态逆向分析工具--Andbug&Androguard

    工具使用方法: 转自: http://bbs.pediy.com/showthread.php?t=183412 https://testerhome.com/topics/3542 安装andbug ...

随机推荐

  1. 2019.2.10考试T2, 多项式求exp+生成函数

    \(\color{#0066ff}{ 题目描述 }\) 为了减小文件大小,这里不写一堆题目背景了. 请写一个程序,输入一个数字N,输出N个点的森林的数量.点有标号. 森林是一种无向图,要求图中不能存在 ...

  2. http 与 TCP 与 socket 定义,区别

    http://blog.csdn.net/jenminzhang/article/details/47017741 http协议:处于互联网协议的应用层,角色是规定数据传输的格式,http是建立在so ...

  3. 解决maven项目中有小红叉的问题

    首先在window--perferences--showview中显示problems中查看出错的原因

  4. MySql8最新配置方式(完美)

    下载MYSQL8 地址:https://www.mysql.com/downloads/ 1.滑动网页到最下面,选择Community (GPL) Downloads » 2.选择MySQL Comm ...

  5. P3800 Power收集

    传送门 DP每次向下一格,显然是DP方程也十分显然:设$f[i][j]$为到第$i$行第$j$列时能得到的最大价值显然$f[i][j]=max(f[i-1][k]+v[i][j]),( max(0,j ...

  6. HDU 1565 方格取数(简单状态压缩DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=1565 对于每一个数,取或者不取,用0表示不取,1表示取,那么对于每一行的状态,就可以用一个二进制的数来表示.比如 ...

  7. day22 正则表达式 re

    1. 正则表达式 正则表达式是对字符串操作的一种逻辑公式. 我们一般使用正则表达式对字符串进行匹配和过滤. 工具: 各大文本编辑器⼀般都有正则匹配功能. 我们也可以去http://tool.china ...

  8. Appium自动化—浅谈iOS自动化测试环境搭建

    在日常的测试工作中,我们会发现有些测试工作重复率极高,测试人员需要花费大量的时间进行这些重复性的测试,浪费了大量的人力与时间.若能够将常用的测试场景进行自动化,那必定能节省许多的人力与时间.作为一个初 ...

  9. 阿里云 Ubuntu16.04 部署 LAMP

    1.更新软件源 sudo apt-get update 2.安装Apache sudo apt-get install apache2 3.查看Apache是否安装成功 apache2 –v 如下所示 ...

  10. Spring实现AOP

    转载: https://blog.csdn.net/tolcf/article/details/49133119 [框架][Spring]XML配置实现AOP拦截-切点:JdkRegexpMethod ...