-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathuseMalwareAnalysis.js
More file actions
151 lines (131 loc) · 3.9 KB
/
Copy pathuseMalwareAnalysis.js
File metadata and controls
151 lines (131 loc) · 3.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
import { ref, computed, onUnmounted } from 'vue'
import { uploadFiles, predictFiles } from '@/api'
function isAllowedExeFile(file) {
return file.name.toLowerCase().endsWith('.exe')
}
export function useMalwareAnalysis() {
const files = ref([])
const uploadError = ref(null)
const isProcessing = ref(false)
const progress = ref(0)
const statusMessage = ref('')
const results = ref([])
const activeFileIndex = ref(0)
let phaseTimers = []
function clearPhaseTimers() {
phaseTimers.forEach(clearTimeout)
phaseTimers = []
}
onUnmounted(() => {
clearPhaseTimers()
})
function addFiles(rawFiles) {
uploadError.value = null
const arr = Array.from(rawFiles)
const allowed = arr.filter(isAllowedExeFile)
const rejectedCount = arr.length - allowed.length
if (!allowed.length) {
if (rejectedCount > 0) {
uploadError.value = 'Only Windows PE (.exe) executables are accepted.'
}
return
}
if (rejectedCount > 0) {
uploadError.value = `${rejectedCount} file(s) skipped — only .exe is supported.`
}
for (const f of allowed) {
const dup = files.value.some((x) => x.name === f.name && x.size === f.size)
if (!dup) files.value.push(f)
}
}
function removeFile(index) {
files.value.splice(index, 1)
if (!files.value.length) {
results.value = []
activeFileIndex.value = 0
}
}
function schedulePhase(ms, fn) {
const id = setTimeout(fn, ms)
phaseTimers.push(id)
return id
}
async function runAnalysis() {
if (!files.value.length || isProcessing.value) return
uploadError.value = null
isProcessing.value = true
results.value = []
progress.value = 8
statusMessage.value = 'Parsing binary structure...'
clearPhaseTimers()
schedulePhase(350, () => {
progress.value = 22
statusMessage.value = 'Vectorizing byte stream to image tensor...'
})
schedulePhase(750, () => {
progress.value = 38
statusMessage.value = 'Preparing CNN inference graph...'
})
try {
await uploadFiles(files.value)
progress.value = 48
statusMessage.value = 'Running convolutional classifier...'
const response = await predictFiles(files.value)
clearPhaseTimers()
progress.value = 82
statusMessage.value = 'Aggregating threat score...'
results.value = response.data.results || []
activeFileIndex.value = 0
await new Promise((r) => setTimeout(r, 280))
progress.value = 100
const maxScore = Math.max(0, ...results.value.map((r) => r.prediction ?? 0))
statusMessage.value =
maxScore >= 0.5
? 'Classification complete — elevated malware probability'
: 'Classification complete — within benign threshold'
} catch (err) {
console.error(err)
clearPhaseTimers()
uploadError.value =
err.response?.data?.detail ||
err.message ||
'Analysis failed. Check that the API is reachable and the sample is a valid PE executable.'
statusMessage.value = ''
results.value = []
} finally {
setTimeout(() => {
isProcessing.value = false
progress.value = 0
if (results.value.length) {
statusMessage.value = 'Ready'
} else if (!uploadError.value) {
statusMessage.value = ''
}
}, 500)
}
}
const activeResult = computed(() => {
if (!results.value.length) return null
const i = Math.min(activeFileIndex.value, results.value.length - 1)
return results.value[i]
})
const activeFile = computed(() => {
if (!files.value.length) return null
const i = Math.min(activeFileIndex.value, files.value.length - 1)
return files.value[i]
})
return {
files,
uploadError,
isProcessing,
progress,
statusMessage,
results,
activeFileIndex,
activeResult,
activeFile,
addFiles,
removeFile,
runAnalysis,
}
}