mirror of
https://dev.lirent.ru/Vatrog/vm-introspection-engine.git
synced 2026-07-09 03:56:36 +03:00
Define the win32 engine; add a dump source and physical sigscan
Name and isolate the Windows engine as one of potentially several. The public surface moves to include/win32.h with an opaque vmie_win32 handle (vmie_win32_open/close/mem); the engine's Windows internals — host bring-up, the struct-offset profile, process/module/PE/text decode — live under src/engine/win32. The generic address-space layer stays in src/engine (gva.c + engine-arch.h, carrying no offset table): gva.c is de-profiled, and CR3 bring-up reaches the hot translator through a cold gva_translate bridge so the zero-copy hot path stays private and inlinable. A memory source is now first-class and public: vmie_mem_open/_open_segs/ _close open a flat dump (or an explicit segment map) as a vmie_mem, with gpa_seg promoted to the public contract. The physical signature scan is exposed source-agnostically: sig_scan_mem returns GPAs for any vmie_mem, sig_scan_sources scans several sources with per-source attribution, and sig_from_bytes builds an exact needle from a byte span. The pure matcher is unchanged; dumps and the live engine image are scanned uniformly, neither needing the other.
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
@@ -147,3 +148,43 @@ void gpa_close(vmie_mem* m) {
|
||||
|
||||
clean_ctx(m);
|
||||
}
|
||||
|
||||
/* ---- public dump source (heap-owned vmie_mem) ---------------------------- *
|
||||
* Thin wrappers over gpa_open*: heap-allocate a vmie_mem and open into it, so a
|
||||
* dump (or any flat/segmented RAM image) is a first-class memory source for the
|
||||
* physical scanners without exposing the win32 engine. */
|
||||
|
||||
__attribute__((cold))
|
||||
vmie_mem* vmie_mem_open(const char* path, uint64_t low) {
|
||||
vmie_mem* m = calloc(1, sizeof *m);
|
||||
if (!m) {
|
||||
return NULL;
|
||||
}
|
||||
if (gpa_open(m, path, (uintptr_t)low)) {
|
||||
free(m);
|
||||
return NULL;
|
||||
}
|
||||
return m;
|
||||
}
|
||||
|
||||
__attribute__((cold))
|
||||
vmie_mem* vmie_mem_open_segs(const char* path, const gpa_seg* segs, int nseg) {
|
||||
vmie_mem* m = calloc(1, sizeof *m);
|
||||
if (!m) {
|
||||
return NULL;
|
||||
}
|
||||
if (gpa_open_segs(m, path, segs, nseg)) {
|
||||
free(m);
|
||||
return NULL;
|
||||
}
|
||||
return m;
|
||||
}
|
||||
|
||||
__attribute__((cold))
|
||||
void vmie_mem_close(vmie_mem* m) {
|
||||
if (!m) {
|
||||
return;
|
||||
}
|
||||
gpa_close(m);
|
||||
free(m);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user