62
62
// Please do not read the code out loud unless you have exorcism skills
63
63
64
64
const logType = {
65
- warning: -2,
66
- about: -1,
67
- nothing: 0,
68
- any: 1,
69
- net: 2
70
- },
65
+ warning: -2,
66
+ about: -1,
67
+ nothing: 0,
68
+ any: 1,
69
+ net: 2
70
+ },
71
71
heurLabel = "HEUR";
72
72
73
73
var lastOffsetDetected = "0x00";
@@ -178,11 +178,11 @@ function scanForObfuscations_NET() {
178
178
var isEntryPointModified = false;
179
179
180
180
const vbNetEntries = [
181
- "Main",
182
- "main",
183
- "MAIN",
184
- "MyApplication"
185
- ],
181
+ "Main",
182
+ "main",
183
+ "MAIN",
184
+ "MyApplication"
185
+ ],
186
186
defaultEntries = [ // like MSIL, C#, C++ NET etc
187
187
"Main",
188
188
"main", // F# entry
@@ -348,9 +348,9 @@ function scanForObfuscations_NET() {
348
348
349
349
if (validateNetByteCode(intConfusionXorPattern)) {
350
350
if (validateNetByteCode( // samples by: Inx Obfuscator
351
- intConfusionXorPattern +
352
- (opCodes.bne_un_s + opCodes.ldc_i4_2 + opCodes.stloc_0 + opCodes.sizeof + opCodes.add)
353
- ) ||
351
+ intConfusionXorPattern +
352
+ (opCodes.bne_un_s + opCodes.ldc_i4_2 + opCodes.stloc_0 + opCodes.sizeof + opCodes.add)
353
+ ) ||
354
354
validateNetByteCode( // samples by: MindLated, NetShield
355
355
intConfusionXorPattern +
356
356
(opCodes.bne_un + opCodes.ldc_i4 + opCodes.stloc + opCodes.sizeof + opCodes.add)
@@ -455,9 +455,9 @@ function scanForObfuscations_NET() {
455
455
var isCalliInvokesPresent = false;
456
456
457
457
if (validateNetByteCode( // samples by: MindLated
458
- opCodes.setStrict(opCodes.ldftn, "** ?? 00 0A") +
459
- opCodes.setStrict(opCodes.calli, "** 00 00 11")
460
- ) ||
458
+ opCodes.setStrict(opCodes.ldftn, "** ?? 00 0A") +
459
+ opCodes.setStrict(opCodes.calli, "** 00 00 11")
460
+ ) ||
461
461
validateNetByteCode( // samples by: ArmDot, DarksProtector
462
462
opCodes.idelem_i +
463
463
opCodes.setStrict(opCodes.calli, "** 00 00 11")
@@ -474,8 +474,8 @@ function scanForObfuscations_NET() {
474
474
var isLdftnPointersPresent = false;
475
475
476
476
if (validateNetByteCode(
477
- opCodes.nop + opCodes.setStrict(opCodes.ldftn, "** 00 00 06") + opCodes.stelem_i
478
- ) ||
477
+ opCodes.nop + opCodes.setStrict(opCodes.ldftn, "** 00 00 06") + opCodes.stelem_i
478
+ ) ||
479
479
validateNetByteCode(
480
480
opCodes.nop + opCodes.setStrict(opCodes.ldftn, "** 00 00 0A") + opCodes.stelem_i
481
481
) ||
@@ -497,9 +497,9 @@ function scanForObfuscations_NET() {
497
497
var isCtrlFlowPresent = false;
498
498
499
499
if (validateNetByteCode( // samples by: ConfuserEx
500
- opCodes.nop + opCodes.ldloc_0 + opCodes.ldc_i4 + opCodes.mul + opCodes.ldc_i4 + opCodes.xor + opCodes.br_s +
501
- opCodes.nop + opCodes.ldloc_0 + opCodes.ldc_i4 + opCodes.mul + opCodes.ldc_i4 + opCodes.xor + opCodes.br_s
502
- ) ||
500
+ opCodes.nop + opCodes.ldloc_0 + opCodes.ldc_i4 + opCodes.mul + opCodes.ldc_i4 + opCodes.xor + opCodes.br_s +
501
+ opCodes.nop + opCodes.ldloc_0 + opCodes.ldc_i4 + opCodes.mul + opCodes.ldc_i4 + opCodes.xor + opCodes.br_s
502
+ ) ||
503
503
validateNetByteCode( // samples by: ConfuserEx (neo mod)
504
504
opCodes.ldc_i4 + opCodes.ldc_i4 + opCodes.xor + opCodes.dup + opCodes.stloc_0 + opCodes.ldc_i4_3 + opCodes.rem_un + opCodes.switch__nobody
505
505
) ||
@@ -767,32 +767,32 @@ function scanForObfuscations_NET() {
767
767
var isMathInversionsPresent = false;
768
768
769
769
if (validateNetByteCode(opCodes.ldc_i4 + opCodes.not) && (
770
- validateNetByteCode( // ~(-(~(-(~(-(~(-( num ))))))))
771
- opCodes.ldc_i4 +
772
- opCodes.not + opCodes.neg + opCodes.not + opCodes.neg +
773
- opCodes.not + opCodes.neg + opCodes.not + opCodes.neg
774
- ) ||
775
- validateNetByteCode( // ~(~(-(-(~(~( num ))))))
776
- opCodes.ldc_i4 +
777
- opCodes.not + opCodes.not + opCodes.neg + opCodes.neg +
778
- opCodes.not + opCodes.not
779
- ) ||
780
- validateNetByteCode( // ~(-(~(~(-(-( num ))))))
781
- opCodes.ldc_i4 +
782
- opCodes.not + opCodes.neg + opCodes.not + opCodes.not +
783
- opCodes.neg + opCodes.neg
784
- ) ||
785
- validateNetByteCode( // ~(-(~(-(~(~( num ))))))
786
- opCodes.ldc_i4 +
787
- opCodes.not + opCodes.neg + opCodes.not + opCodes.neg +
788
- opCodes.not + opCodes.not
789
- ) ||
790
- validateNetByteCode( // ~(-(~(-(~(-( num ))))))
791
- opCodes.ldc_i4 +
792
- opCodes.not + opCodes.neg + opCodes.not + opCodes.neg +
793
- opCodes.not + opCodes.neg
794
- )
795
- )) {
770
+ validateNetByteCode( // ~(-(~(-(~(-(~(-( num ))))))))
771
+ opCodes.ldc_i4 +
772
+ opCodes.not + opCodes.neg + opCodes.not + opCodes.neg +
773
+ opCodes.not + opCodes.neg + opCodes.not + opCodes.neg
774
+ ) ||
775
+ validateNetByteCode( // ~(~(-(-(~(~( num ))))))
776
+ opCodes.ldc_i4 +
777
+ opCodes.not + opCodes.not + opCodes.neg + opCodes.neg +
778
+ opCodes.not + opCodes.not
779
+ ) ||
780
+ validateNetByteCode( // ~(-(~(~(-(-( num ))))))
781
+ opCodes.ldc_i4 +
782
+ opCodes.not + opCodes.neg + opCodes.not + opCodes.not +
783
+ opCodes.neg + opCodes.neg
784
+ ) ||
785
+ validateNetByteCode( // ~(-(~(-(~(~( num ))))))
786
+ opCodes.ldc_i4 +
787
+ opCodes.not + opCodes.neg + opCodes.not + opCodes.neg +
788
+ opCodes.not + opCodes.not
789
+ ) ||
790
+ validateNetByteCode( // ~(-(~(-(~(-( num ))))))
791
+ opCodes.ldc_i4 +
792
+ opCodes.not + opCodes.neg + opCodes.not + opCodes.neg +
793
+ opCodes.not + opCodes.neg
794
+ )
795
+ )) {
796
796
log(logType.net, "Math inversions detected, offset " + lastOffsetDetected);
797
797
isMathInversionsPresent = true;
798
798
}
@@ -923,12 +923,12 @@ function scanForObfuscations_NET() {
923
923
}
924
924
925
925
if ((!isWatermarkPresent && (
926
- validateSignature("'Obfuscated'") ||
927
- validateSignature("'obfuscated'") ||
928
- validateSignature("'ByAttribute'") ||
929
- validateSignature("'ObfuscatorAttribute'") ||
930
- validateNetObject("ObfuscationAttribute")
931
- )) && !isFrameworkComponent()) // System.Reflection.ObfuscationAttribute
926
+ validateSignature("'Obfuscated'") ||
927
+ validateSignature("'obfuscated'") ||
928
+ validateSignature("'ByAttribute'") ||
929
+ validateSignature("'ObfuscatorAttribute'") ||
930
+ validateNetObject("ObfuscationAttribute")
931
+ )) && !isFrameworkComponent()) // System.Reflection.ObfuscationAttribute
932
932
{
933
933
isWatermarkPresent = true;
934
934
}
@@ -940,23 +940,23 @@ function scanForObfuscations_NET() {
940
940
941
941
942
942
const protectorsLabelsToRemove = [ // Protectors with these names will be removed from results
943
- "SafeNet Sentinel LDK .NET",
944
- "Xenocode Postbuild",
945
- "Smart Assembly",
946
- "Dotfuscator",
947
- "Babel .NET",
948
- "Spices.Net",
949
- "Maxtocode",
950
- "FISH .NET",
951
- "CliSecure",
952
- "CodeWall",
953
- "CodeVeil",
954
- "Sixxpack",
955
- "DNGuard",
956
- "Goliath",
957
- "Agile",
958
- "Yano"
959
- ],
943
+ "SafeNet Sentinel LDK .NET",
944
+ "Xenocode Postbuild",
945
+ "Smart Assembly",
946
+ "Dotfuscator",
947
+ "Babel .NET",
948
+ "Spices.Net",
949
+ "Maxtocode",
950
+ "FISH .NET",
951
+ "CliSecure",
952
+ "CodeWall",
953
+ "CodeVeil",
954
+ "Sixxpack",
955
+ "DNGuard",
956
+ "Goliath",
957
+ "Agile",
958
+ "Yano"
959
+ ],
960
960
packersLabelsToRemove = [
961
961
"ChainskiCrypter",
962
962
"Quest PowerGUI",
@@ -1269,7 +1269,7 @@ function NetOpCodes() {
1269
1269
1270
1270
// setStrict sets the strict value of the opcode for substitution
1271
1271
// btw I like what I do
1272
- this.setStrict = function(opCodeMask, value) {
1272
+ this.setStrict = function (opCodeMask, value) {
1273
1273
// Remove spaces from opcode mask and value
1274
1274
opCodeMask = removeSpaces(opCodeMask);
1275
1275
value = removeSpaces(value);
@@ -1293,7 +1293,7 @@ function NetOpCodes() {
1293
1293
}
1294
1294
1295
1295
// Sets the mask value to zero for the specified opcode
1296
- this.setNullValue = function(opCodeMask) {
1296
+ this.setNullValue = function (opCodeMask) {
1297
1297
1298
1298
if (opCodeMask.indexOf("??") === -1) {
1299
1299
_error("Instruction does not have a body to overwrite the value.");
@@ -1362,14 +1362,14 @@ function scanForPackersAndCryptors_NET_and_Native() { // For .NET and Native app
1362
1362
var isAssemblyInvokeFound = false;
1363
1363
1364
1364
if (isAllNetReferencesPresent( // TODO: update [!!!]
1365
- references = [
1366
- "System.Reflection", // System.Reflection.dll
1367
- "get_EntryPoint", // MSIL: '*.Assembly::get_EntryPoint()'
1368
- "Assembly", // MSIL: 'System.Reflection.Assembly' from System.Reflection.dll
1369
- "Invoke", // MSIL: '*.MethodBase::Invoke(object, object[])'
1370
- "Load" // MSIL: '*.Assembly::Load(uint8[])'
1371
- ]
1372
- )) {
1365
+ references = [
1366
+ "System.Reflection", // System.Reflection.dll
1367
+ "get_EntryPoint", // MSIL: '*.Assembly::get_EntryPoint()'
1368
+ "Assembly", // MSIL: 'System.Reflection.Assembly' from System.Reflection.dll
1369
+ "Invoke", // MSIL: '*.MethodBase::Invoke(object, object[])'
1370
+ "Load" // MSIL: '*.Assembly::Load(uint8[])'
1371
+ ]
1372
+ )) {
1373
1373
isAssemblyInvokeFound = true;
1374
1374
1375
1375
options = "Assembly invoke";
@@ -2515,8 +2515,8 @@ function isAllNetReferencesPresent(references) {
2515
2515
*/
2516
2516
function findAndMark(sign, isFullName) {
2517
2517
if (PE.isSignatureInSectionPresent(0,
2518
- ("00'" + sign + "'") + // 00'string
2519
- (isFullName ? "00" : String()))) { // ... '00
2518
+ ("00'" + sign + "'") + // 00'string
2519
+ (isFullName ? "00" : String()))) { // ... '00
2520
2520
return sign;
2521
2521
}
2522
2522
return String();
@@ -2727,9 +2727,9 @@ function scanForObfuscations_Native() {
2727
2727
var exeAsDll = false;
2728
2728
2729
2729
if (PE.isDll() && (
2730
- PE.isExportFunctionPresent("Start") ||
2731
- PE.isExportFunctionPresent("main") ||
2732
- PE.isExportFunctionPresent("_start"))) {
2730
+ PE.isExportFunctionPresent("Start") ||
2731
+ PE.isExportFunctionPresent("main") ||
2732
+ PE.isExportFunctionPresent("_start"))) {
2733
2733
exeAsDll = true;
2734
2734
}
2735
2735
@@ -2877,8 +2877,8 @@ function getEpAsmPattern(onlyOpCodes, numberOf) {
2877
2877
// Append either the opcode or the full instruction to the result
2878
2878
result += (
2879
2879
onlyOpCodes ?
2880
- getAsmOpCode(asmInstruction) : // "MOV"
2881
- asmInstruction // "MOV EAX, 4"
2880
+ getAsmOpCode(asmInstruction) : // "MOV"
2881
+ asmInstruction // "MOV EAX, 4"
2882
2882
) + _patternSplitter;
2883
2883
}
2884
2884
@@ -2937,8 +2937,8 @@ function getInstructionsAsmPattern(instruction) {
2937
2937
return _patternSplitter +
2938
2938
(
2939
2939
Array.isArray(instruction) ?
2940
- instruction.join(_patternSplitter) :
2941
- instruction
2940
+ instruction.join(_patternSplitter) :
2941
+ instruction
2942
2942
) +
2943
2943
_patternSplitter;
2944
2944
}
0 commit comments