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.
- package/LICENSE +21 -0
- package/README.md +249 -0
- package/anais.sh +669 -0
- package/analysis_tools/__pycache__/apk_basic_info.cpython-313.pyc +0 -0
- package/analysis_tools/__pycache__/apk_basic_info.cpython-314.pyc +0 -0
- package/analysis_tools/__pycache__/check_zip_encryption.cpython-313.pyc +0 -0
- package/analysis_tools/__pycache__/check_zip_encryption.cpython-314.pyc +0 -0
- package/analysis_tools/__pycache__/detect_obfuscation.cpython-313.pyc +0 -0
- package/analysis_tools/__pycache__/detect_obfuscation.cpython-314.pyc +0 -0
- package/analysis_tools/__pycache__/dex_payload_hunter.cpython-314.pyc +0 -0
- package/analysis_tools/__pycache__/entropy_analyzer.cpython-314.pyc +0 -0
- package/analysis_tools/__pycache__/error_logger.cpython-313.pyc +0 -0
- package/analysis_tools/__pycache__/error_logger.cpython-314.pyc +0 -0
- package/analysis_tools/__pycache__/find_encrypted_payload.cpython-314.pyc +0 -0
- package/analysis_tools/__pycache__/fix_apk_headers.cpython-313.pyc +0 -0
- package/analysis_tools/__pycache__/fix_apk_headers.cpython-314.pyc +0 -0
- package/analysis_tools/__pycache__/manifest_analyzer.cpython-313.pyc +0 -0
- package/analysis_tools/__pycache__/manifest_analyzer.cpython-314.pyc +0 -0
- package/analysis_tools/__pycache__/network_analyzer.cpython-313.pyc +0 -0
- package/analysis_tools/__pycache__/network_analyzer.cpython-314.pyc +0 -0
- package/analysis_tools/__pycache__/report_generator.cpython-313.pyc +0 -0
- package/analysis_tools/__pycache__/report_generator.cpython-314.pyc +0 -0
- package/analysis_tools/__pycache__/report_generator_modular.cpython-314.pyc +0 -0
- package/analysis_tools/__pycache__/sast_scanner.cpython-313.pyc +0 -0
- package/analysis_tools/__pycache__/sast_scanner.cpython-314.pyc +0 -0
- package/analysis_tools/__pycache__/so_string_analyzer.cpython-314.pyc +0 -0
- package/analysis_tools/__pycache__/yara_enhanced_analyzer.cpython-314.pyc +0 -0
- package/analysis_tools/__pycache__/yara_results_processor.cpython-314.pyc +0 -0
- package/analysis_tools/apk_basic_info.py +85 -0
- package/analysis_tools/check_zip_encryption.py +142 -0
- package/analysis_tools/detect_obfuscation.py +650 -0
- package/analysis_tools/dex_payload_hunter.py +734 -0
- package/analysis_tools/entropy_analyzer.py +335 -0
- package/analysis_tools/error_logger.py +75 -0
- package/analysis_tools/find_encrypted_payload.py +485 -0
- package/analysis_tools/fix_apk_headers.py +154 -0
- package/analysis_tools/manifest_analyzer.py +214 -0
- package/analysis_tools/network_analyzer.py +287 -0
- package/analysis_tools/report_generator.py +506 -0
- package/analysis_tools/report_generator_modular.py +885 -0
- package/analysis_tools/sast_scanner.py +412 -0
- package/analysis_tools/so_string_analyzer.py +406 -0
- package/analysis_tools/yara_enhanced_analyzer.py +330 -0
- package/analysis_tools/yara_results_processor.py +368 -0
- package/analyzer_config.json +113 -0
- package/apkid/__init__.py +32 -0
- package/apkid/__pycache__/__init__.cpython-313.pyc +0 -0
- package/apkid/__pycache__/__init__.cpython-314.pyc +0 -0
- package/apkid/__pycache__/apkid.cpython-313.pyc +0 -0
- package/apkid/__pycache__/apkid.cpython-314.pyc +0 -0
- package/apkid/__pycache__/main.cpython-313.pyc +0 -0
- package/apkid/__pycache__/main.cpython-314.pyc +0 -0
- package/apkid/__pycache__/output.cpython-313.pyc +0 -0
- package/apkid/__pycache__/rules.cpython-313.pyc +0 -0
- package/apkid/apkid.py +266 -0
- package/apkid/main.py +98 -0
- package/apkid/output.py +177 -0
- package/apkid/rules/apk/common.yara +68 -0
- package/apkid/rules/apk/obfuscators.yara +118 -0
- package/apkid/rules/apk/packers.yara +1197 -0
- package/apkid/rules/apk/protectors.yara +301 -0
- package/apkid/rules/dex/abnormal.yara +104 -0
- package/apkid/rules/dex/anti-vm.yara +568 -0
- package/apkid/rules/dex/common.yara +60 -0
- package/apkid/rules/dex/compilers.yara +434 -0
- package/apkid/rules/dex/obfuscators.yara +602 -0
- package/apkid/rules/dex/packers.yara +761 -0
- package/apkid/rules/dex/protectors.yara +520 -0
- package/apkid/rules/dll/common.yara +38 -0
- package/apkid/rules/dll/obfuscators.yara +43 -0
- package/apkid/rules/elf/anti-vm.yara +43 -0
- package/apkid/rules/elf/common.yara +54 -0
- package/apkid/rules/elf/obfuscators.yara +991 -0
- package/apkid/rules/elf/packers.yara +1128 -0
- package/apkid/rules/elf/protectors.yara +794 -0
- package/apkid/rules/res/common.yara +43 -0
- package/apkid/rules/res/obfuscators.yara +46 -0
- package/apkid/rules/res/protectors.yara +46 -0
- package/apkid/rules.py +77 -0
- package/bin/anais +3 -0
- package/dist/cli.js +82 -0
- package/dist/index.js +123 -0
- package/dist/types/index.js +2 -0
- package/dist/utils/index.js +21 -0
- package/dist/utils/output.js +44 -0
- package/dist/utils/paths.js +107 -0
- package/docs/ARCHITECTURE.txt +353 -0
- package/docs/Workflow and Reference.md +445 -0
- package/package.json +70 -0
- package/rules/yara_general_rules.yar +323 -0
- package/scripts/dynamic_analysis_helper.sh +334 -0
- package/scripts/frida/dpt_dex_dumper.js +145 -0
- package/scripts/frida/frida_dex_dump.js +145 -0
- package/scripts/frida/frida_hooks.js +437 -0
- package/scripts/frida/frida_websocket_extractor.js +154 -0
- package/scripts/setup.sh +206 -0
- package/scripts/validate_framework.sh +224 -0
- package/src/cli.ts +91 -0
- package/src/index.ts +123 -0
- package/src/types/index.ts +44 -0
- package/src/utils/index.ts +6 -0
- package/src/utils/output.ts +50 -0
- package/src/utils/paths.ts +72 -0
- 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
|
+
}
|