From 5185d5a208d733043bb119a85ee02533fbb78f63 Mon Sep 17 00:00:00 2001 From: Duncan Ogilvie Date: Sat, 27 May 2023 13:35:39 +0200 Subject: [PATCH] Initial commit --- .gitignore | 4 + .gitmodules | 3 + Cargo.lock | 808 ++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 11 + icicle-emu | 1 + src/main.rs | 356 ++++++++++++++++++++++ src/rawenv.rs | 59 ++++ 7 files changed, 1242 insertions(+) create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 160000 icicle-emu create mode 100644 src/main.rs create mode 100644 src/rawenv.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..01d51c4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +target/ +debug/ +**/*.rs.bk \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..2c1b98b --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "icicle-emu"] + path = icicle-emu + url = https://github.com/mrexodia/icicle-emu diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..d88a6a4 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,808 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "cpp_demangle", + "fallible-iterator", + "gimli", + "memmap2", + "object", + "rustc-demangle", + "smallvec", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", +] + +[[package]] +name = "anyhow" +version = "1.0.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6776fc96284a0bb647b615056fc496d1fe1644a7ab01829818a6d91cae888b84" + +[[package]] +name = "bstr" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a246e68bb43f6cd9db24bea052a53e40405417c5fb372e3d1a8a7f770a564ef5" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" + +[[package]] +name = "bytemuck" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cpp_demangle" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c76f98bdfc7f66172e6c7065f981ebb576ffc903fe4c0561d9f0c2509226dc6" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "cranelift" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50babaf4da30fd349e1b913760300266143535f15a0b7be7ce1ce9efafa8ff5e" +dependencies = [ + "cranelift-codegen", + "cranelift-frontend", +] + +[[package]] +name = "cranelift-bforest" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1277fbfa94bc82c8ec4af2ded3e639d49ca5f7f3c7eeab2c66accd135ece4e70" +dependencies = [ + "cranelift-entity", +] + +[[package]] +name = "cranelift-codegen" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6e8c31ad3b2270e9aeec38723888fe1b0ace3bea2b06b3f749ccf46661d3220" +dependencies = [ + "bumpalo", + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-entity", + "cranelift-isle", + "gimli", + "hashbrown 0.13.2", + "log", + "regalloc2", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ac5ac30d62b2d66f12651f6b606dbdfd9c2cfd0908de6b387560a277c5c9da" +dependencies = [ + "cranelift-codegen-shared", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd82b8b376247834b59ed9bdc0ddeb50f517452827d4a11bccf5937b213748b8" + +[[package]] +name = "cranelift-entity" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40099d38061b37e505e63f89bab52199037a72b931ad4868d9089ff7268660b0" + +[[package]] +name = "cranelift-frontend" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a25d9d0a0ae3079c463c34115ec59507b4707175454f0eee0891e83e30e82d" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-isle" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80de6a7d0486e4acbd5f9f87ec49912bf4c8fb6aea00087b989685460d4469ba" + +[[package]] +name = "cranelift-jit" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ca96b05988aa057eda09a817a6e31915fabd7f476b513123aff08053cd193dd" +dependencies = [ + "anyhow", + "cranelift-codegen", + "cranelift-entity", + "cranelift-module", + "cranelift-native", + "libc", + "log", + "region", + "target-lexicon", + "wasmtime-jit-icache-coherence", + "windows-sys", +] + +[[package]] +name = "cranelift-module" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5112c0be9cc5da064e0620570d67852f11ce44f2e572a58ecf7f11df73978b8" +dependencies = [ + "anyhow", + "cranelift-codegen", +] + +[[package]] +name = "cranelift-native" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb6b03e0e03801c4b3fd8ce0758a94750c07a44e7944cc0ffbf0d3f2e7c79b00" +dependencies = [ + "cranelift-codegen", + "libc", + "target-lexicon", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gimli" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" +dependencies = [ + "fallible-iterator", + "indexmap", + "stable_deref_trait", +] + +[[package]] +name = "half" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0" +dependencies = [ + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "icicle-cpu" +version = "0.1.0" +dependencies = [ + "addr2line", + "bitflags 2.3.1", + "bytemuck", + "half", + "hashbrown 0.13.2", + "icicle-mem", + "object", + "pcode", + "sleigh-runtime", + "target-lexicon", + "tracing", +] + +[[package]] +name = "icicle-jit" +version = "0.2.0" +dependencies = [ + "cranelift", + "cranelift-codegen", + "cranelift-jit", + "cranelift-module", + "cranelift-native", + "icicle-cpu", + "memoffset", + "pcode", + "target-lexicon", + "tracing", +] + +[[package]] +name = "icicle-linux" +version = "0.1.0" +dependencies = [ + "bitflags 2.3.1", + "bstr", + "bytemuck", + "icicle-cpu", + "object", + "pcode", + "sleigh-runtime", + "target-lexicon", + "tracing", +] + +[[package]] +name = "icicle-mem" +version = "0.3.0" +dependencies = [ + "tracing", +] + +[[package]] +name = "icicle-unicorn" +version = "0.1.0" +dependencies = [ + "icicle-cpu", + "icicle-vm", + "pcode", +] + +[[package]] +name = "icicle-vm" +version = "0.2.0" +dependencies = [ + "anyhow", + "icicle-cpu", + "icicle-jit", + "icicle-linux", + "object", + "pcode", + "serde", + "serde-xml-rs", + "sleigh-compile", + "sleigh-runtime", + "target-lexicon", + "tracing", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "libc" +version = "0.2.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "crc32fast", + "flate2", + "hashbrown 0.13.2", + "indexmap", + "memchr", + "ruzstd", +] + +[[package]] +name = "once_cell" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + +[[package]] +name = "pcode" +version = "0.2.0" + +[[package]] +name = "petgraph" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "proc-macro2" +version = "1.0.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regalloc2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80535183cae11b149d618fbd3c37e38d7cda589d82d7769e196ca9a9042d7621" +dependencies = [ + "fxhash", + "log", + "slice-group-by", + "smallvec", +] + +[[package]] +name = "region" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877e54ea2adcd70d80e9179344c97f93ef0dffd6b03e1f4529e6e83ab2fa9ae0" +dependencies = [ + "bitflags 1.3.2", + "libc", + "mach", + "winapi", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "ruzstd" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a15e661f0f9dac21f3494fe5d23a6338c0ac116a2d22c2b63010acd89467ffe" +dependencies = [ + "byteorder", + "thiserror", + "twox-hash", +] + +[[package]] +name = "serde" +version = "1.0.163" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-xml-rs" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb3aa78ecda1ebc9ec9847d5d3aba7d618823446a049ba2491940506da6e2782" +dependencies = [ + "log", + "serde", + "thiserror", + "xml-rs", +] + +[[package]] +name = "serde_derive" +version = "1.0.163" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sleigh-compile" +version = "0.3.0" +dependencies = [ + "pcode", + "petgraph", + "sleigh-parse", + "sleigh-runtime", +] + +[[package]] +name = "sleigh-parse" +version = "0.3.0" + +[[package]] +name = "sleigh-runtime" +version = "0.1.0" +dependencies = [ + "pcode", + "sleigh-parse", +] + +[[package]] +name = "slice-group-by" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "syn" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "target-lexicon" +version = "0.12.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" + +[[package]] +name = "thiserror" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" + +[[package]] +name = "twox-hash" +version = "1.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +dependencies = [ + "cfg-if", + "static_assertions", +] + +[[package]] +name = "unicode-ident" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasmtime-jit-icache-coherence" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aecae978b13f7f67efb23bd827373ace4578f2137ec110bbf6a4a7cde4121bbd" +dependencies = [ + "cfg-if", + "libc", + "windows-sys", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "xml-rs" +version = "0.8.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d8f380ae16a37b30e6a2cf67040608071384b1450c189e61bea3ff57cde922d" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..448cfa9 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "icicle-unicorn" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +icicle-cpu = { path = "icicle-emu/icicle-cpu" } +icicle-vm = { path = "icicle-emu/icicle-vm" } +pcode = { path = "icicle-emu/sleigh/pcode" } \ No newline at end of file diff --git a/icicle-emu b/icicle-emu new file mode 160000 index 0000000..9c97c94 --- /dev/null +++ b/icicle-emu @@ -0,0 +1 @@ +Subproject commit 9c97c94c8ceade509877a763f94c6edb441c1351 diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..dcdf5d1 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,356 @@ +use std::thread::sleep; +use icicle_vm::cpu::{Environment, ExceptionCode}; +use icicle_vm::cpu::mem::{AllocLayout, Mapping, perm}; +use icicle_vm::linux::LinuxCpu; +use icicle_vm::VmExit; +use crate::rawenv::RawEnvironment; + +use std::time::{Duration, SystemTime}; + +mod rawenv; + +fn main() { + // Setup the CPU state for the target triple + let mut cpu_config = icicle_vm::cpu::Config::from_target_triple("x86_64-none"); + cpu_config.enable_jit = true; + cpu_config.enable_recompilation = false; + + let mut vm = icicle_vm::build(&cpu_config).unwrap(); + + let shellcode: [u8; 2780] = + [ + 0x48, 0x89, 0x5C, 0x24, 0x08, 0x48, 0x89, 0x74, 0x24, 0x10, 0x48, 0x89, + 0x7C, 0x24, 0x18, 0x55, 0x48, 0x8B, 0xEC, 0x48, 0x83, 0xEC, 0x10, 0xB8, + 0x63, 0x72, 0x65, 0x61, 0xC7, 0x45, 0xF0, 0x37, 0x13, 0x00, 0x00, 0x41, + 0xBA, 0x62, 0x69, 0x6E, 0x67, 0xC7, 0x45, 0xF4, 0x69, 0x00, 0x00, 0x00, + 0xC7, 0x45, 0xF8, 0x20, 0x04, 0x00, 0x00, 0xBB, 0x80, 0x96, 0x98, 0x00, + 0xC7, 0x45, 0xFC, 0x66, 0x06, 0x00, 0x00, 0xBE, 0x40, 0x6E, 0xDE, 0x8D, + 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x33, 0xC9, 0x45, + 0x33, 0xC0, 0x45, 0x8D, 0x59, 0x04, 0x66, 0x0F, 0x1F, 0x44, 0x00, 0x00, + 0x41, 0x83, 0xE0, 0x03, 0x8B, 0xC8, 0xC1, 0xE1, 0x04, 0x8B, 0xD0, 0xC1, + 0xEA, 0x05, 0x33, 0xD1, 0x42, 0x8B, 0x4C, 0x85, 0xF0, 0x03, 0xD0, 0x41, + 0x03, 0xC9, 0x41, 0x81, 0xC1, 0xB9, 0x79, 0x37, 0x9E, 0x33, 0xD1, 0x45, + 0x8B, 0xC1, 0x44, 0x03, 0xD2, 0x41, 0x83, 0xE0, 0x03, 0x41, 0x8B, 0xCA, + 0x41, 0x8B, 0xD2, 0xC1, 0xE1, 0x04, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x41, + 0x8B, 0xC9, 0x48, 0xC1, 0xE9, 0x0B, 0x41, 0x03, 0xD2, 0x83, 0xE1, 0x03, + 0x8B, 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xC9, 0x33, 0xD1, 0x03, 0xC2, 0x8B, + 0xC8, 0x8B, 0xD0, 0xC1, 0xE1, 0x04, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x42, + 0x8B, 0x4C, 0x85, 0xF0, 0x41, 0x03, 0xC9, 0x03, 0xD0, 0x33, 0xD1, 0x41, + 0x81, 0xC1, 0xB9, 0x79, 0x37, 0x9E, 0x44, 0x03, 0xD2, 0x45, 0x8B, 0xC1, + 0x41, 0x8B, 0xCA, 0x41, 0x83, 0xE0, 0x03, 0xC1, 0xE1, 0x04, 0x41, 0x8B, + 0xD2, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x41, 0x8B, 0xC9, 0x48, 0xC1, 0xE9, + 0x0B, 0x41, 0x03, 0xD2, 0x83, 0xE1, 0x03, 0x8B, 0x4C, 0x8D, 0xF0, 0x41, + 0x03, 0xC9, 0x33, 0xD1, 0x03, 0xC2, 0x8B, 0xC8, 0x8B, 0xD0, 0xC1, 0xE1, + 0x04, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x42, 0x8B, 0x4C, 0x85, 0xF0, 0x41, + 0x03, 0xC9, 0x03, 0xD0, 0x33, 0xD1, 0x41, 0x81, 0xC1, 0xB9, 0x79, 0x37, + 0x9E, 0x44, 0x03, 0xD2, 0x45, 0x8B, 0xC1, 0x41, 0x8B, 0xCA, 0x41, 0x8B, + 0xD2, 0xC1, 0xE1, 0x04, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x41, 0x8B, 0xC9, + 0x48, 0xC1, 0xE9, 0x0B, 0x41, 0x03, 0xD2, 0x83, 0xE1, 0x03, 0x8B, 0x4C, + 0x8D, 0xF0, 0x41, 0x03, 0xC9, 0x33, 0xD1, 0x03, 0xC2, 0x8B, 0xD0, 0x8B, + 0xC8, 0xC1, 0xEA, 0x05, 0xC1, 0xE1, 0x04, 0x41, 0x83, 0xE0, 0x03, 0x33, + 0xD1, 0x03, 0xD0, 0x42, 0x8B, 0x4C, 0x85, 0xF0, 0x41, 0x03, 0xC9, 0x41, + 0x81, 0xC1, 0xB9, 0x79, 0x37, 0x9E, 0x33, 0xD1, 0x45, 0x8B, 0xC1, 0x44, + 0x03, 0xD2, 0x41, 0x83, 0xE0, 0x03, 0x41, 0x8B, 0xCA, 0x41, 0x8B, 0xD2, + 0xC1, 0xE1, 0x04, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x41, 0x8B, 0xC9, 0x48, + 0xC1, 0xE9, 0x0B, 0x41, 0x03, 0xD2, 0x83, 0xE1, 0x03, 0x8B, 0x4C, 0x8D, + 0xF0, 0x41, 0x03, 0xC9, 0x33, 0xD1, 0x03, 0xC2, 0x8B, 0xC8, 0x8B, 0xD0, + 0xC1, 0xE1, 0x04, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x42, 0x8B, 0x4C, 0x85, + 0xF0, 0x41, 0x03, 0xC9, 0x03, 0xD0, 0x33, 0xD1, 0x41, 0x81, 0xC1, 0xB9, + 0x79, 0x37, 0x9E, 0x44, 0x03, 0xD2, 0x45, 0x8B, 0xC1, 0x41, 0x8B, 0xCA, + 0x41, 0x83, 0xE0, 0x03, 0xC1, 0xE1, 0x04, 0x41, 0x8B, 0xD2, 0xC1, 0xEA, + 0x05, 0x33, 0xD1, 0x41, 0x8B, 0xC9, 0x48, 0xC1, 0xE9, 0x0B, 0x41, 0x03, + 0xD2, 0x83, 0xE1, 0x03, 0x8B, 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xC9, 0x33, + 0xD1, 0x03, 0xC2, 0x8B, 0xC8, 0x8B, 0xD0, 0xC1, 0xE1, 0x04, 0xC1, 0xEA, + 0x05, 0x33, 0xD1, 0x42, 0x8B, 0x4C, 0x85, 0xF0, 0x41, 0x03, 0xC9, 0x03, + 0xD0, 0x33, 0xD1, 0x41, 0x81, 0xC1, 0xB9, 0x79, 0x37, 0x9E, 0x44, 0x03, + 0xD2, 0x45, 0x8B, 0xC1, 0x41, 0x8B, 0xCA, 0x41, 0x8B, 0xD2, 0xC1, 0xE1, + 0x04, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x41, 0x8B, 0xC9, 0x48, 0xC1, 0xE9, + 0x0B, 0x41, 0x03, 0xD2, 0x83, 0xE1, 0x03, 0x8B, 0x4C, 0x8D, 0xF0, 0x41, + 0x03, 0xC9, 0x33, 0xD1, 0x03, 0xC2, 0x8B, 0xD0, 0x8B, 0xC8, 0xC1, 0xEA, + 0x05, 0xC1, 0xE1, 0x04, 0x33, 0xD1, 0x03, 0xD0, 0x41, 0x83, 0xE0, 0x03, + 0x42, 0x8B, 0x4C, 0x85, 0xF0, 0x41, 0x03, 0xC9, 0x41, 0x81, 0xC1, 0xB9, + 0x79, 0x37, 0x9E, 0x33, 0xD1, 0x45, 0x8B, 0xC1, 0x44, 0x03, 0xD2, 0x41, + 0x83, 0xE0, 0x03, 0x41, 0x8B, 0xCA, 0x41, 0x8B, 0xD2, 0xC1, 0xE1, 0x04, + 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x41, 0x8B, 0xC9, 0x48, 0xC1, 0xE9, 0x0B, + 0x41, 0x03, 0xD2, 0x83, 0xE1, 0x03, 0x8B, 0x4C, 0x8D, 0xF0, 0x41, 0x03, + 0xC9, 0x33, 0xD1, 0x03, 0xC2, 0x8B, 0xC8, 0x8B, 0xD0, 0xC1, 0xE1, 0x04, + 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x42, 0x8B, 0x4C, 0x85, 0xF0, 0x41, 0x03, + 0xC9, 0x03, 0xD0, 0x33, 0xD1, 0x41, 0x81, 0xC1, 0xB9, 0x79, 0x37, 0x9E, + 0x44, 0x03, 0xD2, 0x45, 0x8B, 0xC1, 0x41, 0x83, 0xE0, 0x03, 0x41, 0x8B, + 0xCA, 0xC1, 0xE1, 0x04, 0x41, 0x8B, 0xD2, 0xC1, 0xEA, 0x05, 0x33, 0xD1, + 0x41, 0x8B, 0xC9, 0x48, 0xC1, 0xE9, 0x0B, 0x41, 0x03, 0xD2, 0x83, 0xE1, + 0x03, 0x8B, 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xC9, 0x33, 0xD1, 0x03, 0xC2, + 0x8B, 0xC8, 0x8B, 0xD0, 0xC1, 0xE1, 0x04, 0xC1, 0xEA, 0x05, 0x33, 0xD1, + 0x42, 0x8B, 0x4C, 0x85, 0xF0, 0x41, 0x03, 0xC9, 0x03, 0xD0, 0x33, 0xD1, + 0x41, 0x81, 0xC1, 0xB9, 0x79, 0x37, 0x9E, 0x44, 0x03, 0xD2, 0x45, 0x8B, + 0xC1, 0x41, 0x8B, 0xCA, 0x41, 0x83, 0xE0, 0x03, 0xC1, 0xE1, 0x04, 0x41, + 0x8B, 0xD2, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x41, 0x8B, 0xC9, 0x48, 0xC1, + 0xE9, 0x0B, 0x41, 0x03, 0xD2, 0x83, 0xE1, 0x03, 0x8B, 0x4C, 0x8D, 0xF0, + 0x41, 0x03, 0xC9, 0x33, 0xD1, 0x03, 0xC2, 0x8B, 0xD0, 0x8B, 0xC8, 0xC1, + 0xEA, 0x05, 0xC1, 0xE1, 0x04, 0x33, 0xD1, 0x42, 0x8B, 0x4C, 0x85, 0xF0, + 0x03, 0xD0, 0x41, 0x03, 0xC9, 0x33, 0xD1, 0x41, 0x81, 0xC1, 0xB9, 0x79, + 0x37, 0x9E, 0x44, 0x03, 0xD2, 0x45, 0x8B, 0xC1, 0x41, 0x83, 0xE0, 0x03, + 0x41, 0x8B, 0xCA, 0xC1, 0xE1, 0x04, 0x41, 0x8B, 0xD2, 0xC1, 0xEA, 0x05, + 0x33, 0xD1, 0x41, 0x8B, 0xC9, 0x48, 0xC1, 0xE9, 0x0B, 0x41, 0x03, 0xD2, + 0x83, 0xE1, 0x03, 0x8B, 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xC9, 0x33, 0xD1, + 0x03, 0xC2, 0x8B, 0xC8, 0x8B, 0xD0, 0xC1, 0xE1, 0x04, 0xC1, 0xEA, 0x05, + 0x33, 0xD1, 0x42, 0x8B, 0x4C, 0x85, 0xF0, 0x41, 0x03, 0xC9, 0x03, 0xD0, + 0x33, 0xD1, 0x41, 0x81, 0xC1, 0xB9, 0x79, 0x37, 0x9E, 0x44, 0x03, 0xD2, + 0x45, 0x8B, 0xC1, 0x41, 0x8B, 0xCA, 0x41, 0x83, 0xE0, 0x03, 0xC1, 0xE1, + 0x04, 0x41, 0x8B, 0xD2, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x41, 0x8B, 0xC9, + 0x48, 0xC1, 0xE9, 0x0B, 0x41, 0x03, 0xD2, 0x83, 0xE1, 0x03, 0x8B, 0x4C, + 0x8D, 0xF0, 0x41, 0x03, 0xC9, 0x33, 0xD1, 0x03, 0xC2, 0x8B, 0xC8, 0x8B, + 0xD0, 0xC1, 0xE1, 0x04, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x42, 0x8B, 0x4C, + 0x85, 0xF0, 0x41, 0x03, 0xC9, 0x03, 0xD0, 0x33, 0xD1, 0x41, 0x81, 0xC1, + 0xB9, 0x79, 0x37, 0x9E, 0x44, 0x03, 0xD2, 0x45, 0x8B, 0xC1, 0x41, 0x8B, + 0xCA, 0x41, 0x8B, 0xD2, 0xC1, 0xE1, 0x04, 0x41, 0x83, 0xE0, 0x03, 0xC1, + 0xEA, 0x05, 0x33, 0xD1, 0x41, 0x8B, 0xC9, 0x48, 0xC1, 0xE9, 0x0B, 0x41, + 0x03, 0xD2, 0x83, 0xE1, 0x03, 0x8B, 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xC9, + 0x33, 0xD1, 0x03, 0xC2, 0x8B, 0xD0, 0x8B, 0xC8, 0xC1, 0xEA, 0x05, 0xC1, + 0xE1, 0x04, 0x33, 0xD1, 0x42, 0x8B, 0x4C, 0x85, 0xF0, 0x41, 0x03, 0xC9, + 0x03, 0xD0, 0x33, 0xD1, 0x44, 0x03, 0xD2, 0x41, 0x81, 0xC1, 0xB9, 0x79, + 0x37, 0x9E, 0x45, 0x8B, 0xC1, 0x41, 0x8B, 0xCA, 0xC1, 0xE1, 0x04, 0x41, + 0x83, 0xE0, 0x03, 0x41, 0x8B, 0xD2, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x41, + 0x8B, 0xC9, 0x41, 0x03, 0xD2, 0x48, 0xC1, 0xE9, 0x0B, 0x83, 0xE1, 0x03, + 0x8B, 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xC9, 0x33, 0xD1, 0x03, 0xC2, 0x8B, + 0xC8, 0x8B, 0xD0, 0xC1, 0xE1, 0x04, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x42, + 0x8B, 0x4C, 0x85, 0xF0, 0x41, 0x03, 0xC9, 0x03, 0xD0, 0x33, 0xD1, 0x41, + 0x81, 0xC1, 0xB9, 0x79, 0x37, 0x9E, 0x44, 0x03, 0xD2, 0x45, 0x8B, 0xC1, + 0x41, 0x83, 0xE0, 0x03, 0x41, 0x8B, 0xCA, 0xC1, 0xE1, 0x04, 0x41, 0x8B, + 0xD2, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x41, 0x8B, 0xC9, 0x41, 0x03, 0xD2, + 0x48, 0xC1, 0xE9, 0x0B, 0x83, 0xE1, 0x03, 0x8B, 0x4C, 0x8D, 0xF0, 0x41, + 0x03, 0xC9, 0x33, 0xD1, 0x03, 0xC2, 0x8B, 0xC8, 0x8B, 0xD0, 0xC1, 0xEA, + 0x05, 0xC1, 0xE1, 0x04, 0x33, 0xD1, 0x42, 0x8B, 0x4C, 0x85, 0xF0, 0x41, + 0x03, 0xC9, 0x03, 0xD0, 0x33, 0xD1, 0x41, 0x81, 0xC1, 0xB9, 0x79, 0x37, + 0x9E, 0x44, 0x03, 0xD2, 0x45, 0x8B, 0xC1, 0x41, 0x8B, 0xCA, 0x41, 0x83, + 0xE0, 0x03, 0xC1, 0xE1, 0x04, 0x41, 0x8B, 0xD2, 0xC1, 0xEA, 0x05, 0x33, + 0xD1, 0x41, 0x8B, 0xC9, 0x41, 0x03, 0xD2, 0x48, 0xC1, 0xE9, 0x0B, 0x83, + 0xE1, 0x03, 0x8B, 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xC9, 0x33, 0xD1, 0x03, + 0xC2, 0x8B, 0xD0, 0x8B, 0xC8, 0xC1, 0xEA, 0x05, 0xC1, 0xE1, 0x04, 0x33, + 0xD1, 0x42, 0x8B, 0x4C, 0x85, 0xF0, 0x41, 0x03, 0xC9, 0x03, 0xD0, 0x33, + 0xD1, 0x41, 0x81, 0xC1, 0xB9, 0x79, 0x37, 0x9E, 0x44, 0x03, 0xD2, 0x45, + 0x8B, 0xC1, 0x41, 0x8B, 0xD2, 0xC1, 0xEA, 0x05, 0x41, 0x8B, 0xCA, 0xC1, + 0xE1, 0x04, 0x33, 0xD1, 0x41, 0x8B, 0xC9, 0x48, 0xC1, 0xE9, 0x0B, 0x41, + 0x03, 0xD2, 0x83, 0xE1, 0x03, 0x8B, 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xC9, + 0x33, 0xD1, 0x03, 0xC2, 0x49, 0x83, 0xEB, 0x01, 0x0F, 0x85, 0x06, 0xFB, + 0xFF, 0xFF, 0x44, 0x8B, 0xDE, 0x4C, 0x8B, 0xCE, 0xBF, 0x04, 0x00, 0x00, + 0x00, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xC1, 0xE9, 0x0B, 0x41, 0x8B, 0xCA, 0xC1, 0xE1, 0x04, 0x41, 0x83, + 0xE1, 0x03, 0x41, 0x8B, 0xD2, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x42, 0x8B, + 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xD2, 0x41, 0x03, 0xCB, 0x41, 0x81, 0xC3, + 0x47, 0x86, 0xC8, 0x61, 0x33, 0xD1, 0x45, 0x8B, 0xCB, 0x2B, 0xC2, 0x49, + 0xC1, 0xE9, 0x0B, 0x41, 0x83, 0xE1, 0x03, 0x8B, 0xC8, 0xC1, 0xE1, 0x04, + 0x44, 0x8B, 0xC0, 0x41, 0xC1, 0xE8, 0x05, 0x44, 0x33, 0xC1, 0x41, 0x8B, + 0xCB, 0x83, 0xE1, 0x03, 0x44, 0x03, 0xC0, 0x8B, 0x54, 0x8D, 0xF0, 0x41, + 0x03, 0xD3, 0x44, 0x33, 0xC2, 0x45, 0x2B, 0xD0, 0x41, 0x8B, 0xCA, 0x41, + 0x8B, 0xD2, 0xC1, 0xE1, 0x04, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x42, 0x8B, + 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xCB, 0x41, 0x03, 0xD2, 0x33, 0xD1, 0x41, + 0x81, 0xC3, 0x47, 0x86, 0xC8, 0x61, 0x2B, 0xC2, 0x45, 0x8B, 0xCB, 0x49, + 0xC1, 0xE9, 0x0B, 0x8B, 0xC8, 0xC1, 0xE1, 0x04, 0x41, 0x83, 0xE1, 0x03, + 0x44, 0x8B, 0xC0, 0x41, 0xC1, 0xE8, 0x05, 0x44, 0x33, 0xC1, 0x41, 0x8B, + 0xCB, 0x83, 0xE1, 0x03, 0x44, 0x03, 0xC0, 0x8B, 0x54, 0x8D, 0xF0, 0x41, + 0x03, 0xD3, 0x44, 0x33, 0xC2, 0x45, 0x2B, 0xD0, 0x41, 0x8B, 0xCA, 0x41, + 0x8B, 0xD2, 0xC1, 0xE1, 0x04, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x42, 0x8B, + 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xCB, 0x41, 0x03, 0xD2, 0x33, 0xD1, 0x41, + 0x81, 0xC3, 0x47, 0x86, 0xC8, 0x61, 0x2B, 0xC2, 0x45, 0x8B, 0xCB, 0x8B, + 0xC8, 0x44, 0x8B, 0xC0, 0xC1, 0xE1, 0x04, 0x41, 0xC1, 0xE8, 0x05, 0x44, + 0x33, 0xC1, 0x41, 0x8B, 0xCB, 0x83, 0xE1, 0x03, 0x44, 0x03, 0xC0, 0x8B, + 0x54, 0x8D, 0xF0, 0x41, 0x03, 0xD3, 0x44, 0x33, 0xC2, 0x45, 0x2B, 0xD0, + 0x41, 0x8B, 0xD2, 0x41, 0x8B, 0xCA, 0xC1, 0xEA, 0x05, 0xC1, 0xE1, 0x04, + 0x33, 0xD1, 0x49, 0xC1, 0xE9, 0x0B, 0x41, 0x03, 0xD2, 0x41, 0x83, 0xE1, + 0x03, 0x42, 0x8B, 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xCB, 0x41, 0x81, 0xC3, + 0x47, 0x86, 0xC8, 0x61, 0x33, 0xD1, 0x45, 0x8B, 0xCB, 0x2B, 0xC2, 0x49, + 0xC1, 0xE9, 0x0B, 0x41, 0x83, 0xE1, 0x03, 0x8B, 0xC8, 0xC1, 0xE1, 0x04, + 0x44, 0x8B, 0xC0, 0x41, 0xC1, 0xE8, 0x05, 0x44, 0x33, 0xC1, 0x41, 0x8B, + 0xCB, 0x83, 0xE1, 0x03, 0x44, 0x03, 0xC0, 0x8B, 0x54, 0x8D, 0xF0, 0x41, + 0x03, 0xD3, 0x44, 0x33, 0xC2, 0x45, 0x2B, 0xD0, 0x41, 0x8B, 0xCA, 0x41, + 0x8B, 0xD2, 0xC1, 0xE1, 0x04, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x42, 0x8B, + 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xCB, 0x41, 0x03, 0xD2, 0x33, 0xD1, 0x41, + 0x81, 0xC3, 0x47, 0x86, 0xC8, 0x61, 0x2B, 0xC2, 0x45, 0x8B, 0xCB, 0x49, + 0xC1, 0xE9, 0x0B, 0x8B, 0xC8, 0xC1, 0xE1, 0x04, 0x41, 0x83, 0xE1, 0x03, + 0x44, 0x8B, 0xC0, 0x41, 0xC1, 0xE8, 0x05, 0x44, 0x33, 0xC1, 0x41, 0x8B, + 0xCB, 0x83, 0xE1, 0x03, 0x44, 0x03, 0xC0, 0x8B, 0x54, 0x8D, 0xF0, 0x41, + 0x03, 0xD3, 0x44, 0x33, 0xC2, 0x45, 0x2B, 0xD0, 0x41, 0x8B, 0xCA, 0x41, + 0x8B, 0xD2, 0xC1, 0xE1, 0x04, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x42, 0x8B, + 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xCB, 0x41, 0x03, 0xD2, 0x33, 0xD1, 0x41, + 0x81, 0xC3, 0x47, 0x86, 0xC8, 0x61, 0x2B, 0xC2, 0x45, 0x8B, 0xCB, 0x8B, + 0xC8, 0x44, 0x8B, 0xC0, 0xC1, 0xE1, 0x04, 0x41, 0xC1, 0xE8, 0x05, 0x44, + 0x33, 0xC1, 0x41, 0x8B, 0xCB, 0x83, 0xE1, 0x03, 0x44, 0x03, 0xC0, 0x8B, + 0x54, 0x8D, 0xF0, 0x41, 0x03, 0xD3, 0x44, 0x33, 0xC2, 0x45, 0x2B, 0xD0, + 0x41, 0x8B, 0xD2, 0x41, 0x8B, 0xCA, 0xC1, 0xEA, 0x05, 0xC1, 0xE1, 0x04, + 0x33, 0xD1, 0x41, 0x03, 0xD2, 0x49, 0xC1, 0xE9, 0x0B, 0x41, 0x83, 0xE1, + 0x03, 0x42, 0x8B, 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xCB, 0x41, 0x81, 0xC3, + 0x47, 0x86, 0xC8, 0x61, 0x33, 0xD1, 0x45, 0x8B, 0xCB, 0x2B, 0xC2, 0x49, + 0xC1, 0xE9, 0x0B, 0x41, 0x83, 0xE1, 0x03, 0x8B, 0xC8, 0xC1, 0xE1, 0x04, + 0x44, 0x8B, 0xC0, 0x41, 0xC1, 0xE8, 0x05, 0x44, 0x33, 0xC1, 0x41, 0x8B, + 0xCB, 0x83, 0xE1, 0x03, 0x44, 0x03, 0xC0, 0x8B, 0x54, 0x8D, 0xF0, 0x41, + 0x03, 0xD3, 0x44, 0x33, 0xC2, 0x45, 0x2B, 0xD0, 0x41, 0x8B, 0xCA, 0x41, + 0x8B, 0xD2, 0xC1, 0xE1, 0x04, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x42, 0x8B, + 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xCB, 0x41, 0x03, 0xD2, 0x33, 0xD1, 0x41, + 0x81, 0xC3, 0x47, 0x86, 0xC8, 0x61, 0x2B, 0xC2, 0x45, 0x8B, 0xCB, 0x49, + 0xC1, 0xE9, 0x0B, 0x8B, 0xC8, 0xC1, 0xE1, 0x04, 0x41, 0x83, 0xE1, 0x03, + 0x44, 0x8B, 0xC0, 0x41, 0xC1, 0xE8, 0x05, 0x44, 0x33, 0xC1, 0x41, 0x8B, + 0xCB, 0x83, 0xE1, 0x03, 0x44, 0x03, 0xC0, 0x8B, 0x54, 0x8D, 0xF0, 0x41, + 0x03, 0xD3, 0x44, 0x33, 0xC2, 0x45, 0x2B, 0xD0, 0x41, 0x8B, 0xCA, 0x41, + 0x8B, 0xD2, 0xC1, 0xE1, 0x04, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x42, 0x8B, + 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xCB, 0x41, 0x03, 0xD2, 0x33, 0xD1, 0x41, + 0x81, 0xC3, 0x47, 0x86, 0xC8, 0x61, 0x2B, 0xC2, 0x45, 0x8B, 0xCB, 0x8B, + 0xC8, 0x49, 0xC1, 0xE9, 0x0B, 0xC1, 0xE1, 0x04, 0x44, 0x8B, 0xC0, 0x41, + 0xC1, 0xE8, 0x05, 0x44, 0x33, 0xC1, 0x41, 0x8B, 0xCB, 0x83, 0xE1, 0x03, + 0x44, 0x03, 0xC0, 0x8B, 0x54, 0x8D, 0xF0, 0x41, 0x03, 0xD3, 0x44, 0x33, + 0xC2, 0x45, 0x2B, 0xD0, 0x41, 0x8B, 0xD2, 0x41, 0x8B, 0xCA, 0xC1, 0xEA, + 0x05, 0xC1, 0xE1, 0x04, 0x33, 0xD1, 0x41, 0x03, 0xD2, 0x41, 0x83, 0xE1, + 0x03, 0x42, 0x8B, 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xCB, 0x41, 0x81, 0xC3, + 0x47, 0x86, 0xC8, 0x61, 0x33, 0xD1, 0x45, 0x8B, 0xCB, 0x2B, 0xC2, 0x49, + 0xC1, 0xE9, 0x0B, 0x41, 0x83, 0xE1, 0x03, 0x8B, 0xC8, 0xC1, 0xE1, 0x04, + 0x44, 0x8B, 0xC0, 0x41, 0xC1, 0xE8, 0x05, 0x44, 0x33, 0xC1, 0x41, 0x8B, + 0xCB, 0x83, 0xE1, 0x03, 0x44, 0x03, 0xC0, 0x8B, 0x54, 0x8D, 0xF0, 0x41, + 0x03, 0xD3, 0x44, 0x33, 0xC2, 0x45, 0x2B, 0xD0, 0x41, 0x8B, 0xCA, 0x41, + 0x8B, 0xD2, 0xC1, 0xE1, 0x04, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x42, 0x8B, + 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xCB, 0x41, 0x03, 0xD2, 0x33, 0xD1, 0x41, + 0x81, 0xC3, 0x47, 0x86, 0xC8, 0x61, 0x2B, 0xC2, 0x45, 0x8B, 0xCB, 0x49, + 0xC1, 0xE9, 0x0B, 0x8B, 0xC8, 0xC1, 0xE1, 0x04, 0x41, 0x83, 0xE1, 0x03, + 0x44, 0x8B, 0xC0, 0x41, 0xC1, 0xE8, 0x05, 0x44, 0x33, 0xC1, 0x41, 0x8B, + 0xCB, 0x83, 0xE1, 0x03, 0x44, 0x03, 0xC0, 0x8B, 0x54, 0x8D, 0xF0, 0x41, + 0x03, 0xD3, 0x44, 0x33, 0xC2, 0x45, 0x2B, 0xD0, 0x41, 0x8B, 0xCA, 0x41, + 0x8B, 0xD2, 0xC1, 0xE1, 0x04, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x42, 0x8B, + 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xCB, 0x41, 0x03, 0xD2, 0x33, 0xD1, 0x41, + 0x81, 0xC3, 0x47, 0x86, 0xC8, 0x61, 0x2B, 0xC2, 0x45, 0x8B, 0xCB, 0x8B, + 0xC8, 0x49, 0xC1, 0xE9, 0x0B, 0xC1, 0xE1, 0x04, 0x44, 0x8B, 0xC0, 0x41, + 0xC1, 0xE8, 0x05, 0x41, 0x83, 0xE1, 0x03, 0x44, 0x33, 0xC1, 0x41, 0x8B, + 0xCB, 0x83, 0xE1, 0x03, 0x44, 0x03, 0xC0, 0x8B, 0x54, 0x8D, 0xF0, 0x41, + 0x03, 0xD3, 0x44, 0x33, 0xC2, 0x45, 0x2B, 0xD0, 0x41, 0x8B, 0xD2, 0x41, + 0x8B, 0xCA, 0xC1, 0xEA, 0x05, 0xC1, 0xE1, 0x04, 0x33, 0xD1, 0x42, 0x8B, + 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xCB, 0x41, 0x03, 0xD2, 0x33, 0xD1, 0x2B, + 0xC2, 0x41, 0x81, 0xC3, 0x47, 0x86, 0xC8, 0x61, 0x8B, 0xC8, 0xC1, 0xE1, + 0x04, 0x44, 0x8B, 0xC0, 0x41, 0xC1, 0xE8, 0x05, 0x44, 0x33, 0xC1, 0x45, + 0x8B, 0xCB, 0x44, 0x03, 0xC0, 0x49, 0xC1, 0xE9, 0x0B, 0x41, 0x83, 0xE1, + 0x03, 0x41, 0x8B, 0xCB, 0x83, 0xE1, 0x03, 0x8B, 0x54, 0x8D, 0xF0, 0x41, + 0x03, 0xD3, 0x44, 0x33, 0xC2, 0x45, 0x2B, 0xD0, 0x41, 0x8B, 0xCA, 0x41, + 0x8B, 0xD2, 0xC1, 0xE1, 0x04, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x42, 0x8B, + 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xCB, 0x41, 0x03, 0xD2, 0x33, 0xD1, 0x41, + 0x81, 0xC3, 0x47, 0x86, 0xC8, 0x61, 0x2B, 0xC2, 0x45, 0x8B, 0xCB, 0x49, + 0xC1, 0xE9, 0x0B, 0x8B, 0xC8, 0xC1, 0xE1, 0x04, 0x41, 0x83, 0xE1, 0x03, + 0x44, 0x8B, 0xC0, 0x41, 0xC1, 0xE8, 0x05, 0x44, 0x33, 0xC1, 0x41, 0x8B, + 0xCB, 0x83, 0xE1, 0x03, 0x44, 0x03, 0xC0, 0x8B, 0x54, 0x8D, 0xF0, 0x41, + 0x03, 0xD3, 0x44, 0x33, 0xC2, 0x45, 0x2B, 0xD0, 0x41, 0x8B, 0xCA, 0x41, + 0x8B, 0xD2, 0xC1, 0xE1, 0x04, 0xC1, 0xEA, 0x05, 0x33, 0xD1, 0x42, 0x8B, + 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xCB, 0x41, 0x03, 0xD2, 0x33, 0xD1, 0x41, + 0x81, 0xC3, 0x47, 0x86, 0xC8, 0x61, 0x2B, 0xC2, 0x45, 0x8B, 0xCB, 0x49, + 0xC1, 0xE9, 0x0B, 0x8B, 0xC8, 0xC1, 0xE1, 0x04, 0x41, 0x83, 0xE1, 0x03, + 0x44, 0x8B, 0xC0, 0x41, 0xC1, 0xE8, 0x05, 0x44, 0x33, 0xC1, 0x41, 0x8B, + 0xCB, 0x83, 0xE1, 0x03, 0x44, 0x03, 0xC0, 0x8B, 0x54, 0x8D, 0xF0, 0x41, + 0x03, 0xD3, 0x44, 0x33, 0xC2, 0x45, 0x2B, 0xD0, 0x41, 0x8B, 0xD2, 0x41, + 0x8B, 0xCA, 0xC1, 0xEA, 0x05, 0xC1, 0xE1, 0x04, 0x33, 0xD1, 0x42, 0x8B, + 0x4C, 0x8D, 0xF0, 0x41, 0x03, 0xCB, 0x41, 0x03, 0xD2, 0x33, 0xD1, 0x2B, + 0xC2, 0x41, 0x81, 0xC3, 0x47, 0x86, 0xC8, 0x61, 0x44, 0x8B, 0xC0, 0x45, + 0x8B, 0xCB, 0x41, 0xC1, 0xE8, 0x05, 0x8B, 0xC8, 0xC1, 0xE1, 0x04, 0x44, + 0x33, 0xC1, 0x41, 0x8B, 0xCB, 0x83, 0xE1, 0x03, 0x44, 0x03, 0xC0, 0x8B, + 0x54, 0x8D, 0xF0, 0x41, 0x03, 0xD3, 0x44, 0x33, 0xC2, 0x45, 0x2B, 0xD0, + 0x48, 0x83, 0xEF, 0x01, 0x0F, 0x85, 0xB6, 0xFA, 0xFF, 0xFF, 0x48, 0x83, + 0xEB, 0x01, 0x0F, 0x85, 0x8C, 0xF5, 0xFF, 0xFF, 0x48, 0x8B, 0x5C, 0x24, + 0x20, 0x41, 0x33, 0xC2, 0x48, 0x8B, 0x74, 0x24, 0x28, 0x48, 0x8B, 0x7C, + 0x24, 0x30, 0x48, 0x83, 0xC4, 0x10, 0x5D, 0xC3 + ]; + + // &[0xFF, 0xC0, 0x90, 0x90, 0xC3] + + // Setup an environment to run inside of. + let mut renv = Box::new(RawEnvironment::new()); + + renv.load(&mut vm.cpu, &shellcode).unwrap(); + vm.env = renv; + + let stack_base = 0xF0000; + vm.cpu.mem.alloc_memory( + AllocLayout { + addr: Some(stack_base), + size: 0x2000, + align: 0x1000, + }, + Mapping { + perm: perm::READ | perm::WRITE, + value: 0xAA, + }, + ).unwrap(); + + // Set up the stack + let rsp_node = vm.cpu.sleigh().get_reg("RSP").unwrap().var; + vm.cpu.write_reg(rsp_node, stack_base + 0x2000 - 0x100); + + // Add instrumentation + let counter = vm.cpu.trace.register_store(vec![0_u64]); + //vm.add_injector(BlockCounter { counter }); + + // Run until the VM exits. + let limit = 1000000; + let mut start = SystemTime::now().duration_since(std::time::UNIX_EPOCH).unwrap().as_millis(); + println!("start: {start}"); + sleep(Duration::from_millis(100)); + start = SystemTime::now().duration_since(std::time::UNIX_EPOCH).unwrap().as_millis(); + println!("start: {start}"); + let mut count = 0; + let exit = loop { + vm.icount_limit = limit; + vm.cpu.icount = 0; + let exit = vm.run(); + let now = SystemTime::now().duration_since(std::time::UNIX_EPOCH).unwrap().as_millis(); + let elapsed = now - start; + count += 1; + if count == 50 { + panic!("nein"); + } + let freq = (limit as f64) / ((elapsed as f64) / 1000.0); + println!("{limit} instructions in {elapsed}ms ({freq:.2}/s)"); + start = now; + match exit { + VmExit::InstructionLimit => { + println!("Instruction limit") + } + _ => break exit + } + }; + + println!("execution finished!"); + println!("{exit:?}"); + //println!("{}", icicle_vm::debug::current_disasm(&mut vm)); + + // Read instrumentation data. + let blocks_hit = vm.cpu.trace[counter] + .as_any() + .downcast_ref::>() + .unwrap()[0]; + let blocks_executed = blocks_hit.saturating_sub(1); + println!("{blocks_executed} blocks were executed"); + + let rax = vm.cpu.sleigh().get_reg("RAX").unwrap().var; + let rax_val = vm.cpu.read_reg(rax); + println!("rax: 0x{rax_val:X}"); +} + +struct BlockCounter { + counter: icicle_vm::cpu::StoreRef, +} + +impl icicle_vm::CodeInjector for BlockCounter { + fn inject( + &mut self, + _cpu: &mut icicle_vm::cpu::Cpu, + group: &icicle_vm::cpu::BlockGroup, + code: &mut icicle_vm::BlockTable, + ) { + let store_id = self.counter.get_store_id(); + for block in &mut code.blocks[group.range()] { + // counter += 1 + let counter = block.pcode.alloc_tmp(8); + let instrumentation = [ + (counter, pcode::Op::Load(store_id), 0_u64).into(), + (counter, pcode::Op::IntAdd, (counter, 1_u64)).into(), + (pcode::Op::Store(store_id), (0_u64, counter)).into(), + ]; + + // Inject the instrumentation at the start of the block. + block.pcode.instructions.splice(..0, instrumentation); + } + } +} diff --git a/src/rawenv.rs b/src/rawenv.rs new file mode 100644 index 0000000..916de63 --- /dev/null +++ b/src/rawenv.rs @@ -0,0 +1,59 @@ +use std::{any::Any}; + +use icicle_vm::{VmExit}; +use icicle_vm::cpu::{Cpu, Environment, debug_info::{DebugInfo, SourceLocation}}; +use icicle_vm::cpu::mem::{AllocLayout, Mapping, perm}; + +pub struct RawEnvironment { + debug_info: DebugInfo, +} + +impl RawEnvironment { + pub fn new() -> Self { + Self { debug_info: DebugInfo::default() } + } +} + +/*impl ElfLoader for RawEnvironment { + const DYNAMIC_MEMORY: bool = true; +}*/ + +impl Environment for RawEnvironment { + fn load(&mut self, cpu: &mut Cpu, code_bytes: &[u8]) -> Result<(), String> { + let layout = AllocLayout { addr: Some(0x10000), size: 0x1000, align: 0x1000 }; + + let base_addr = cpu + .mem + .alloc_memory(layout, Mapping { perm: perm::MAP, value: 0xaa }) + .map_err(|e| format!("Failed to allocate memory: {e:?}"))?; + + // NOTE: without READ we cannot translate the code and a confusing exception is raised + cpu.mem.update_perm(layout.addr.unwrap(), layout.size, perm::EXEC | perm::READ) + .map_err(|e| format!("Failed to update perm: {e:?}"))?; + + cpu.mem.write_bytes(base_addr, code_bytes, perm::NONE) + .map_err(|e|format!("Failed to write memory: {e:?}"))?; + + (cpu.arch.on_boot)(cpu, base_addr); + + Ok(()) + } + + fn handle_exception(&mut self, _: &mut Cpu) -> Option { + None + } + + fn symbolize_addr(&mut self, _: &mut Cpu, addr: u64) -> Option { + self.debug_info.symbolize_addr(addr) + } + + fn lookup_symbol(&mut self, symbol: &str) -> Option { + self.debug_info.symbols.resolve_sym(symbol) + } + + fn snapshot(&mut self) -> Box { + Box::new(()) + } + + fn restore(&mut self, _: &Box) {} +} \ No newline at end of file