@dimzxzzx07/file-watcher 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 (100) hide show
  1. package/.env +13 -0
  2. package/.eslintrc.json +128 -0
  3. package/.prettierrc +18 -0
  4. package/Dimzxzzx07.png +0 -0
  5. package/README.md +1024 -0
  6. package/dist/core/BackupManager.d.ts +25 -0
  7. package/dist/core/BackupManager.d.ts.map +1 -0
  8. package/dist/core/BackupManager.js +290 -0
  9. package/dist/core/BackupManager.js.map +1 -0
  10. package/dist/core/IntegrityValidator.d.ts +18 -0
  11. package/dist/core/IntegrityValidator.d.ts.map +1 -0
  12. package/dist/core/IntegrityValidator.js +212 -0
  13. package/dist/core/IntegrityValidator.js.map +1 -0
  14. package/dist/core/SecurityManager.d.ts +40 -0
  15. package/dist/core/SecurityManager.d.ts.map +1 -0
  16. package/dist/core/SecurityManager.js +320 -0
  17. package/dist/core/SecurityManager.js.map +1 -0
  18. package/dist/core/WatcherEngine.d.ts +44 -0
  19. package/dist/core/WatcherEngine.d.ts.map +1 -0
  20. package/dist/core/WatcherEngine.js +470 -0
  21. package/dist/core/WatcherEngine.js.map +1 -0
  22. package/dist/crypto/HashGenerator.d.ts +26 -0
  23. package/dist/crypto/HashGenerator.d.ts.map +1 -0
  24. package/dist/crypto/HashGenerator.js +220 -0
  25. package/dist/crypto/HashGenerator.js.map +1 -0
  26. package/dist/crypto/KeyManager.d.ts +30 -0
  27. package/dist/crypto/KeyManager.d.ts.map +1 -0
  28. package/dist/crypto/KeyManager.js +235 -0
  29. package/dist/crypto/KeyManager.js.map +1 -0
  30. package/dist/crypto/SignatureValidator.d.ts +11 -0
  31. package/dist/crypto/SignatureValidator.d.ts.map +1 -0
  32. package/dist/crypto/SignatureValidator.js +102 -0
  33. package/dist/crypto/SignatureValidator.js.map +1 -0
  34. package/dist/detectors/AnomalyDetector.d.ts +24 -0
  35. package/dist/detectors/AnomalyDetector.d.ts.map +1 -0
  36. package/dist/detectors/AnomalyDetector.js +209 -0
  37. package/dist/detectors/AnomalyDetector.js.map +1 -0
  38. package/dist/detectors/InjectionDetector.d.ts +14 -0
  39. package/dist/detectors/InjectionDetector.d.ts.map +1 -0
  40. package/dist/detectors/InjectionDetector.js +204 -0
  41. package/dist/detectors/InjectionDetector.js.map +1 -0
  42. package/dist/detectors/PatternMatcher.d.ts +28 -0
  43. package/dist/detectors/PatternMatcher.d.ts.map +1 -0
  44. package/dist/detectors/PatternMatcher.js +283 -0
  45. package/dist/detectors/PatternMatcher.js.map +1 -0
  46. package/dist/guards/FileGuard.d.ts +35 -0
  47. package/dist/guards/FileGuard.d.ts.map +1 -0
  48. package/dist/guards/FileGuard.js +357 -0
  49. package/dist/guards/FileGuard.js.map +1 -0
  50. package/dist/guards/MemoryGuard.d.ts +28 -0
  51. package/dist/guards/MemoryGuard.d.ts.map +1 -0
  52. package/dist/guards/MemoryGuard.js +256 -0
  53. package/dist/guards/MemoryGuard.js.map +1 -0
  54. package/dist/guards/ProcessGuard.d.ts +25 -0
  55. package/dist/guards/ProcessGuard.d.ts.map +1 -0
  56. package/dist/guards/ProcessGuard.js +221 -0
  57. package/dist/guards/ProcessGuard.js.map +1 -0
  58. package/dist/index.d.ts +19 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +186 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/types/index.d.ts +69 -0
  63. package/dist/types/index.d.ts.map +1 -0
  64. package/dist/types/index.js +3 -0
  65. package/dist/types/index.js.map +1 -0
  66. package/dist/utils/Constants.d.ts +407 -0
  67. package/dist/utils/Constants.d.ts.map +1 -0
  68. package/dist/utils/Constants.js +505 -0
  69. package/dist/utils/Constants.js.map +1 -0
  70. package/dist/utils/Logger.d.ts +45 -0
  71. package/dist/utils/Logger.d.ts.map +1 -0
  72. package/dist/utils/Logger.js +285 -0
  73. package/dist/utils/Logger.js.map +1 -0
  74. package/dist/utils/Validator.d.ts +27 -0
  75. package/dist/utils/Validator.d.ts.map +1 -0
  76. package/dist/utils/Validator.js +245 -0
  77. package/dist/utils/Validator.js.map +1 -0
  78. package/favicon.png +0 -0
  79. package/jest.config.js +69 -0
  80. package/package.json +69 -0
  81. package/src/core/BackupManager.ts +305 -0
  82. package/src/core/IntegrityValidator.ts +200 -0
  83. package/src/core/SecurityManager.ts +348 -0
  84. package/src/core/WatcherEngine.ts +537 -0
  85. package/src/crypto/HashGenerator.ts +234 -0
  86. package/src/crypto/KeyManager.ts +249 -0
  87. package/src/crypto/SignatureValidator.ts +76 -0
  88. package/src/detectors/AnomalyDetector.ts +247 -0
  89. package/src/detectors/InjectionDetector.ts +233 -0
  90. package/src/detectors/PatternMatcher.ts +319 -0
  91. package/src/guards/FileGuard.ts +385 -0
  92. package/src/guards/MemoryGuard.ts +263 -0
  93. package/src/guards/ProcessGuard.ts +219 -0
  94. package/src/index.ts +189 -0
  95. package/src/types/index.ts +72 -0
  96. package/src/utils/Constants.ts +532 -0
  97. package/src/utils/Logger.ts +279 -0
  98. package/src/utils/Validator.ts +248 -0
  99. package/tests/setup.ts +80 -0
  100. package/tsconfig.json +42 -0
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SignatureValidator = void 0;
37
+ const crypto = __importStar(require("crypto"));
38
+ const Logger_1 = require("../utils/Logger");
39
+ class SignatureValidator {
40
+ logger;
41
+ keyPair;
42
+ constructor() {
43
+ this.logger = Logger_1.Logger.getInstance();
44
+ this.keyPair = this.generateKeyPair();
45
+ }
46
+ generateKeyPair() {
47
+ const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
48
+ modulusLength: 2048,
49
+ publicKeyEncoding: {
50
+ type: 'spki',
51
+ format: 'pem'
52
+ },
53
+ privateKeyEncoding: {
54
+ type: 'pkcs8',
55
+ format: 'pem'
56
+ }
57
+ });
58
+ return { publicKey, privateKey };
59
+ }
60
+ async generateSignature(data) {
61
+ try {
62
+ const hash = crypto.createHash('sha512')
63
+ .update(data)
64
+ .digest();
65
+ const sign = crypto.createSign('RSA-SHA512');
66
+ sign.update(hash);
67
+ const signature = sign.sign(this.keyPair.privateKey, 'base64');
68
+ return signature;
69
+ }
70
+ catch (error) {
71
+ this.logger.error('Failed to generate signature', { error });
72
+ throw error;
73
+ }
74
+ }
75
+ async validateSignature(data, signature) {
76
+ try {
77
+ const hash = crypto.createHash('sha512')
78
+ .update(data)
79
+ .digest();
80
+ const verify = crypto.createVerify('RSA-SHA512');
81
+ verify.update(hash);
82
+ return verify.verify(this.keyPair.publicKey, signature, 'base64');
83
+ }
84
+ catch (error) {
85
+ this.logger.error('Failed to validate signature', { error });
86
+ return false;
87
+ }
88
+ }
89
+ exportPublicKey() {
90
+ return this.keyPair.publicKey;
91
+ }
92
+ getStatus() {
93
+ return {
94
+ algorithm: 'RSA-SHA512',
95
+ keySize: 2048,
96
+ publicKeyAvailable: !!this.keyPair.publicKey,
97
+ privateKeyAvailable: !!this.keyPair.privateKey
98
+ };
99
+ }
100
+ }
101
+ exports.SignatureValidator = SignatureValidator;
102
+ //# sourceMappingURL=SignatureValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SignatureValidator.js","sourceRoot":"","sources":["../../src/crypto/SignatureValidator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;AACjC,4CAAyC;AAEzC,MAAa,kBAAkB;IACV,MAAM,CAAS;IACf,OAAO,CAA4C;IAEpE;QACI,IAAI,CAAC,MAAM,GAAG,eAAM,CAAC,WAAW,EAAE,CAAC;QAEnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;IAC1C,CAAC;IAEO,eAAe;QACnB,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,mBAAmB,CAAC,KAAK,EAAE;YAChE,aAAa,EAAE,IAAI;YACnB,iBAAiB,EAAE;gBACf,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,KAAK;aAChB;YACD,kBAAkB,EAAE;gBAChB,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,KAAK;aAChB;SACJ,CAAC,CAAC;QAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;IACrC,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,IAAY;QACvC,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;iBACnC,MAAM,CAAC,IAAI,CAAC;iBACZ,MAAM,EAAE,CAAC;YAEd,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAElB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAE/D,OAAO,SAAS,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7D,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,IAAY,EAAE,SAAiB;QAC1D,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;iBACnC,MAAM,CAAC,IAAI,CAAC;iBACZ,MAAM,EAAE,CAAC;YAEd,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEpB,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7D,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAEM,eAAe;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IAClC,CAAC;IAEM,SAAS;QACZ,OAAO;YACH,SAAS,EAAE,YAAY;YACvB,OAAO,EAAE,IAAI;YACb,kBAAkB,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS;YAC5C,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU;SACjD,CAAC;IACN,CAAC;CACJ;AAxED,gDAwEC","sourcesContent":["import * as crypto from 'crypto';\nimport { Logger } from '../utils/Logger';\n\nexport class SignatureValidator {\n private readonly logger: Logger;\n private readonly keyPair: { publicKey: string; privateKey: string };\n\n constructor() {\n this.logger = Logger.getInstance();\n \n this.keyPair = this.generateKeyPair();\n }\n\n private generateKeyPair(): { publicKey: string; privateKey: string } {\n const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {\n modulusLength: 2048,\n publicKeyEncoding: {\n type: 'spki',\n format: 'pem'\n },\n privateKeyEncoding: {\n type: 'pkcs8',\n format: 'pem'\n }\n });\n\n return { publicKey, privateKey };\n }\n\n public async generateSignature(data: Buffer): Promise<string> {\n try {\n const hash = crypto.createHash('sha512')\n .update(data)\n .digest();\n \n const sign = crypto.createSign('RSA-SHA512');\n sign.update(hash);\n \n const signature = sign.sign(this.keyPair.privateKey, 'base64');\n \n return signature;\n } catch (error) {\n this.logger.error('Failed to generate signature', { error });\n throw error;\n }\n }\n\n public async validateSignature(data: Buffer, signature: string): Promise<boolean> {\n try {\n const hash = crypto.createHash('sha512')\n .update(data)\n .digest();\n \n const verify = crypto.createVerify('RSA-SHA512');\n verify.update(hash);\n \n return verify.verify(this.keyPair.publicKey, signature, 'base64');\n } catch (error) {\n this.logger.error('Failed to validate signature', { error });\n return false;\n }\n }\n\n public exportPublicKey(): string {\n return this.keyPair.publicKey;\n }\n\n public getStatus(): any {\n return {\n algorithm: 'RSA-SHA512',\n keySize: 2048,\n publicKeyAvailable: !!this.keyPair.publicKey,\n privateKeyAvailable: !!this.keyPair.privateKey\n };\n }\n}"]}
@@ -0,0 +1,24 @@
1
+ export declare class AnomalyDetector {
2
+ private readonly logger;
3
+ private readonly baseline;
4
+ private readonly anomalies;
5
+ private learningMode;
6
+ private readonly learningPeriod;
7
+ constructor();
8
+ private startLearning;
9
+ detectAnomalies(filePath: string, content: Buffer): Promise<boolean>;
10
+ private isSizeAnomaly;
11
+ private isTimingAnomaly;
12
+ private isContentPatternAnomaly;
13
+ private isFrequencyAnomaly;
14
+ private isStructuralAnomaly;
15
+ private getFileStats;
16
+ private getCharacterDistribution;
17
+ private getNormalDistribution;
18
+ private calculateStdDev;
19
+ private calculateSeverity;
20
+ updateBaseline(filePath: string, content: Buffer): void;
21
+ getAnomalies(): any[];
22
+ getStatus(): any;
23
+ }
24
+ //# sourceMappingURL=AnomalyDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnomalyDetector.d.ts","sourceRoot":"","sources":["../../src/detectors/AnomalyDetector.ts"],"names":[],"mappings":"AAEA,qBAAa,eAAe;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmB;;IAUlD,OAAO,CAAC,aAAa;IASR,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YA2CnE,aAAa;YAUb,eAAe;YAgBf,uBAAuB;YAgBvB,kBAAkB;YAYlB,mBAAmB;YAoBnB,YAAY;IAa1B,OAAO,CAAC,wBAAwB;IAUhC,OAAO,CAAC,qBAAqB;IAgC7B,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,iBAAiB;IAMlB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAwBvD,YAAY,IAAI,GAAG,EAAE;IAIrB,SAAS,IAAI,GAAG;CAQ1B"}
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AnomalyDetector = void 0;
4
+ const Logger_1 = require("../utils/Logger");
5
+ class AnomalyDetector {
6
+ logger;
7
+ baseline;
8
+ anomalies;
9
+ learningMode = true;
10
+ learningPeriod = 3600000;
11
+ constructor() {
12
+ this.logger = Logger_1.Logger.getInstance();
13
+ this.baseline = new Map();
14
+ this.anomalies = [];
15
+ this.startLearning();
16
+ }
17
+ startLearning() {
18
+ this.logger.info('Anomaly detector starting learning mode');
19
+ setTimeout(() => {
20
+ this.learningMode = false;
21
+ this.logger.info('Anomaly detector learning complete');
22
+ }, this.learningPeriod);
23
+ }
24
+ async detectAnomalies(filePath, content) {
25
+ try {
26
+ const anomalies = [];
27
+ if (await this.isSizeAnomaly(filePath, content.length)) {
28
+ anomalies.push('size_anomaly');
29
+ }
30
+ if (await this.isTimingAnomaly(filePath)) {
31
+ anomalies.push('timing_anomaly');
32
+ }
33
+ if (await this.isContentPatternAnomaly(content)) {
34
+ anomalies.push('pattern_anomaly');
35
+ }
36
+ if (await this.isFrequencyAnomaly(filePath)) {
37
+ anomalies.push('frequency_anomaly');
38
+ }
39
+ if (await this.isStructuralAnomaly(content)) {
40
+ anomalies.push('structural_anomaly');
41
+ }
42
+ if (anomalies.length > 0) {
43
+ this.anomalies.push({
44
+ filePath,
45
+ timestamp: new Date(),
46
+ anomalies,
47
+ severity: this.calculateSeverity(anomalies.length)
48
+ });
49
+ this.logger.warning(`Anomalies detected in ${filePath}`, { anomalies });
50
+ return true;
51
+ }
52
+ return false;
53
+ }
54
+ catch (error) {
55
+ this.logger.error('Error detecting anomalies', { error });
56
+ return true;
57
+ }
58
+ }
59
+ async isSizeAnomaly(filePath, newSize) {
60
+ const stats = await this.getFileStats(filePath);
61
+ if (!stats)
62
+ return false;
63
+ const avgSize = stats.sizes.reduce((a, b) => a + b, 0) / stats.sizes.length;
64
+ const stdDev = this.calculateStdDev(stats.sizes, avgSize);
65
+ return Math.abs(newSize - avgSize) > (stdDev * 3);
66
+ }
67
+ async isTimingAnomaly(filePath) {
68
+ const stats = await this.getFileStats(filePath);
69
+ if (!stats)
70
+ return false;
71
+ const now = Date.now();
72
+ const lastAccess = stats.lastAccess || now;
73
+ const timeDiff = now - lastAccess;
74
+ const hour = new Date().getHours();
75
+ if (hour >= 1 && hour <= 4) {
76
+ return timeDiff < 300000;
77
+ }
78
+ return false;
79
+ }
80
+ async isContentPatternAnomaly(content) {
81
+ const contentStr = content.toString();
82
+ const charDistribution = this.getCharacterDistribution(contentStr);
83
+ const normalDistribution = this.getNormalDistribution();
84
+ let deviation = 0;
85
+ for (const [char, count] of charDistribution) {
86
+ const normalCount = normalDistribution.get(char) || 0;
87
+ deviation += Math.abs(count - normalCount);
88
+ }
89
+ return deviation > 100;
90
+ }
91
+ async isFrequencyAnomaly(filePath) {
92
+ const stats = await this.getFileStats(filePath);
93
+ if (!stats)
94
+ return false;
95
+ const now = Date.now();
96
+ const recentAccesses = stats.accessTimes.filter((time) => now - time < 60000);
97
+ return recentAccesses.length > 10;
98
+ }
99
+ async isStructuralAnomaly(content) {
100
+ if (content.length < 100)
101
+ return false;
102
+ const bytes = Array.from(content);
103
+ let maxRunLength = 0;
104
+ let currentRun = 1;
105
+ for (let i = 1; i < bytes.length; i++) {
106
+ if (bytes[i] === bytes[i - 1]) {
107
+ currentRun++;
108
+ maxRunLength = Math.max(maxRunLength, currentRun);
109
+ }
110
+ else {
111
+ currentRun = 1;
112
+ }
113
+ }
114
+ return maxRunLength > 100;
115
+ }
116
+ async getFileStats(filePath) {
117
+ if (!this.baseline.has(filePath)) {
118
+ this.baseline.set(filePath, {
119
+ sizes: [],
120
+ accessTimes: [],
121
+ lastAccess: null,
122
+ firstSeen: new Date()
123
+ });
124
+ }
125
+ return this.baseline.get(filePath);
126
+ }
127
+ getCharacterDistribution(text) {
128
+ const distribution = new Map();
129
+ for (const char of text) {
130
+ distribution.set(char, (distribution.get(char) || 0) + 1);
131
+ }
132
+ return distribution;
133
+ }
134
+ getNormalDistribution() {
135
+ const normal = new Map();
136
+ normal.set('e', 12.7);
137
+ normal.set('t', 9.1);
138
+ normal.set('a', 8.2);
139
+ normal.set('o', 7.5);
140
+ normal.set('i', 7.0);
141
+ normal.set('n', 6.7);
142
+ normal.set('s', 6.3);
143
+ normal.set('h', 6.1);
144
+ normal.set('r', 6.0);
145
+ normal.set('d', 4.3);
146
+ normal.set('l', 4.0);
147
+ normal.set('c', 2.8);
148
+ normal.set('u', 2.8);
149
+ normal.set('m', 2.4);
150
+ normal.set('w', 2.4);
151
+ normal.set('f', 2.2);
152
+ normal.set('g', 2.0);
153
+ normal.set('y', 2.0);
154
+ normal.set('p', 1.9);
155
+ normal.set('b', 1.5);
156
+ normal.set('v', 1.0);
157
+ normal.set('k', 0.8);
158
+ normal.set('j', 0.2);
159
+ normal.set('x', 0.2);
160
+ normal.set('q', 0.1);
161
+ normal.set('z', 0.1);
162
+ return normal;
163
+ }
164
+ calculateStdDev(values, mean) {
165
+ const squareDiffs = values.map(value => Math.pow(value - mean, 2));
166
+ const avgSquareDiff = squareDiffs.reduce((a, b) => a + b, 0) / squareDiffs.length;
167
+ return Math.sqrt(avgSquareDiff);
168
+ }
169
+ calculateSeverity(anomalyCount) {
170
+ if (anomalyCount >= 4)
171
+ return 'critical';
172
+ if (anomalyCount >= 2)
173
+ return 'high';
174
+ return 'medium';
175
+ }
176
+ updateBaseline(filePath, content) {
177
+ if (!this.learningMode)
178
+ return;
179
+ const stats = this.baseline.get(filePath) || {
180
+ sizes: [],
181
+ accessTimes: [],
182
+ lastAccess: null,
183
+ firstSeen: new Date()
184
+ };
185
+ stats.sizes.push(content.length);
186
+ stats.accessTimes.push(Date.now());
187
+ stats.lastAccess = Date.now();
188
+ if (stats.sizes.length > 100) {
189
+ stats.sizes.shift();
190
+ }
191
+ if (stats.accessTimes.length > 100) {
192
+ stats.accessTimes.shift();
193
+ }
194
+ this.baseline.set(filePath, stats);
195
+ }
196
+ getAnomalies() {
197
+ return [...this.anomalies];
198
+ }
199
+ getStatus() {
200
+ return {
201
+ learningMode: this.learningMode,
202
+ baselineCount: this.baseline.size,
203
+ anomaliesDetected: this.anomalies.length,
204
+ learningPeriod: this.learningPeriod
205
+ };
206
+ }
207
+ }
208
+ exports.AnomalyDetector = AnomalyDetector;
209
+ //# sourceMappingURL=AnomalyDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnomalyDetector.js","sourceRoot":"","sources":["../../src/detectors/AnomalyDetector.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from '../utils/Logger';\n\nexport class AnomalyDetector {\n private readonly logger: Logger;\n private readonly baseline: Map<string, any>;\n private readonly anomalies: any[];\n private learningMode: boolean = true;\n private readonly learningPeriod: number = 3600000;\n\n constructor() {\n this.logger = Logger.getInstance();\n this.baseline = new Map();\n this.anomalies = [];\n \n this.startLearning();\n }\n\n private startLearning(): void {\n this.logger.info('Anomaly detector starting learning mode');\n \n setTimeout(() => {\n this.learningMode = false;\n this.logger.info('Anomaly detector learning complete');\n }, this.learningPeriod);\n }\n\n public async detectAnomalies(filePath: string, content: Buffer): Promise<boolean> {\n try {\n const anomalies: string[] = [];\n\n if (await this.isSizeAnomaly(filePath, content.length)) {\n anomalies.push('size_anomaly');\n }\n\n if (await this.isTimingAnomaly(filePath)) {\n anomalies.push('timing_anomaly');\n }\n\n if (await this.isContentPatternAnomaly(content)) {\n anomalies.push('pattern_anomaly');\n }\n\n if (await this.isFrequencyAnomaly(filePath)) {\n anomalies.push('frequency_anomaly');\n }\n\n if (await this.isStructuralAnomaly(content)) {\n anomalies.push('structural_anomaly');\n }\n\n if (anomalies.length > 0) {\n this.anomalies.push({\n filePath,\n timestamp: new Date(),\n anomalies,\n severity: this.calculateSeverity(anomalies.length)\n });\n\n this.logger.warning(`Anomalies detected in ${filePath}`, { anomalies });\n return true;\n }\n\n return false;\n } catch (error) {\n this.logger.error('Error detecting anomalies', { error });\n return true;\n }\n }\n\n private async isSizeAnomaly(filePath: string, newSize: number): Promise<boolean> {\n const stats = await this.getFileStats(filePath);\n if (!stats) return false;\n\n const avgSize = stats.sizes.reduce((a: number, b: number) => a + b, 0) / stats.sizes.length;\n const stdDev = this.calculateStdDev(stats.sizes, avgSize);\n\n return Math.abs(newSize - avgSize) > (stdDev * 3);\n }\n\n private async isTimingAnomaly(filePath: string): Promise<boolean> {\n const stats = await this.getFileStats(filePath);\n if (!stats) return false;\n\n const now = Date.now();\n const lastAccess = stats.lastAccess || now;\n const timeDiff = now - lastAccess;\n\n const hour = new Date().getHours();\n if (hour >= 1 && hour <= 4) {\n return timeDiff < 300000;\n }\n\n return false;\n }\n\n private async isContentPatternAnomaly(content: Buffer): Promise<boolean> {\n const contentStr = content.toString();\n \n const charDistribution = this.getCharacterDistribution(contentStr);\n \n const normalDistribution = this.getNormalDistribution();\n \n let deviation = 0;\n for (const [char, count] of charDistribution) {\n const normalCount = normalDistribution.get(char) || 0;\n deviation += Math.abs(count - normalCount);\n }\n\n return deviation > 100;\n }\n\n private async isFrequencyAnomaly(filePath: string): Promise<boolean> {\n const stats = await this.getFileStats(filePath);\n if (!stats) return false;\n\n const now = Date.now();\n const recentAccesses = stats.accessTimes.filter(\n (time: number) => now - time < 60000\n );\n\n return recentAccesses.length > 10;\n }\n\n private async isStructuralAnomaly(content: Buffer): Promise<boolean> {\n if (content.length < 100) return false;\n\n const bytes = Array.from(content);\n \n let maxRunLength = 0;\n let currentRun = 1;\n \n for (let i = 1; i < bytes.length; i++) {\n if (bytes[i] === bytes[i - 1]) {\n currentRun++;\n maxRunLength = Math.max(maxRunLength, currentRun);\n } else {\n currentRun = 1;\n }\n }\n\n return maxRunLength > 100;\n }\n\n private async getFileStats(filePath: string): Promise<any> {\n if (!this.baseline.has(filePath)) {\n this.baseline.set(filePath, {\n sizes: [],\n accessTimes: [],\n lastAccess: null,\n firstSeen: new Date()\n });\n }\n\n return this.baseline.get(filePath);\n }\n\n private getCharacterDistribution(text: string): Map<string, number> {\n const distribution = new Map<string, number>();\n \n for (const char of text) {\n distribution.set(char, (distribution.get(char) || 0) + 1);\n }\n \n return distribution;\n }\n\n private getNormalDistribution(): Map<string, number> {\n const normal = new Map<string, number>();\n normal.set('e', 12.7);\n normal.set('t', 9.1);\n normal.set('a', 8.2);\n normal.set('o', 7.5);\n normal.set('i', 7.0);\n normal.set('n', 6.7);\n normal.set('s', 6.3);\n normal.set('h', 6.1);\n normal.set('r', 6.0);\n normal.set('d', 4.3);\n normal.set('l', 4.0);\n normal.set('c', 2.8);\n normal.set('u', 2.8);\n normal.set('m', 2.4);\n normal.set('w', 2.4);\n normal.set('f', 2.2);\n normal.set('g', 2.0);\n normal.set('y', 2.0);\n normal.set('p', 1.9);\n normal.set('b', 1.5);\n normal.set('v', 1.0);\n normal.set('k', 0.8);\n normal.set('j', 0.2);\n normal.set('x', 0.2);\n normal.set('q', 0.1);\n normal.set('z', 0.1);\n \n return normal;\n }\n\n private calculateStdDev(values: number[], mean: number): number {\n const squareDiffs = values.map(value => Math.pow(value - mean, 2));\n const avgSquareDiff = squareDiffs.reduce((a, b) => a + b, 0) / squareDiffs.length;\n return Math.sqrt(avgSquareDiff);\n }\n\n private calculateSeverity(anomalyCount: number): string {\n if (anomalyCount >= 4) return 'critical';\n if (anomalyCount >= 2) return 'high';\n return 'medium';\n }\n\n public updateBaseline(filePath: string, content: Buffer): void {\n if (!this.learningMode) return;\n\n const stats = this.baseline.get(filePath) || {\n sizes: [],\n accessTimes: [],\n lastAccess: null,\n firstSeen: new Date()\n };\n\n stats.sizes.push(content.length);\n stats.accessTimes.push(Date.now());\n stats.lastAccess = Date.now();\n\n if (stats.sizes.length > 100) {\n stats.sizes.shift();\n }\n if (stats.accessTimes.length > 100) {\n stats.accessTimes.shift();\n }\n\n this.baseline.set(filePath, stats);\n }\n\n public getAnomalies(): any[] {\n return [...this.anomalies];\n }\n\n public getStatus(): any {\n return {\n learningMode: this.learningMode,\n baselineCount: this.baseline.size,\n anomaliesDetected: this.anomalies.length,\n learningPeriod: this.learningPeriod\n };\n }\n}"]}
@@ -0,0 +1,14 @@
1
+ export declare class InjectionDetector {
2
+ private readonly logger;
3
+ private readonly suspiciousPatterns;
4
+ private readonly malwareSignatures;
5
+ constructor();
6
+ detectInjection(content: string): Promise<boolean>;
7
+ private hasMalwareSignature;
8
+ private hasSuspiciousPatterns;
9
+ private hasEncodedContent;
10
+ private isObfuscated;
11
+ private isSelfModifying;
12
+ private calculateEntropy;
13
+ }
14
+ //# sourceMappingURL=InjectionDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InjectionDetector.d.ts","sourceRoot":"","sources":["../../src/detectors/InjectionDetector.ts"],"names":[],"mappings":"AAEA,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAEhC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CA4CjC;IAEF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAShC;;IAMW,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkC/D,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,iBAAiB;IA2CzB,OAAO,CAAC,YAAY;IAmCpB,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,gBAAgB;CAiB3B"}
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InjectionDetector = void 0;
4
+ const Logger_1 = require("../utils/Logger");
5
+ class InjectionDetector {
6
+ logger;
7
+ suspiciousPatterns = [
8
+ /eval\s*\(/i,
9
+ /Function\s*\(/i,
10
+ /setTimeout\s*\(\s*['"`]/i,
11
+ /setInterval\s*\(\s*['"`]/i,
12
+ /new\s+Function\s*\(/i,
13
+ /require\(['"][^'"]+['"]\)/i,
14
+ /process\.(binding|dlopen|kill)/i,
15
+ /child_process/,
16
+ /exec(File)?(Sync)?\s*\(/i,
17
+ /spawn(Sync)?\s*\(/i,
18
+ /fork\s*\(/i,
19
+ /vm\.(runIn|create)/i,
20
+ /\[\s*[\s\S]{100,}\s*\]/,
21
+ /String\.fromCharCode/,
22
+ /unescape\s*\(/i,
23
+ /escape\s*\(/i,
24
+ /decodeURI(Component)?\s*\(/i,
25
+ /atob\s*\(/i,
26
+ /btoa\s*\(/i,
27
+ /Buffer\.from\s*\(/i,
28
+ /new\s+Buffer\s*\(/i,
29
+ /__defineGetter__/,
30
+ /__defineSetter__/,
31
+ /__lookupGetter__/,
32
+ /__lookupSetter__/,
33
+ /Object\.(defineProperty|defineProperties)\s*\([^)]*(?:writable:\s*true|configurable:\s*true)/i,
34
+ /Reflect\.(set|defineProperty)/i,
35
+ /Proxy\s*\(/i,
36
+ /WeakMap|WeakSet/,
37
+ /FinalizationRegistry/,
38
+ /WebAssembly/,
39
+ /SharedArrayBuffer/,
40
+ /Atomics\./,
41
+ /globalThis/,
42
+ /global\s*\[/,
43
+ /this\.constructor/,
44
+ /\[\s*['"`]__proto__['"`]\s*\]/i,
45
+ /Object\.setPrototypeOf/,
46
+ /module\.constructor\._load/,
47
+ /process\.mainModule/,
48
+ /require\.cache/,
49
+ /module\.children/,
50
+ /\[\s*['"`]length['"`]\s*\]/
51
+ ];
52
+ malwareSignatures = [
53
+ 'Injection by',
54
+ 'Bypass',
55
+ 'bypass',
56
+ 'Injeksi',
57
+ 'injeksi',
58
+ 'Ultra-Audit V80',
59
+ 'Ghost-FS',
60
+ 'b64'
61
+ ];
62
+ constructor() {
63
+ this.logger = Logger_1.Logger.getInstance();
64
+ }
65
+ async detectInjection(content) {
66
+ try {
67
+ if (this.hasMalwareSignature(content)) {
68
+ this.logger.warning('Malware signature detected');
69
+ return true;
70
+ }
71
+ if (this.hasSuspiciousPatterns(content)) {
72
+ this.logger.warning('Suspicious pattern detected');
73
+ return true;
74
+ }
75
+ if (this.hasEncodedContent(content)) {
76
+ this.logger.warning('Encoded content detected');
77
+ return true;
78
+ }
79
+ if (this.isObfuscated(content)) {
80
+ this.logger.warning('Obfuscated code detected');
81
+ return true;
82
+ }
83
+ if (this.isSelfModifying(content)) {
84
+ this.logger.warning('Self-modifying code detected');
85
+ return true;
86
+ }
87
+ return false;
88
+ }
89
+ catch (error) {
90
+ this.logger.error('Injection detection error', { error });
91
+ return true;
92
+ }
93
+ }
94
+ hasMalwareSignature(content) {
95
+ return this.malwareSignatures.some(signature => content.includes(signature));
96
+ }
97
+ hasSuspiciousPatterns(content) {
98
+ let suspiciousCount = 0;
99
+ for (const pattern of this.suspiciousPatterns) {
100
+ const matches = content.match(new RegExp(pattern.source, 'g')) || [];
101
+ suspiciousCount += matches.length;
102
+ if (suspiciousCount > 5) {
103
+ return true;
104
+ }
105
+ }
106
+ return false;
107
+ }
108
+ hasEncodedContent(content) {
109
+ const base64Pattern = /[A-Za-z0-9+/]{50,}={0,2}/g;
110
+ const base64Matches = content.match(base64Pattern) || [];
111
+ for (const match of base64Matches) {
112
+ try {
113
+ const decoded = Buffer.from(match, 'base64').toString();
114
+ if (this.hasSuspiciousPatterns(decoded)) {
115
+ return true;
116
+ }
117
+ }
118
+ catch {
119
+ }
120
+ }
121
+ const hexPattern = /[0-9a-fA-F]{50,}/g;
122
+ const hexMatches = content.match(hexPattern) || [];
123
+ for (const match of hexMatches) {
124
+ try {
125
+ const decoded = Buffer.from(match, 'hex').toString();
126
+ if (this.hasSuspiciousPatterns(decoded)) {
127
+ return true;
128
+ }
129
+ }
130
+ catch {
131
+ }
132
+ }
133
+ const urlEncodedPattern = /%[0-9a-fA-F]{2}/g;
134
+ const urlMatches = content.match(urlEncodedPattern) || [];
135
+ if (urlMatches.length > 20) {
136
+ try {
137
+ const decoded = decodeURIComponent(content);
138
+ if (this.hasSuspiciousPatterns(decoded)) {
139
+ return true;
140
+ }
141
+ }
142
+ catch {
143
+ }
144
+ }
145
+ return false;
146
+ }
147
+ isObfuscated(content) {
148
+ const entropy = this.calculateEntropy(content);
149
+ if (entropy > 6.5) {
150
+ return true;
151
+ }
152
+ const varNamePattern = /(?:var|let|const)\s+([a-zA-Z_$][0-9a-zA-Z_$]*)/g;
153
+ const varNames = [];
154
+ let match;
155
+ while ((match = varNamePattern.exec(content)) !== null) {
156
+ if (match[1]) {
157
+ varNames.push(match[1]);
158
+ }
159
+ }
160
+ const avgVarLength = varNames.reduce((sum, name) => sum + name.length, 0) / varNames.length;
161
+ if (avgVarLength > 15) {
162
+ return true;
163
+ }
164
+ const lines = content.split('\n');
165
+ if (lines.length === 1 && content.length > 1000) {
166
+ return true;
167
+ }
168
+ const bracketCount = (content.match(/[{}()[\]]/g) || []).length;
169
+ const bracketRatio = bracketCount / content.length;
170
+ if (bracketRatio > 0.3) {
171
+ return true;
172
+ }
173
+ return false;
174
+ }
175
+ isSelfModifying(content) {
176
+ const selfModifyingPatterns = [
177
+ /Function\s*\(['"`][^)]*['"`]\s*\)/,
178
+ /eval\s*\(/,
179
+ /new\s+Function/,
180
+ /writeFileSync.*__filename/,
181
+ /unlinkSync.*__filename/,
182
+ /require\(['"`]fs['"`]\)/,
183
+ /process\.argv/,
184
+ /module\.exports\s*=/,
185
+ /exports\.[a-zA-Z_]+\s*=/
186
+ ];
187
+ return selfModifyingPatterns.some(pattern => pattern.test(content));
188
+ }
189
+ calculateEntropy(content) {
190
+ const frequencies = {};
191
+ for (const char of content) {
192
+ frequencies[char] = (frequencies[char] || 0) + 1;
193
+ }
194
+ let entropy = 0;
195
+ const length = content.length;
196
+ for (const freq of Object.values(frequencies)) {
197
+ const probability = freq / length;
198
+ entropy -= probability * Math.log2(probability);
199
+ }
200
+ return entropy;
201
+ }
202
+ }
203
+ exports.InjectionDetector = InjectionDetector;
204
+ //# sourceMappingURL=InjectionDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InjectionDetector.js","sourceRoot":"","sources":["../../src/detectors/InjectionDetector.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from '../utils/Logger';\n\nexport class InjectionDetector {\n private readonly logger: Logger;\n \n private readonly suspiciousPatterns = [\n /eval\\s*\\(/i,\n /Function\\s*\\(/i,\n /setTimeout\\s*\\(\\s*['\"`]/i,\n /setInterval\\s*\\(\\s*['\"`]/i,\n /new\\s+Function\\s*\\(/i,\n /require\\(['\"][^'\"]+['\"]\\)/i,\n /process\\.(binding|dlopen|kill)/i,\n /child_process/,\n /exec(File)?(Sync)?\\s*\\(/i,\n /spawn(Sync)?\\s*\\(/i,\n /fork\\s*\\(/i,\n /vm\\.(runIn|create)/i,\n /\\[\\s*[\\s\\S]{100,}\\s*\\]/,\n /String\\.fromCharCode/,\n /unescape\\s*\\(/i,\n /escape\\s*\\(/i,\n /decodeURI(Component)?\\s*\\(/i,\n /atob\\s*\\(/i,\n /btoa\\s*\\(/i,\n /Buffer\\.from\\s*\\(/i,\n /new\\s+Buffer\\s*\\(/i,\n /__defineGetter__/,\n /__defineSetter__/,\n /__lookupGetter__/,\n /__lookupSetter__/,\n /Object\\.(defineProperty|defineProperties)\\s*\\([^)]*(?:writable:\\s*true|configurable:\\s*true)/i,\n /Reflect\\.(set|defineProperty)/i,\n /Proxy\\s*\\(/i,\n /WeakMap|WeakSet/,\n /FinalizationRegistry/,\n /WebAssembly/,\n /SharedArrayBuffer/,\n /Atomics\\./,\n /globalThis/,\n /global\\s*\\[/,\n /this\\.constructor/,\n /\\[\\s*['\"`]__proto__['\"`]\\s*\\]/i,\n /Object\\.setPrototypeOf/,\n /module\\.constructor\\._load/,\n /process\\.mainModule/,\n /require\\.cache/,\n /module\\.children/,\n /\\[\\s*['\"`]length['\"`]\\s*\\]/\n ];\n\n private readonly malwareSignatures = [\n 'Injection by',\n 'Bypass',\n 'bypass',\n 'Injeksi',\n 'injeksi',\n 'Ultra-Audit V80',\n 'Ghost-FS',\n 'b64'\n ];\n\n constructor() {\n this.logger = Logger.getInstance();\n }\n\n public async detectInjection(content: string): Promise<boolean> {\n try {\n if (this.hasMalwareSignature(content)) {\n this.logger.warning('Malware signature detected');\n return true;\n }\n\n if (this.hasSuspiciousPatterns(content)) {\n this.logger.warning('Suspicious pattern detected');\n return true;\n }\n\n if (this.hasEncodedContent(content)) {\n this.logger.warning('Encoded content detected');\n return true;\n }\n\n if (this.isObfuscated(content)) {\n this.logger.warning('Obfuscated code detected');\n return true;\n }\n\n if (this.isSelfModifying(content)) {\n this.logger.warning('Self-modifying code detected');\n return true;\n }\n\n return false;\n } catch (error) {\n this.logger.error('Injection detection error', { error });\n return true;\n }\n }\n\n private hasMalwareSignature(content: string): boolean {\n return this.malwareSignatures.some(signature => \n content.includes(signature)\n );\n }\n\n private hasSuspiciousPatterns(content: string): boolean {\n let suspiciousCount = 0;\n \n for (const pattern of this.suspiciousPatterns) {\n const matches = content.match(new RegExp(pattern.source, 'g')) || [];\n suspiciousCount += matches.length;\n \n if (suspiciousCount > 5) {\n return true;\n }\n }\n \n return false;\n }\n\n private hasEncodedContent(content: string): boolean {\n const base64Pattern = /[A-Za-z0-9+/]{50,}={0,2}/g;\n const base64Matches = content.match(base64Pattern) || [];\n \n for (const match of base64Matches) {\n try {\n const decoded = Buffer.from(match, 'base64').toString();\n if (this.hasSuspiciousPatterns(decoded)) {\n return true;\n }\n } catch {\n }\n }\n \n const hexPattern = /[0-9a-fA-F]{50,}/g;\n const hexMatches = content.match(hexPattern) || [];\n \n for (const match of hexMatches) {\n try {\n const decoded = Buffer.from(match, 'hex').toString();\n if (this.hasSuspiciousPatterns(decoded)) {\n return true;\n }\n } catch {\n }\n }\n \n const urlEncodedPattern = /%[0-9a-fA-F]{2}/g;\n const urlMatches = content.match(urlEncodedPattern) || [];\n \n if (urlMatches.length > 20) {\n try {\n const decoded = decodeURIComponent(content);\n if (this.hasSuspiciousPatterns(decoded)) {\n return true;\n }\n } catch {\n }\n }\n \n return false;\n }\n\n private isObfuscated(content: string): boolean {\n const entropy = this.calculateEntropy(content);\n if (entropy > 6.5) {\n return true;\n }\n \n const varNamePattern = /(?:var|let|const)\\s+([a-zA-Z_$][0-9a-zA-Z_$]*)/g;\n const varNames: string[] = [];\n let match;\n \n while ((match = varNamePattern.exec(content)) !== null) {\n if (match[1]) {\n varNames.push(match[1]);\n }\n }\n \n const avgVarLength = varNames.reduce((sum, name) => sum + name.length, 0) / varNames.length;\n if (avgVarLength > 15) {\n return true;\n }\n \n const lines = content.split('\\n');\n if (lines.length === 1 && content.length > 1000) {\n return true;\n }\n \n const bracketCount = (content.match(/[{}()[\\]]/g) || []).length;\n const bracketRatio = bracketCount / content.length;\n if (bracketRatio > 0.3) {\n return true;\n }\n \n return false;\n }\n\n private isSelfModifying(content: string): boolean {\n const selfModifyingPatterns = [\n /Function\\s*\\(['\"`][^)]*['\"`]\\s*\\)/,\n /eval\\s*\\(/,\n /new\\s+Function/,\n /writeFileSync.*__filename/,\n /unlinkSync.*__filename/,\n /require\\(['\"`]fs['\"`]\\)/,\n /process\\.argv/,\n /module\\.exports\\s*=/,\n /exports\\.[a-zA-Z_]+\\s*=/\n ];\n \n return selfModifyingPatterns.some(pattern => pattern.test(content));\n }\n\n private calculateEntropy(content: string): number {\n const frequencies: { [key: string]: number } = {};\n \n for (const char of content) {\n frequencies[char] = (frequencies[char] || 0) + 1;\n }\n \n let entropy = 0;\n const length = content.length;\n \n for (const freq of Object.values(frequencies)) {\n const probability = freq / length;\n entropy -= probability * Math.log2(probability);\n }\n \n return entropy;\n }\n}"]}
@@ -0,0 +1,28 @@
1
+ export declare class PatternMatcher {
2
+ private readonly logger;
3
+ private readonly patterns;
4
+ private readonly signatures;
5
+ private readonly heuristics;
6
+ constructor();
7
+ private initializePatterns;
8
+ private initializeSignatures;
9
+ private initializeHeuristics;
10
+ matchPatterns(content: string, type: string): boolean;
11
+ matchSignatures(content: string, type: string): boolean;
12
+ applyHeuristics(content: string): Map<string, boolean>;
13
+ comprehensiveScan(content: string): {
14
+ matched: boolean;
15
+ findings: Array<{
16
+ type: string;
17
+ pattern: string;
18
+ severity: string;
19
+ }>;
20
+ score: number;
21
+ };
22
+ private getSeverity;
23
+ private getWeight;
24
+ getPatterns(): string[];
25
+ getSignatures(): string[];
26
+ getHeuristics(): string[];
27
+ }
28
+ //# sourceMappingURL=PatternMatcher.d.ts.map