anais-apk-forensic 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +249 -0
  3. package/anais.sh +669 -0
  4. package/analysis_tools/__pycache__/apk_basic_info.cpython-313.pyc +0 -0
  5. package/analysis_tools/__pycache__/apk_basic_info.cpython-314.pyc +0 -0
  6. package/analysis_tools/__pycache__/check_zip_encryption.cpython-313.pyc +0 -0
  7. package/analysis_tools/__pycache__/check_zip_encryption.cpython-314.pyc +0 -0
  8. package/analysis_tools/__pycache__/detect_obfuscation.cpython-313.pyc +0 -0
  9. package/analysis_tools/__pycache__/detect_obfuscation.cpython-314.pyc +0 -0
  10. package/analysis_tools/__pycache__/dex_payload_hunter.cpython-314.pyc +0 -0
  11. package/analysis_tools/__pycache__/entropy_analyzer.cpython-314.pyc +0 -0
  12. package/analysis_tools/__pycache__/error_logger.cpython-313.pyc +0 -0
  13. package/analysis_tools/__pycache__/error_logger.cpython-314.pyc +0 -0
  14. package/analysis_tools/__pycache__/find_encrypted_payload.cpython-314.pyc +0 -0
  15. package/analysis_tools/__pycache__/fix_apk_headers.cpython-313.pyc +0 -0
  16. package/analysis_tools/__pycache__/fix_apk_headers.cpython-314.pyc +0 -0
  17. package/analysis_tools/__pycache__/manifest_analyzer.cpython-313.pyc +0 -0
  18. package/analysis_tools/__pycache__/manifest_analyzer.cpython-314.pyc +0 -0
  19. package/analysis_tools/__pycache__/network_analyzer.cpython-313.pyc +0 -0
  20. package/analysis_tools/__pycache__/network_analyzer.cpython-314.pyc +0 -0
  21. package/analysis_tools/__pycache__/report_generator.cpython-313.pyc +0 -0
  22. package/analysis_tools/__pycache__/report_generator.cpython-314.pyc +0 -0
  23. package/analysis_tools/__pycache__/report_generator_modular.cpython-314.pyc +0 -0
  24. package/analysis_tools/__pycache__/sast_scanner.cpython-313.pyc +0 -0
  25. package/analysis_tools/__pycache__/sast_scanner.cpython-314.pyc +0 -0
  26. package/analysis_tools/__pycache__/so_string_analyzer.cpython-314.pyc +0 -0
  27. package/analysis_tools/__pycache__/yara_enhanced_analyzer.cpython-314.pyc +0 -0
  28. package/analysis_tools/__pycache__/yara_results_processor.cpython-314.pyc +0 -0
  29. package/analysis_tools/apk_basic_info.py +85 -0
  30. package/analysis_tools/check_zip_encryption.py +142 -0
  31. package/analysis_tools/detect_obfuscation.py +650 -0
  32. package/analysis_tools/dex_payload_hunter.py +734 -0
  33. package/analysis_tools/entropy_analyzer.py +335 -0
  34. package/analysis_tools/error_logger.py +75 -0
  35. package/analysis_tools/find_encrypted_payload.py +485 -0
  36. package/analysis_tools/fix_apk_headers.py +154 -0
  37. package/analysis_tools/manifest_analyzer.py +214 -0
  38. package/analysis_tools/network_analyzer.py +287 -0
  39. package/analysis_tools/report_generator.py +506 -0
  40. package/analysis_tools/report_generator_modular.py +885 -0
  41. package/analysis_tools/sast_scanner.py +412 -0
  42. package/analysis_tools/so_string_analyzer.py +406 -0
  43. package/analysis_tools/yara_enhanced_analyzer.py +330 -0
  44. package/analysis_tools/yara_results_processor.py +368 -0
  45. package/analyzer_config.json +113 -0
  46. package/apkid/__init__.py +32 -0
  47. package/apkid/__pycache__/__init__.cpython-313.pyc +0 -0
  48. package/apkid/__pycache__/__init__.cpython-314.pyc +0 -0
  49. package/apkid/__pycache__/apkid.cpython-313.pyc +0 -0
  50. package/apkid/__pycache__/apkid.cpython-314.pyc +0 -0
  51. package/apkid/__pycache__/main.cpython-313.pyc +0 -0
  52. package/apkid/__pycache__/main.cpython-314.pyc +0 -0
  53. package/apkid/__pycache__/output.cpython-313.pyc +0 -0
  54. package/apkid/__pycache__/rules.cpython-313.pyc +0 -0
  55. package/apkid/apkid.py +266 -0
  56. package/apkid/main.py +98 -0
  57. package/apkid/output.py +177 -0
  58. package/apkid/rules/apk/common.yara +68 -0
  59. package/apkid/rules/apk/obfuscators.yara +118 -0
  60. package/apkid/rules/apk/packers.yara +1197 -0
  61. package/apkid/rules/apk/protectors.yara +301 -0
  62. package/apkid/rules/dex/abnormal.yara +104 -0
  63. package/apkid/rules/dex/anti-vm.yara +568 -0
  64. package/apkid/rules/dex/common.yara +60 -0
  65. package/apkid/rules/dex/compilers.yara +434 -0
  66. package/apkid/rules/dex/obfuscators.yara +602 -0
  67. package/apkid/rules/dex/packers.yara +761 -0
  68. package/apkid/rules/dex/protectors.yara +520 -0
  69. package/apkid/rules/dll/common.yara +38 -0
  70. package/apkid/rules/dll/obfuscators.yara +43 -0
  71. package/apkid/rules/elf/anti-vm.yara +43 -0
  72. package/apkid/rules/elf/common.yara +54 -0
  73. package/apkid/rules/elf/obfuscators.yara +991 -0
  74. package/apkid/rules/elf/packers.yara +1128 -0
  75. package/apkid/rules/elf/protectors.yara +794 -0
  76. package/apkid/rules/res/common.yara +43 -0
  77. package/apkid/rules/res/obfuscators.yara +46 -0
  78. package/apkid/rules/res/protectors.yara +46 -0
  79. package/apkid/rules.py +77 -0
  80. package/bin/anais +3 -0
  81. package/dist/cli.js +82 -0
  82. package/dist/index.js +123 -0
  83. package/dist/types/index.js +2 -0
  84. package/dist/utils/index.js +21 -0
  85. package/dist/utils/output.js +44 -0
  86. package/dist/utils/paths.js +107 -0
  87. package/docs/ARCHITECTURE.txt +353 -0
  88. package/docs/Workflow and Reference.md +445 -0
  89. package/package.json +70 -0
  90. package/rules/yara_general_rules.yar +323 -0
  91. package/scripts/dynamic_analysis_helper.sh +334 -0
  92. package/scripts/frida/dpt_dex_dumper.js +145 -0
  93. package/scripts/frida/frida_dex_dump.js +145 -0
  94. package/scripts/frida/frida_hooks.js +437 -0
  95. package/scripts/frida/frida_websocket_extractor.js +154 -0
  96. package/scripts/setup.sh +206 -0
  97. package/scripts/validate_framework.sh +224 -0
  98. package/src/cli.ts +91 -0
  99. package/src/index.ts +123 -0
  100. package/src/types/index.ts +44 -0
  101. package/src/utils/index.ts +6 -0
  102. package/src/utils/output.ts +50 -0
  103. package/src/utils/paths.ts +72 -0
  104. package/tsconfig.json +14 -0
