V8-Entwickler stellten einen Dekompiler für WebAssembly vor

Entwickler der V8-JavaScript-Engine eingereicht Nützlichkeit wasm-dekompilieren, wodurch Sie die binäre Zwischendarstellung dekompilieren können WebAssembly in eine lesbare Pseudosprache, die an JavaScript und C erinnert. Die vorgeschlagene Pseudosprache ist viel einfacher zu verstehen und besser für die manuelle Analyse geeignet als die Textdarstellung von WebAssembly im „.wat“-Format, das eher der Assemblersprache als den Hochsprachen ähnelt. In diesem Fall spiegelt die Dekompilierung die Wasm-Darstellung möglichst vollständig wider.

Dekompiler inbegriffen im Toolkit enthalten WABT, das die Übersetzung zwischen Binär- und Textdarstellungen von WebAssembly sowie das Parsen, Verarbeiten, Ändern und Überprüfen von WASM-Dateien ermöglicht. WABT entwickelt außerdem ein Dienstprogramm wasm2c, was die Dekompilierung von WASM-Dateien in äquivalenten C-Code ermöglicht, der von einem C-Compiler kompiliert werden kann, sich aber hinsichtlich der Lesbarkeit nicht wesentlich von der Textdarstellung von „wat“ unterscheidet.

Zum Beispiel die ursprüngliche C-Funktion, kompiliert in wasm

typedef struct { float x, y, z; } vec3;

float dot(const vec3 *a, const vec3 *b) {
gib a->x * b->x + zurück
a->y * b->y +
a->z * b->z;
}

wird vom Dienstprogramm wasm-decompile in eine Pseudosprache dekompiliert

Funktion dot(a:{ a:float, b:float, c:float },
b:{ a:float, b:float, c:float }):float {
Rückkehr aa * ba + ab * bb + ac * bc
}

während die Konvertierung in das Textformat „.wat“ so aussehen würde

(func $dot (Typ 0) (param i32 i32) (Ergebnis f32)
(f32.add
(f32.add
(f32.mul
(f32.load
(local.get 0))
(f32.load
(local.get 1)))
(f32.mul
(f32.load offset=4
(local.get 0))
(f32.load offset=4
(local.get 1))))
(f32.mul
(f32.load offset=8
(local.get 0))
(f32.load offset=8
(local.get 1))))))

Source: opennet.ru

Kommentar hinzufügen