@@ -0,0 +1,1128 @@
1
+ /*
2
+ * Copyright (C) 2023 RedNaga. https://rednaga.io
3
+ * All rights reserved. Contact: rednaga@protonmail.com
4
+ *
5
+ *
6
+ * This file is part of APKiD
7
+ *
8
+ *
9
+ * Commercial License Usage
10
+ * ------------------------
11
+ * Licensees holding valid commercial APKiD licenses may use this file
12
+ * in accordance with the commercial license agreement provided with the
13
+ * Software or, alternatively, in accordance with the terms contained in
14
+ * a written agreement between you and RedNaga.
15
+ *
16
+ *
17
+ * GNU General Public License Usage
18
+ * --------------------------------
19
+ * Alternatively, this file may be used under the terms of the GNU General
20
+ * Public License version 3.0 as published by the Free Software Foundation
21
+ * and appearing in the file LICENSE.GPL included in the packaging of this
22
+ * file. Please visit http://www.gnu.org/copyleft/gpl.html and review the
23
+ * information to ensure the GNU General Public License version 3.0
24
+ * requirements will be met.
25
+ *
26
+ **/
27
+
28
+ import "elf"
29
+ include "common.yara"
30
+ include "../apk/packers.yara"
31
+
32
+ private rule upx_elf32_arm_stub : packer
33
+ {
34
+ meta:
35
+ description = "Contains a UPX ARM stub"
36
+
37
+ strings:
38
+ $UPX_STUB = { 1E 20 A0 E3 14 10 8F E2 02 00 A0 E3 04 70 A0 E3 00 00 00 EF 7F 00 A0 E3 01 70 A0 E3 00 00 00 EF }
39
+
40
+ condition:
41
+ elf.machine == elf.EM_ARM and $UPX_STUB
42
+ }
43
+
44
+ private rule upx_stub : packer
45
+ {
46
+ meta:
47
+ description = "Contains a UPX stub"
48
+
49
+ condition:
50
+ upx_elf32_arm_stub
51
+ }
52
+
53
+ private rule upx_unmodified : packer
54
+ {
55
+ meta:
56
+ description = "Contains an unmodified UPX stub"
57
+
58
+ strings:
59
+ $upx = "UPX!"
60
+
61
+ condition:
62
+ $upx in (0..200) and $upx in (filesize - 50 .. filesize) and upx_elf32_arm_stub
63
+ }
64
+
65
+ rule upx_sharedlib_unmodifed : packer
66
+ {
67
+ meta:
68
+ description = "sharelib UPX"
69
+
70
+ strings:
71
+ $upx = "UPX!"
72
+
73
+ condition:
74
+ elf.type == elf.ET_DYN
75
+ and $upx in (filesize - 50 .. filesize) and upx_stub
76
+ }
77
+
78
+ rule upx_elf_3_94 : packer
79
+ {
80
+ meta:
81
+ description = "UPX 3.94 (unmodified)"
82
+
83
+ strings:
84
+ $copyright = "UPX 3.94 Copyright"
85
+
86
+ condition:
87
+ upx_unmodified and $copyright
88
+ }
89
+
90
+ rule upx_elf_3_93 : packer
91
+ {
92
+ meta:
93
+ description = "UPX 3.93 (unmodified)"
94
+
95
+ strings:
96
+ $copyright = "UPX 3.93 Copyright"
97
+
98
+ condition:
99
+ upx_unmodified and $copyright
100
+ }
101
+
102
+ // Fixes included for Android shared libs
103
+ rule upx_elf_3_92 : packer
104
+ {
105
+ meta:
106
+ description = "UPX 3.92 (unmodified)"
107
+
108
+ strings:
109
+ $copyright = "UPX 3.92 Copyright"
110
+
111
+ condition:
112
+ upx_unmodified and $copyright
113
+ }
114
+
115
+ rule upx_elf_3_91 : packer
116
+ {
117
+ meta:
118
+ description = "UPX 3.91 (unmodified)"
119
+
120
+ strings:
121
+ $copyright = "UPX 3.91 Copyright"
122
+
123
+ condition:
124
+ upx_unmodified and $copyright
125
+ }
126
+
127
+ rule upx_elf_3_09 : packer
128
+ {
129
+ meta:
130
+ description = "UPX 3.09 (unmodified)"
131
+
132
+ strings:
133
+ $copyright = "UPX 3.09 Copyright"
134
+
135
+ condition:
136
+ upx_unmodified and $copyright
137
+ }
138
+
139
+ rule upx_elf_3_08 : packer
140
+ {
141
+ meta:
142
+ description = "UPX 3.08 (unmodified)"
143
+
144
+ strings:
145
+ $copyright = "UPX 3.08 Copyright"
146
+
147
+ condition:
148
+ upx_unmodified and $copyright
149
+ }
150
+
151
+ rule upx_elf_3_07 : packer
152
+ {
153
+ meta:
154
+ description = "UPX 3.07 (unmodified)"
155
+
156
+ strings:
157
+ $copyright = "UPX 3.07 Copyright"
158
+
159
+ condition:
160
+ upx_unmodified and $copyright
161
+ }
162
+
163
+ rule upx_elf_3_04 : packer
164
+ {
165
+ meta:
166
+ description = "UPX 3.04 (unmodified)"
167
+
168
+ strings:
169
+ $copyright = "UPX 3.04 Copyright"
170
+
171
+ condition:
172
+ upx_unmodified and $copyright
173
+ }
174
+
175
+ rule upx_elf_3_03 : packer
176
+ {
177
+ meta:
178
+ description = "UPX 3.03 (unmodified)"
179
+
180
+ strings:
181
+ $copyright = "UPX 3.03 Copyright"
182
+
183
+ condition:
184
+ upx_unmodified and $copyright
185
+ }
186
+
187
+ rule upx_elf_3_02 : packer
188
+ {
189
+ meta:
190
+ description = "UPX 3.02 (unmodified)"
191
+
192
+ strings:
193
+ $copyright = "UPX 3.02 Copyright"
194
+
195
+ condition:
196
+ upx_unmodified and $copyright
197
+ }
198
+
199
+ rule upx_elf_3_01 : packer
200
+ {
201
+ meta:
202
+ description = "UPX 3.01 (unmodified)"
203
+
204
+ strings:
205
+ $copyright = "UPX 3.01 Copyright"
206
+
207
+ condition:
208
+ upx_unmodified and $copyright
209
+ }
210
+
211
+ rule upx_elf_bangcle_secneo : packer
212
+ {
213
+ meta:
214
+ description = "Bangcle/SecNeo (UPX)"
215
+
216
+ strings:
217
+ // They replace UPX! with SEC!
218
+ $sec = "SEC!"
219
+
220
+ condition:
221
+ $sec in (0..200) and $sec in (filesize - 50 .. filesize) and upx_stub
222
+ }
223
+
224
+ rule upx_elf_bangcle_secneo_newer : packer
225
+ {
226
+ meta:
227
+ description = "newer-style Bangcle/SecNeo (UPX)"
228
+
229
+ strings:
230
+ // They replace UPX! with \x03\x02\x01\x00
231
+ $TTO = { 03 02 01 00 }
232
+
233
+ condition:
234
+ $TTO in (filesize - 50 .. filesize) and upx_stub
235
+ }
236
+
237
+ rule upx_elf_ijiami : packer
238
+ {
239
+ meta:
240
+ description = "Ijiami (UPX)"
241
+
242
+ strings:
243
+ // They replace UPX! with AJM!
244
+ $ajm = "AJM!"
245
+
246
+ condition:
247
+ $ajm in (filesize - 50 .. filesize) and upx_stub
248
+ }
249
+
250
+ rule upx_elf_joker : packer
251
+ {
252
+ meta:
253
+ description = "Joker (UPX)"
254
+ sample = "2de03bc5fc110a3bb2e6f4d6d6e558052b5cae3cb117a1a8c2be08576be0ed58"
255
+
256
+ strings:
257
+ // They replace UPX! with ZHSH or TIW°
258
+ $rename1 = "ZHSH"
259
+ // TIW°
260
+ $rename2 = { 54 49 57 B0 }
261
+
262
+ condition:
263
+ ($rename1 in (filesize - 50 .. filesize)) or
264
+ ($rename2 in (filesize - 50 .. filesize))
265
+ and upx_stub
266
+ }
267
+
268
+ private rule upx_unknown_version : packer
269
+ {
270
+ meta:
271
+ description = "UPX (unknown)"
272
+
273
+ condition:
274
+ upx_stub
275
+ // We could extend this for more comprehensive rules, however lower versions than this should not be
276
+ // appears on arm/android devices
277
+ and not (upx_elf_3_01 or upx_elf_3_02 or upx_elf_3_03 or upx_elf_3_04 or upx_elf_3_07 or upx_elf_3_08 or upx_elf_3_09 or upx_elf_3_91 or upx_elf_3_92 or upx_elf_3_93 or upx_elf_3_94)
278
+ and not (upx_elf_ijiami or upx_elf_joker or upx_elf_bangcle_secneo or upx_elf_bangcle_secneo_newer)
279
+ }
280
+
281
+ rule upx_embedded_inside_elf : packer dropper
282
+ {
283
+ meta:
284
+ description = "UPX packed ELF embedded in ELF"
285
+
286
+ strings:
287
+ $elf_magic = { 7F 45 4C 46 }
288
+
289
+ condition:
290
+ $elf_magic at 0 and $elf_magic in (256..filesize)
291
+ and upx_unknown_version
292
+ and not upx_unmodified
293
+ and not upx_sharedlib_unmodifed
294
+ }
295
+
296
+ rule upx_unknown_version_modified : packer
297
+ {
298
+ meta:
299
+ description = "UPX (unknown, modified)"
300
+
301
+ condition:
302
+ upx_unknown_version
303
+ and not is_apk
304
+ and not upx_unmodified
305
+ and not bangcle
306
+ and not upx_elf_bangcle_secneo
307
+ and not upx_elf_bangcle_secneo_newer
308
+ and not upx_elf_ijiami
309
+ and not upx_elf_joker
310
+ and not ijiami
311
+ and not upx_sharedlib_unmodifed
312
+ and not upx_embedded_inside_elf
313
+ }
314
+
315
+ rule upx_compressed_apk : packer embedded
316
+ {
317
+ meta:
318
+ description = "UPX packed ELF embedded in APK"
319
+
320
+ condition:
321
+ upx_unknown_version and
322
+ is_apk and
323
+ not (upx_unmodified or ijiami or bangcle or jiagu)
324
+ }
325
+
326
+ rule upx_unknown_version_unmodified : packer
327
+ {
328
+ meta:
329
+ description = "UPX (unknown, unmodified)"
330
+
331
+ condition:
332
+ upx_unknown_version and
333
+ upx_unmodified and
334
+ not upx_compressed_apk
335
+ }
336
+
337
+ rule promon : packer
338
+ {
339
+ meta:
340
+ description = "Promon Shield"
341
+ url = "https://promon.co/"
342
+ sample = "6a3352f54d9f5199e4bf39687224e58df642d1d91f1d32b069acd4394a0c4fe0"
343
+ sample2 = "0ef06e0b1511872e711cf3e8e53fee097d13755c9572cfea6d153d708906f45d"
344
+ author = "Eduardo Novella"
345
+
346
+ strings:
347
+ // Library names
348
+ $libshield = "libshield.so"
349
+ $rnd_libname = /lib[a-z]{10,12}\.so/ // libchhjkikihfch.so || libgiompappkhnb.so
350
+
351
+ /**
352
+ Odd ELF segments found:
353
+ .ncc -> Code segment
354
+ .ncd -> Data segment
355
+ .ncu -> Another segment
356
+ */
357
+
358
+ condition:
359
+ is_elf and ($libshield or $rnd_libname) and
360
+ ( // Match at least two section names from .ncu, .ncc, .ncd
361
+ (for any i in (0..elf.number_of_sections): (elf.sections[i].name matches /\.ncu/)
362
+ and for any i in (0..elf.number_of_sections): (elf.sections[i].name matches /\.ncc/)) or
363
+ (for any i in (0..elf.number_of_sections): (elf.sections[i].name matches /\.ncu/)
364
+ and for any i in (0..elf.number_of_sections): (elf.sections[i].name matches /\.ncd/)) or
365
+ (for any i in (0..elf.number_of_sections): (elf.sections[i].name matches /\.ncc/)
366
+ and for any i in (0..elf.number_of_sections): (elf.sections[i].name matches /\.ncd/))
367
+ )
368
+ }
369
+
370
+ rule promon_a : packer
371
+ {
372
+ meta:
373
+ description = "Promon Shield"
374
+ url = "https://promon.co/"
375
+ sample = "77df1956a6842a4e5db65bb9758e46d61eda3592905d3576736b276907b4651b" // com.starfinanz.mobile.android.pushtan
376
+ author = "Eduardo Novella"
377
+
378
+ /**
379
+ Odd ELF segments found:
380
+ .ncc -> Code segment
381
+ .ncd -> Data segment
382
+ .ncu -> Another segment
383
+ */
384
+
385
+ condition:
386
+ is_elf and not promon and
387
+ ( // Match at least two section names from .ncu, .ncc, .ncd
388
+ (for any i in (0..elf.number_of_sections): (elf.sections[i].name matches /\.ncu/)
389
+ and for any i in (0..elf.number_of_sections): (elf.sections[i].name matches /\.ncc/)) or
390
+ (for any i in (0..elf.number_of_sections): (elf.sections[i].name matches /\.ncu/)
391
+ and for any i in (0..elf.number_of_sections): (elf.sections[i].name matches /\.ncd/)) or
392
+ (for any i in (0..elf.number_of_sections): (elf.sections[i].name matches /\.ncc/)
393
+ and for any i in (0..elf.number_of_sections): (elf.sections[i].name matches /\.ncd/))
394
+ )
395
+ }
396
+
397
+ rule appsealing_core_2_10_10 : packer
398
+ {
399
+ meta:
400
+ description = "AppSealing CORE VERSION 2.10.10"
401
+ url = "https://www.appsealing.com/"
402
+ sample = "61a983b032aee2e56159e682ad1588ad30fa8c3957bf849d1afe6f10e1d9645d"
403
+ author = "zeroload"
404
+
405
+ strings:
406
+ $core_ver = "APPSEALING-CORE-VERSION_2.10.10"
407
+
408
+ condition:
409
+ is_elf and $core_ver
410
+ }
411
+
412
+ rule appsuit_packer_a : packer
413
+ {
414
+ meta:
415
+ description = "AppSuit"
416
+ url = "http://www.stealien.com/appsuit.html"
417
+ sample = "3bcb66444b43d1a225ac2dd59387b8aa2ce921b0595708d65753eef6b0ef2165"
418
+ author = "Eduardo Novella"
419
+
420
+ strings:
421
+ $native_lib1 = { 00 6c6962417070537569742e736f 00 } // \0libAppSuit.so\0
422
+ $native_lib2 = { 00 6c6962556e7061636b65722e736f 00 } // \0libUnpacker.so\0
423
+
424
+ condition:
425
+ is_elf and all of them
426
+ }
427
+
428
+ rule tencent_elf : packer
429
+ {
430
+ meta:
431
+ description = "Mobile Tencent Protect"
432
+ url = "https://intl.cloud.tencent.com/product/mtp"
433
+ sample = "7c6024abc61b184ddcc9fa49f9fac1a7e5568d1eab09ee748f8c4987844a3f81"
434
+
435
+ strings:
436
+ // getenv liblog.so libz.so libdl.so libc.so libshell.so
437
+ $libs = {
438
+ 00 67 65 74 65 6E 76 00 6C 69 62 6C 6F 67 2E 73 6F 00 6C 69 62 7A 2E
439
+ 73 6F 00 6C 69 62 64 6C 2E 73 6F 00 6C 69 62 63 2E 73 6F 00 6C 69 62
440
+ 73 68 65 6C 6C 2E 73 6F 00
441
+ }
442
+
443
+ condition:
444
+ is_elf
445
+ and any of them
446
+ }
447
+
448
+ rule tencent_legu_VMP_elf : packer
449
+ {
450
+ meta:
451
+ description = "Tencent's Legu (VMP)"
452
+ url = "https://github.com/rednaga/APKiD/issues/390"
453
+ sample = "95ca638cfb80ebbb21e97c202f9c06f7306c6fc9696b4760a401afa9293000f7" // com.youwan.aoao v2.9.2
454
+ author = "Eduardo Novella"
455
+
456
+ strings:
457
+ $lib = { 00 6c69 6278 6756 6970 5365 6375 7269 7479 2e73 6f00 } // .libxgVipSecurity.so.
458
+
459
+ condition:
460
+ is_elf and all of them
461
+ }
462
+
463
+ rule tongfu_shield_elf : packer
464
+ {
465
+ meta:
466
+ description = "Tongfu shield"
467
+ url = "https://www.tongfudun.com"
468
+ url2 = "https://www.payegis.com/"
469
+ sample = "af27533557a47ff6795b0df77ea863bbefafa4974ce2dbf9604a79ce7196d080" // com.kingdee.zhihuiji v6.25.22
470
+ author = "Eduardo Novella"
471
+
472
+ strings:
473
+ $libname = { 00 6c69 6265 6769 732e 736f 00 } // .libegis.so.
474
+ $asset = { 6173 7365 7473 2f6c 6962 6567 6973 2e61 00 } // assets/libegis.a.
475
+ $class = { 00 636f 6d2f 7061 7965 6769 732f 4669
476
+ 7273 7441 7070 6c69 6361 7469 6f6e 00 } // .com/payegis/FirstApplication.
477
+
478
+ condition:
479
+ is_elf and any of them
480
+ }
481
+
482
+ rule crackproof : packer
483
+ {
484
+ meta:
485
+ description = "CrackProof"
486
+ url = "https://www.hypertech.co.jp/eng/"
487
+ sample = "312243d9133ced054a850fa933d1f62adb717a232b79469ab2f58be77c9377a4"
488
+ samples = "https://koodous.com/rulesets/5244/apks"
489
+ author = "Eduardo Novella"
490
+
491
+ strings:
492
+ /**
493
+ int __fastcall j_do_asm_syscall(int svc_nr, void *a2, void *a3, void *a4, void *a5, void *a6, void *a7)
494
+ {
495
+ int r; // r0
496
+
497
+ r = do_asm_syscall(a2, a3, a4, a5, a6, a7, 0, svc_nr);
498
+ return sub_4D78C(svc_nr, r);
499
+ }
500
+ */
501
+ $j_do_asm_syscall = {
502
+ 00 48 2D E9 // PUSH {R11,LR}
503
+ 04 B0 8D E2 // ADD R11, SP, #4
504
+ 28 D0 4D E2 // SUB SP, SP, #0x28
505
+ 10 00 0B E5 // STR R0, [R11,#var_10]
506
+ 14 10 0B E5 // STR R1, [R11,#a1]
507
+ 18 20 0B E5 // STR R2, [R11,#a2]
508
+ 1C 30 0B E5 // STR R3, [R11,#a3]
509
+ 00 30 A0 E3 // MOV R3, #0
510
+ 08 30 0B E5 // STR R3, [R11,#r]
511
+ 08 30 9B E5 // LDR R3, [R11,#a6]
512
+ 00 30 8D E5 // STR R3, [SP,#0x2C+var_2C] ; a5
513
+ 0C 30 9B E5 // LDR R3, [R11,#a7]
514
+ 04 30 8D E5 // STR R3, [SP,#0x2C+var_28] ; a6
515
+ 00 30 A0 E3 // MOV R3, #0
516
+ 08 30 8D E5 // STR R3, [SP,#0x2C+var_24] ; a7
517
+ 10 30 1B E5 // LDR R3, [R11,#var_10]
518
+ 0C 30 8D E5 // STR R3, [SP,#0x2C+svc_nr] ; svc_nr
519
+ 14 00 1B E5 // LDR R0, [R11,#a1] ; a1
520
+ 18 10 1B E5 // LDR R1, [R11,#a2] ; a2
521
+ 1C 20 1B E5 // LDR R2, [R11,#a3] ; a3
522
+ 04 30 9B E5 // LDR R3, [R11,#a5] ; a4
523
+ ?? ?? ?? EB // BL do_asm_syscall
524
+ 00 30 A0 E1 // MOV R3, R0
525
+ 08 30 0B E5 // STR R3, [R11,#r]
526
+ 08 30 1B E5 // LDR R3, [R11,#r]
527
+ 10 00 1B E5 // LDR R0, [R11,#var_10] ; svc_nr
528
+ 03 10 A0 E1 // MOV R1, R3 ; r
529
+ ?? ?? ?? EB // BL sub_4D78C
530
+ 00 30 A0 E1 // MOV R3, R0
531
+ 08 30 0B E5 // STR R3, [R11,#r]
532
+ 08 30 1B E5 // LDR R3, [R11,#r]
533
+ 03 00 A0 E1 // MOV R0, R3
534
+ 04 D0 4B E2 // SUB SP, R11, #4
535
+ 00 88 BD E8 // POP {R11,PC}
536
+ }
537
+
538
+ /**
539
+ int __fastcall do_asm_syscall(void *a1, void *a2, void *a3, void *a4, void *a5, void *a6, void *a7, int svc_nr)
540
+ {
541
+ return linux_eabi_syscall(svc_nr, a1, a2, a3, a4, a5, a6, a7);
542
+ }
543
+ */
544
+ $do_asm_syscall = {
545
+ FE 4F 2D E9 // PUSH {R1-R11,LR}
546
+ 2C B0 8D E2 // ADD R11, SP, #0x2C
547
+ 04 40 9B E5 // LDR R4, [R11,#a5]
548
+ 08 50 9B E5 // LDR R5, [R11,#a6]
549
+ 0C 60 9B E5 // LDR R6, [R11,#a7]
550
+ 10 70 9B E5 // LDR R7, [R11,#svc_nr]
551
+ 00 00 00 EF // SVC 0
552
+ FE 8F BD E8 // POP {R1-R11,PC}
553
+ }
554
+
555
+ condition:
556
+ is_elf and all of them
557
+ }
558
+
559
+ rule crackproof_a : packer
560
+ {
561
+ meta:
562
+ description = "CrackProof"
563
+ url = "https://www.hypertech.co.jp/eng/"
564
+ sample = "a296f4c1d48b830bb26c6ca7f2889e47756fb4adf0dd86d193a8b60d3bc4ae7d"
565
+ author = "Eduardo Novella"
566
+
567
+ strings:
568
+ /**
569
+ __int64 __usercall init_proc@<X0>(a1@<X1>, a2@<X2>, a3@<X3>, a4@<X4>, a5@<X5>, a6@<X6>, a7@<X7>, a8@<X8>)
570
+ {
571
+ __int64 v9[30]; // [xsp+0h] [xbp-F0h] BYREF
572
+
573
+ v9[28] = a1;
574
+ v9[29] = a2;
575
+ v9[26] = a3;
576
+ v9[27] = a4;
577
+ v9[24] = a5;
578
+ v9[25] = a6;
579
+ v9[22] = a7;
580
+ v9[23] = a8;
581
+ return sub_7F4(v9);
582
+ }
583
+ */
584
+ $init_proc = {
585
+ E1 0B BF A9 // STP X1, X2, [SP,#var_10]!
586
+ E3 13 BF A9 // STP X3, X4, [SP,#0x10+var_20]!
587
+ E5 1B BF A9 // STP X5, X6, [SP,#0x20+var_30]!
588
+ E7 23 BF A9 // STP X7, X8, [SP,#0x30+var_40]!
589
+ E9 2B BF A9 // STP X9, X10, [SP,#0x40+var_50]!
590
+ EB 33 BF A9 // STP X11, X12, [SP,#0x50+var_60]!
591
+ ED 3B BF A9 // STP X13, X14, [SP,#0x60+var_70]!
592
+ EF 43 BF A9 // STP X15, X16, [SP,#0x70+var_80]!
593
+ F1 4B BF A9 // STP X17, X18, [SP,#0x80+var_90]!
594
+ F3 53 BF A9 // STP X19, X20, [SP,#0x90+var_A0]!
595
+ F5 5B BF A9 // STP X21, X22, [SP,#0xA0+var_B0]!
596
+ F7 63 BF A9 // STP X23, X24, [SP,#0xB0+var_C0]!
597
+ F9 6B BF A9 // STP X25, X26, [SP,#0xC0+var_D0]!
598
+ FB 73 BF A9 // STP X27, X28, [SP,#0xD0+var_E0]!
599
+ FD 7B BF A9 // STP X29, X30, [SP,#0xE0+var_F0]!
600
+ E0 03 00 91 // MOV X0, SP
601
+ ?? ?? ?? 97 // BL sub_7F4
602
+ FD 7B C1 A8 // LDP X29, X30, [SP+0xF0+var_F0],#0x10
603
+ FB 73 C1 A8 // LDP X27, X28, [SP+0xE0+var_E0],#0x10
604
+ F9 6B C1 A8 // LDP X25, X26, [SP+0xD0+var_D0],#0x10
605
+ F7 63 C1 A8 // LDP X23, X24, [SP+0xC0+var_C0],#0x10
606
+ F5 5B C1 A8 // LDP X21, X22, [SP+0xB0+var_B0],#0x10
607
+ F3 53 C1 A8 // LDP X19, X20, [SP+0xA0+var_A0],#0x10
608
+ F1 4B C1 A8 // LDP X17, X18, [SP+0x90+var_90],#0x10
609
+ EF 43 C1 A8 // LDP X15, X16, [SP+0x80+var_80],#0x10
610
+ ED 3B C1 A8 // LDP X13, X14, [SP+0x70+var_70],#0x10
611
+ EB 33 C1 A8 // LDP X11, X12, [SP+0x60+var_60],#0x10
612
+ E9 2B C1 A8 // LDP X9, X10, [SP+0x50+var_50],#0x10
613
+ E7 23 C1 A8 // LDP X7, X8, [SP+0x40+var_40],#0x10
614
+ E5 1B C1 A8 // LDP X5, X6, [SP+0x30+var_30],#0x10
615
+ E3 13 C1 A8 // LDP X3, X4, [SP+0x20+var_20],#0x10
616
+ E1 0B C1 A8 // LDP X1, X2, [SP+0x10+var_10],#0x10
617
+ C0 03 5F D6 // RET
618
+ }
619
+
620
+ /**
621
+ signed __int64 __fastcall do_asm_syscall(void *a1, void *a2, void *a3, void *a4, void *a5, void *a6, void *a7, signed __int64 svc_nr)
622
+ {
623
+ return linux_eabi_syscall(svc_nr, a1, a2, a3, a4, a5, a6, a7);
624
+ }
625
+ */
626
+ $do_asm_syscall = {
627
+ E1 0B BF A9 // STP X1, X2, [SP,#var_10]!
628
+ E3 13 BF A9 // STP X3, X4, [SP,#0x10+var_20]!
629
+ E5 1B BF A9 // STP X5, X6, [SP,#0x20+var_30]!
630
+ E7 23 BF A9 // STP X7, X8, [SP,#0x30+var_40]!
631
+ E9 7B BF A9 // STP X9, X30, [SP,#0x40+var_50]!
632
+ E8 03 07 AA // MOV X8, X7
633
+ 01 00 00 D4 // SVC 0
634
+ E9 7B C1 A8 // LDP X9, X30, [SP+0x50+var_50],#0x10
635
+ E7 23 C1 A8 // LDP X7, X8, [SP+0x40+var_40],#0x10
636
+ E5 1B C1 A8 // LDP X5, X6, [SP+0x30+var_30],#0x10
637
+ E3 13 C1 A8 // LDP X3, X4, [SP+0x20+var_20],#0x10
638
+ E1 0B C1 A8 // LDP X1, X2, [SP+0x10+var_10],#0x10
639
+ C0 03 5F D6 // RET
640
+ }
641
+
642
+ /**
643
+ v25 = j_asm_syscall(SYS_mprotect, v32, v29[6], 7LL, 0LL, 0LL, 0LL);
644
+ if ( v34 != 1 )
645
+ {
646
+ v10 = sub_4309D80();
647
+ v11 = -v25;
648
+ v12 = sub_430D114(v17);
649
+ v34 = sub_430E87C(0LL, 0LL, v10, 1LL, 181, 1LL, 5LL, v11, v17, v12);
650
+ }
651
+ */
652
+ $func1 = {
653
+ E2 03 00 2A // MOV W2, W0
654
+ E3 7F 94 B9 // LDRSW X3, [SP,#0x14C0+var_44]
655
+ 40 1C 80 D2 // MOV X0, #0xE2
656
+ 04 00 80 D2 // MOV X4, #0
657
+ 05 00 80 D2 // MOV X5, #0
658
+ 06 00 80 D2 // MOV X6, #0
659
+ ?? ?? ?? 94 // BL j_asm_syscall
660
+ }
661
+ $func2 = {
662
+ 00 00 80 D2 // MOV X0, #0
663
+ 01 00 80 D2 // MOV X1, #0
664
+ E2 03 14 2A // MOV W2, W20
665
+ 23 00 80 52 // MOV W3, #1
666
+ A4 16 80 52 // MOV W4, #0xB5
667
+ 25 00 80 52 // MOV W5, #1
668
+ A6 00 80 52 // MOV W6, #5
669
+ E7 03 13 2A // MOV W7, W19
670
+ ?? ?? ?? 94 // BL sub_430E87C
671
+ }
672
+
673
+ /**
674
+ sub_430E87C(0LL, 0LL, v13, 1u, 198u, 1u, 6u, 0, 0LL, 0);
675
+ */
676
+ $func3 = {
677
+ 00 00 80 D2 // MOV X0, #0
678
+ 01 00 80 D2 // MOV X1, #0
679
+ 23 00 80 52 // MOV W3, #1
680
+ C4 18 80 52 // MOV W4, #0xC6
681
+ 25 00 80 52 // MOV W5, #1
682
+ C6 00 80 52 // MOV W6, #6
683
+ 07 00 80 52 // MOV W7, #0
684
+ ?? ?? ?? 94 // BL sub_430E87C
685
+ }
686
+
687
+ /**
688
+ sub_430E87C(0LL, 0LL, v14, 1LL, 199LL, 1LL, 7LL, 0LL, 0LL, 0);
689
+ */
690
+ $func4 = {
691
+ 00 00 80 D2 // MOV X0, #0
692
+ 01 00 80 D2 // MOV X1, #0
693
+ 23 00 80 52 // MOV W3, #1
694
+ E4 18 80 52 // MOV W4, #0xC7
695
+ 25 00 80 52 // MOV W5, #1
696
+ E6 00 80 52 // MOV W6, #7
697
+ 07 00 80 52 // MOV W7, #0
698
+ ?? ?? ?? 94 // BL sub_430E87C
699
+ }
700
+
701
+ condition:
702
+ is_elf and $init_proc and $do_asm_syscall and 1 of ($func*)
703
+ }
704
+
705
+ rule jiagu_native : packer
706
+ {
707
+ meta:
708
+ description = "Jiagu"
709
+ sample = "3e83c34f496bd33457ca0a100c90ed229e2c1a9e39fdcaf5670d32455c5d051e"
710
+ url = "http://jiagu.360.cn/"
711
+ author = "Govind Sharma"
712
+
713
+ strings:
714
+ $a = "libz.so"
715
+ $b = "uncompress"
716
+ $c = "libjiagu"
717
+ $d = "JIAGU_APP_NAME"
718
+ $e = "JIAGU_SO_BASE_NAME"
719
+ $f = "JIAGU_ENCRYPTED_DEX_NAME"
720
+ $g = "JIAGU_HASH_FILE_NAME"
721
+
722
+ condition:
723
+ is_elf and ($a and $b and $c) and any of ($d, $e, $f, $g)
724
+ }
725
+
726
+ rule blackmod : packer
727
+ {
728
+ meta:
729
+ description = "BlackMod"
730
+ url = "https://blackmod.net/"
731
+ sample = "77b1ff2db51896a2c5a0b1a932283d757f5d2285a8c035d212af09d8d373441a"
732
+ author = "Eduardo Novella"
733
+
734
+ strings:
735
+ $libname = {00 6c6962626d742e736f 00} // libbmt.so
736
+ $jni_onload = {00 4a4e 495f 4f6e 4c6f 6164 00} // JNI_OnLoad
737
+
738
+ $svc_arm32 = {
739
+ // read_0 ; CODE XREF: j__xd
740
+ ?? 7? A0 E3 // MOV R7, #3 (read), #4 (write) & #0x142 (openat)
741
+ 00 00 00 EF // SVC 0
742
+ }
743
+
744
+ $svc_arm64 = {
745
+ ?8 0? 80 D2 // MOV X8, #63 (read), #64 (write), & #56 (openat)
746
+ 01 00 00 D4 // SVC 0
747
+ }
748
+
749
+ condition:
750
+ is_elf and 3 of them
751
+ }
752
+
753
+ rule _5play_ru : packer
754
+ {
755
+ meta:
756
+ description = "5play.ru"
757
+ url = "https://5play.ru"
758
+ sample = "b0db6d3a98a2e0e255380e5e04c9b461cc1aac06e9be29150318cf4cfbe06887"
759
+ author = "Eduardo Novella"
760
+
761
+ strings:
762
+ $libname = {00 6c69 6252 4d53 2e73 6f 00} // libRMS.so
763
+ $jni_onload = {00 4a4e 495f 4f6e 4c6f 6164 00} // JNI_OnLoad
764
+
765
+ $svc_arm32 = {
766
+ FF 5F 2D E9 // PUSH {R0-R12,LR}
767
+ 42 71 00 E3 // MOVW R7, #0x142
768
+ 01 20 A0 E1 // MOV R2, R1
769
+ 00 10 A0 E1 // MOV R1, R0
770
+ 63 00 E0 E3 // MOV R0, #0xFFFFFF9C
771
+ 00 00 00 EF // SVC 0
772
+ }
773
+
774
+ $svc_arm64 = {
775
+ 08 07 80 D2 // MOV X8, #56
776
+ E2 03 01 AA // MOV X2, X1
777
+ E1 03 00 AA // MOV X1, X0
778
+ 60 0C 80 12 // MOV W0, #0xFFFFFF9C
779
+ 01 00 00 D4 // SVC 0
780
+ }
781
+
782
+ condition:
783
+ is_elf and 3 of them
784
+ }
785
+
786
+ rule liapp_elf : packer
787
+ {
788
+ meta:
789
+ description = "LIAPP"
790
+ url = "https://liapp.lockincomp.com"
791
+ sample = "29b8c466148bcbe2ee4d1e9f1cc03ceb7e320cd19e7923e0c5a0b8a062758f0f" // com.teamblind.blind
792
+ author = "Eduardo Novella"
793
+
794
+ strings:
795
+ $libname = { 006c 6962 6c69 6170 702e 736f 00 } // libliapp.so
796
+
797
+ condition:
798
+ is_elf and all of them
799
+ }
800
+
801
+ rule eversafe_elf : packer
802
+ {
803
+ meta:
804
+ description = "Eversafe"
805
+ url = "https://everspin.global/products/solutions/eversafe-mobile"
806
+ sample = "00dbb346f3ae0540620eb120ccf00a65af81a07baed5adfdcd2fc620a33ed298"
807
+ author = "dustty0 & Eduardo Novella"
808
+
809
+ strings:
810
+ $lib = {
811
+ 006c 6962 6576 6572 7361 6665 2e73 6f00 // .libeversafe.so.
812
+ }
813
+
814
+ condition:
815
+ is_elf and any of them
816
+ }
817
+
818
+ rule aegis_elf : packer
819
+ {
820
+ meta:
821
+ description = "Aegis"
822
+ url = "https://androidrepublic.org"
823
+ sample = "4ca8c5f8ecfa1c36678b1745a2b58872e3f3f5fd14df6dd5fd65d6b8f2677f53"
824
+ author = "Yehh22 & Eduardo Novella"
825
+
826
+ strings:
827
+ $lib1 = { 00 6c69 6261 6567 6973 5f65 2e73 6f00 } // .libaegis_e.so
828
+ $lib2 = { 00 6c69 6261 6567 6973 5f65 5f61 726d 3634 2e73 6f00 } // .libaegis_e_arm64.so.
829
+ $lib3 = { 00 6c69 6261 6567 6973 5f65 5f78 3836 2e73 6f00 } // .libaegis_e_x86.so.
830
+ $url = "https://www.androidrepublic.org"
831
+
832
+ condition:
833
+ is_elf and 2 of them
834
+ }
835
+
836
+ rule appguard_elf : packer
837
+ {
838
+ meta:
839
+ description = "AppGuard"
840
+ url = "http://appguard.nprotect.com/en/index.html"
841
+ sample = "a6e9c876be2b8b936ab9bfe2699811524b8ad3c11305099b34194bb8aad79f1e"
842
+ sample2 = "23cd2af10d46459065ea65b2d40fb706fd4847a1f8ef195cbebf1c6d8d54a48a"
843
+ author = "Eduardo Novella"
844
+
845
+ strings:
846
+ $a = { 00 6C 69 62 41 70 70 47 75 61 72 64 2E 73 6F 00 } // .libAppGuard.so.
847
+ $b = { 00 23 4C 63 6F 6D 2F 69 6E 63 61 2F 73 65 63 75
848
+ 72 69 74 79 2F 41 70 70 47 75 61 72 64 2F 78 43
849
+ 6C 61 73 73 3B 00 } //.#Lcom/inca/security/AppGuard/xClass;.
850
+
851
+ condition:
852
+ is_elf and any of them
853
+ }
854
+
855
+ rule appguard_elf_b : packer
856
+ {
857
+ meta:
858
+ description = "AppGuard"
859
+ url = "http://appguard.nprotect.com/en/index.html"
860
+ sample = "94454b39eb50b677afec136b1eaea90895f07a735ae2801618baca16e6a2a19f"
861
+ author = "Moolakarapaiyan"
862
+
863
+ strings:
864
+ $a = { 00 6C 69 62 63 6F 6D 70 61 74 69 62 6C 65 2E 73 6F 00 } // libcompatible.so
865
+ $b = { 00 ?? 4C 63 6F 6D 2F 69 6E 63 61 2F 73 65 63 75
866
+ 72 69 74 79 2F 41 70 70 47 75 61 72 64 2F 78 43
867
+ 6C 61 73 73 3B 00 } // #Lcom/inca/security/AppGuard/xClass;
868
+
869
+ condition:
870
+ is_elf and any of them
871
+ }
872
+
873
+
874
+ rule dxshield_elf : packer
875
+ {
876
+ meta:
877
+ description = "DxShield"
878
+ url = "https://www.nshc.net/home/mobile-security/gxshield/"
879
+ sample = "64351853f9f1bcaa32598b6d2ecf97097a00989213defa31fb9b3abbba52a445" // com.wemade.nightcrowsglobal v1.0.28
880
+ author = "Eduardo Novella"
881
+
882
+ strings:
883
+ $lib = { 00 6C 69 62 64 78 62 61 73 65 2E 73 6F 00 4C 49 42 43 00 } // libdxbase.so
884
+
885
+ condition:
886
+ is_elf and all of them
887
+ }
888
+
889
+ rule zimperium_zshield : packer
890
+ {
891
+ meta:
892
+ description = "Zimperium (zShield)"
893
+ url = "https://www.zimperium.com/zshield"
894
+ sample = "9512c46d99cdca1914a9f86870aa1c49845701abe1c63365ba2681d658c19941" // com.dbs.dbspaylah v6.2.0
895
+ author = "Eduardo Novella"
896
+
897
+ strings:
898
+ /**
899
+ while ( linux_eabi_syscall(__NR_mprotect, v7, v203, 5) == -4 )
900
+
901
+ do
902
+ v96 = linux_eabi_syscall(v95, v218, v252, (void *)(int)(v91 + 209), v92, v93, v94, (void *)0xC4A0A48FLL);
903
+ while ( v96 == -4 );
904
+
905
+ do
906
+ v114 = (unsigned int *)linux_eabi_syscall(__NR_mmap, 0LL, v113, 3, 34, -1, 0LL);
907
+ while ( v114 == (unsigned int *)-4LL );
908
+ */
909
+ $svc = {
910
+ 01 00 00 D4 // SVC 0
911
+ 1F 10 00 B1 // CMN X0, #4
912
+ }
913
+
914
+ /**
915
+ void init_proc()
916
+ {
917
+ __int64 v0;
918
+
919
+ v0 = sub_F208();
920
+ __asm { BR X0 }
921
+ }
922
+ */
923
+ $init_proc = {
924
+ FE 77 BD A9 // STP X30, X29, [SP,#var_30]!
925
+ E0 07 01 A9 // STP X0, X1, [SP,#0x30+var_20]
926
+ E2 4F 02 A9 // STP X2, X19, [SP,#0x30+var_10]
927
+ ?? 00 00 94 // BL sub_F208
928
+ 00 00 1F D6 // BR X0
929
+ }
930
+
931
+ /**
932
+ while ( linux_eabi_syscall(__NR_mprotect, (void *)address, length, 5) == M_MMAP_MAX )
933
+ ;
934
+ ...
935
+ for ( i = 4 << (StatusReg & 0xF); v33 < v31; v33 += v32 )
936
+ __asm { DC CVAU, X13 }
937
+ __dsb(0xBu);
938
+ for ( j = address & -(__int64)i; j < v31; j += i )
939
+ __asm { IC IVAU, X12 }
940
+ __dsb(0xBu);
941
+ __isb(0xFu);
942
+ */
943
+ $asm_opcodes = {
944
+ ?? 7B 0B D5 // DC CVAU, X12
945
+ ?? ?? ?? 8B // ADD X12, X12, X11
946
+ ?? ?? ?? EB // CMP X12, X8
947
+ ?? ?? ?? 54 // B.CC loc_4A924
948
+ [4-32]
949
+ 9F 3B 03 D5 // DSB ISH
950
+ [4-64]
951
+ ?? 75 0B D5 // IC IVAU, X9
952
+ [4-32]
953
+ 9F 3B 03 D5 // DSB ISH
954
+ DF 3F 03 D5 // ISB
955
+ }
956
+
957
+ condition:
958
+ elf.machine == elf.EM_AARCH64 and all of them
959
+ }
960
+
961
+ rule zimperium_zshield_a : packer
962
+ {
963
+ meta:
964
+ description = "Zimperium (zShield)"
965
+ url = "https://www.zimperium.com/zshield"
966
+ sample = "967d78d489363eee74e86f1b3e2b04d5614dd1d50437ba36b0f898ad802f290d" // com.medtronic.diabetes.minimedmobile.eu
967
+ author = "Eduardo Novella"
968
+
969
+ strings:
970
+ /**
971
+ while ( linux_eabi_syscall(__NR_mprotect, v7, v203, 5) == -4 )
972
+
973
+ do
974
+ v96 = linux_eabi_syscall(v95, v218, v252, (void *)(int)(v91 + 209), v92, v93, v94, (void *)0xC4A0A48FLL);
975
+ while ( v96 == -4 );
976
+
977
+ do
978
+ v114 = (unsigned int *)linux_eabi_syscall(__NR_mmap, 0LL, v113, 3, 34, -1, 0LL);
979
+ while ( v114 == (unsigned int *)-4LL );
980
+ */
981
+ $svc = {
982
+ 01 00 00 D4 // SVC 0
983
+ 1F 10 00 B1 // CMN X0, #4
984
+ }
985
+
986
+ /**
987
+ do
988
+ v11 = linux_eabi_syscall(__NR_getpid);
989
+ while ( v11 == -4 );
990
+ do
991
+ v13 = linux_eabi_syscall(__NR_socket, 1, 0x80001, 0);
992
+ while ( v13 == -4 );
993
+ */
994
+ $inline_svc = {
995
+ E0 03 1F AA // MOV X0, XZR
996
+ 88 15 80 52 // MOV W8, #__NR_getpid
997
+ E1 03 1F AA // MOV X1, XZR
998
+ E2 03 1F AA // MOV X2, XZR
999
+ E3 03 1F AA // MOV X3, XZR
1000
+ E4 03 1F AA // MOV X4, XZR
1001
+ E5 03 1F AA // MOV X5, XZR
1002
+ 01 00 00 D4 // SVC 0
1003
+ 1F 10 00 B1 // CMN X0, #4
1004
+ [0-8] // B.EQ loc_197BDC
1005
+ E9 03 00 AA // MOV X9, X0
1006
+ 21 00 80 52 // MOV W1, #1
1007
+ 20 00 80 52 // MOV W0, #1
1008
+ C8 18 80 52 // MOV W8, #__NR_socket
1009
+ [4] // MOVK W1, #8,LSL#16
1010
+ E2 03 1F AA // MOV X2, XZR
1011
+ E3 03 1F AA // MOV X3, XZR
1012
+ E4 03 1F AA // MOV X4, XZR
1013
+ E5 03 1F AA // MOV X5, XZR
1014
+ 01 00 00 D4 // SVC 0
1015
+ 1F 10 00 B1 // CMN X0, #4
1016
+ }
1017
+
1018
+ /**
1019
+ case 26:
1020
+ v17 = v65 - 1922710401;
1021
+ v18 = v63 ^ 0x8D57AB8A;
1022
+ a4 = v64 - 2041001190;
1023
+ a5 = v64 + 1700658760;
1024
+ a6 = (void *)(v63 - 1055835315);
1025
+ v19 = (void *)(int)(v63 ^ 0x8D57ABBC);
1026
+ a2 = (int)(v65 - 1922710401);
1027
+ do
1028
+ {
1029
+ a3 = (__int64)v61;
1030
+ a1 = linux_eabi_syscall(v18, v19, (void *)v17, v61, (void *)a4, (void *)a5, a6, a7);
1031
+ }
1032
+ while ( a1 == -4 );
1033
+
1034
+ */
1035
+ $obf_svc = {
1036
+ ?? ?? ?? 93 // SXTW X9, W8
1037
+ ?? ?? ?? 93 // SXTW X1, W12
1038
+ ?? ?? ?? 93 // SXTW X8, W11
1039
+ [0-24]
1040
+ E0 03 09 AA // MOV X0, X9
1041
+ [0-8]
1042
+ 01 00 00 D4 // SVC 0
1043
+ 1F 10 00 B1 // CMN X0, #4
1044
+ }
1045
+
1046
+ condition:
1047
+ elf.machine == elf.EM_AARCH64 and ( $inline_svc or $obf_svc) and #svc > 50
1048
+ }
1049
+
1050
+ rule nesun_elf : packer
1051
+ {
1052
+ meta:
1053
+ description = "Nesun"
1054
+ url = "http://nesun.cn"
1055
+ sample = "13735b73994231e25393a1847e1111c9741cc112315b3f0d4f775a62ab58ae5d"
1056
+ author = "Abhi"
1057
+
1058
+ strings:
1059
+ $origin = { 00 2F 64 61 74 61 2F 64 61 74 61 2F 25 73 2F 2E 7A 70 72 6F 74 65 63 74 2F 25 73 2F 6F 72 69 67 69 6E 2E 61 70 6B 00 } // /data/data/%s/.zprotect/%s/origin.apk
1060
+ $data_path = { 00 2F 64 61 74 61 2F 64 61 74 61 2F 25 73 2F 2E 7A 70 72 6F 74 65 63 74 00 } // /data/data/%s/.zprotect
1061
+ $name = { 00 2E 7A 70 72 6F 74 65 63 74 00 } // .zprotect
1062
+ $lib = { 00 6C 69 62 7A 70 72 6F 74 65 63 74 2E 73 6F 00 } // libzprotect.so
1063
+
1064
+ condition:
1065
+ is_elf and any of them
1066
+ }
1067
+
1068
+ rule gpresto_elf : packer
1069
+ {
1070
+ meta:
1071
+ description = "G-Presto (anti-cheat)"
1072
+ url = "https://www.largosoft.co.kr/"
1073
+ sample = "44558c6c758b1ecf42ecda9981240d50c32f42e0d2be4693e37e39f8eb3a3488"
1074
+ author = "Abhi"
1075
+
1076
+ strings:
1077
+ $class = { 00 [0-2] 4C 63 6F 6D 2F 62 69 73 68 6F 70
1078
+ 73 6F 66 74 2F 50 72 65 73 74 6F 2F 53 44 4B
1079
+ 2F 50 72 65 73 74 6F 3B 00 } // .()Lcom/bishopsoft/Presto/SDK/Presto;.
1080
+ $name = { 00 6C 69 62 41 54 47 5F 4C 2E 73 6F 00 } // libATG_L.so
1081
+ $name2 = { (00 | 20) 47 2D 50 72 65 73 74 6F (20 | 00) } // G-Presto
1082
+ $name3 = "\x00<Presto_E>\x00"
1083
+ $name4 = "\x00largosoft.co.kr\x00"
1084
+
1085
+ condition:
1086
+ is_elf
1087
+ and $class
1088
+ and 2 of ($name*)
1089
+ }
1090
+
1091
+ rule kiwisec_elf : packer
1092
+ {
1093
+ meta:
1094
+ description = "KiwiSec"
1095
+ url = "https://en.kiwisec.com/"
1096
+ sample = "d108652bd1b685765e3ada2b7376e3c3ff67f8162afcf8bad91e0aef79b7b08a"
1097
+ author = "Abhi"
1098
+
1099
+ strings:
1100
+ $string = "\x00kiwi_dumper\x00"
1101
+ $string2 = "\x00libKwProtectSDK.so\x00"
1102
+ $string3 = "\x00libkwsdataenc.so\x00"
1103
+ $string4 = "\x00libkiwicrash.so\x00"
1104
+
1105
+ $class = { 00 63 6F 6D 2F 6B 69 77 69 73 65 63 2F 63 72 61 73
1106
+ 68 2F 4E 61 74 69 76 65 48 61 6E 64 6C 65 72 00 } // com/kiwisec/crash/NativeHandler
1107
+ $class2 = { 00 63 6F 6D 2F 6B 69 77 69 73 65 63 2F 63 72 61 73
1108
+ 68 2F 43 72 61 73 68 55 74 69 6C 73 00 } // com/kiwisec/crash/CrashUtils
1109
+
1110
+ condition:
1111
+ is_elf
1112
+ and any of them
1113
+ }
1114
+
1115
+ rule tso_trusteer_sdk : packer
1116
+ {
1117
+ meta:
1118
+ description = "Trusteer SDK (TSO) (to be verified!)"
1119
+ url = "https://www.ibm.com/products/trusteer-mobile-sdk"
1120
+ sample = "0cfebe91e6579b292c5ac58f0be6f129eff71f74282ccabb1c4578e341c01388" // uk.co.santander.santanderUK v5.18
1121
+ author = "Eduardo Novella"
1122
+
1123
+ condition:
1124
+ is_elf
1125
+ and for any i in (0..elf.number_of_segments): (elf.segments[i].type == elf.PT_LOAD)
1126
+ and for 2 i in (0..elf.number_of_sections):
1127
+ (elf.sections[i].name matches /(\.tsotext|\.tsodata|\.gnu\.version\_x|\.gnu\.version\_y)/)
1128
+ }