Giter Site home page Giter Site logo

lifting-bits / microx Goto Github PK

View Code? Open in Web Editor NEW
174.0 30.0 24.0 2.58 MB

Safely execute an arbitrary x86 instruction

License: Apache License 2.0

C++ 61.80% C 0.90% Shell 1.62% Python 33.54% CMake 0.89% Makefile 1.25%
x86 binary-translation emulator python-bindings hacktoberfest

microx's People

Contributors

artemdinaburg avatar awesie avatar dependabot[bot] avatar dguido avatar ekilmer avatar mrexodia avatar pasztorpisti avatar pgoodman avatar woodruffw avatar xlauko avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

microx's Issues

Publish to PyPI

We should publish microx to PyPI. Building it as a redistributable wheel shouldn't be too difficult, as long as we link XED statically.

REP string instructions are broken

REP MOVSB was not working correctly for me. It seems the source and destination registers are not in the modified register set and do not get updated by WriteRegisters.

Something like this fixes the bug for me:

@@ -802,6 +802,7 @@ static void UpdateFlagsSub(Flags &flags, uintptr_t lhs, uintptr_t rhs,
     WriteGPR(dest_reg,                                                       \
              static_cast<uint64_t>(static_cast<int64_t>(ReadGPR(dest_reg)) + \
                                    stringop_inc));                           \
+    gModifiedRegs.set(dest_reg);                                             \
   } while (false)

 #define SCAS                                                                 \
@@ -813,6 +814,7 @@ static void UpdateFlagsSub(Flags &flags, uintptr_t lhs, uintptr_t rhs,
     WriteGPR(dest_reg,                                                       \
              static_cast<uint64_t>(static_cast<int64_t>(ReadGPR(dest_reg)) + \
                                    stringop_inc));                           \
+    gModifiedRegs.set(dest_reg);                                             \
   } while (false)

 #define LODS                                                                 \
@@ -821,6 +823,7 @@ static void UpdateFlagsSub(Flags &flags, uintptr_t lhs, uintptr_t rhs,
     WriteGPR(dest_reg,                                                       \
              static_cast<uint64_t>(static_cast<int64_t>(ReadGPR(dest_reg)) + \
                                    stringop_inc));                           \
+    gModifiedRegs.set(dest_reg);                                             \
   } while (false)

 #define MOVS                                                                 \
@@ -832,6 +835,8 @@ static void UpdateFlagsSub(Flags &flags, uintptr_t lhs, uintptr_t rhs,
     WriteGPR(dest_reg,                                                       \
              static_cast<uint64_t>(static_cast<int64_t>(ReadGPR(dest_reg)) + \
                                    stringop_inc));                           \
+    gModifiedRegs.set(src_reg);                                              \
+    gModifiedRegs.set(dest_reg);                                             \
   } while (false)

 #define CMPS                                                                 \
@@ -845,6 +850,8 @@ static void UpdateFlagsSub(Flags &flags, uintptr_t lhs, uintptr_t rhs,
     WriteGPR(dest_reg,                                                       \
              static_cast<uint64_t>(static_cast<int64_t>(ReadGPR(dest_reg)) + \
                                    stringop_inc));                           \
+    gModifiedRegs.set(src_reg);                                              \
+    gModifiedRegs.set(dest_reg);                                             \
   } while (false)

 #define REPNE(...)                \

CI builds

We should build both microx and its Python bindings in the CI.

Saving/restoring XMM / YMM register state in inline assembly

I don't recall if we're actually saving/restoring enough. I think we're only saving xmm0 through xmm7. I'd need to think more about whether more is needed. I don't believe that we rewrite things like raw uses of xmm8 (in avx2) to be in that range, for instance.

Python example with 64-bit RIP

Setting the memory map address bit size to 64 is not sufficient to run X64 code. It will constantly loop over one instruction because when microx updates the program counter it updates EIP instead of RIP.

Bug in pop rsp

pop rsp currently returns result increased by 8 opposed to expected value. One possible explanation is that following happens:

new = *rsp
store(dst, new)
*rsp = *rsp + 8

instead of

new = *rsp
*rsp = *rsp + 8
store(dst, new)

Missing support for RDTSC / RDTSCP

While these are categorized as "system" instructions, they are also popular within userspace applications. While it is unlikely that microx can provide a "correct" implementation, it can at least provide a way for the user to provide an implementation.

Something like:

@@ -1347,6 +1421,18 @@ static bool Emulate(const Executor *executor, uintptr_t &next_pc,
       WriteGPR(reg0, mem0);
       return true;

+    case XED_IFORM_RDTSC:
+    case XED_IFORM_RDTSCP: {
+        Data tsc;
+        if (!executor->ReadTsc(tsc)) {
+          status = ExecutorStatus::kErrorReadTsc;
+          return false;
+        }
+        WriteGPR(reg0, *reinterpret_cast<uint32_t *>(&tsc.bytes[0]));
+        WriteGPR(reg1, *reinterpret_cast<uint32_t *>(&tsc.bytes[4]));
+      }
+      return true;
+
     default:
       return false;
   }
@@ -1382,6 +1468,14 @@ static bool UsesUnsupportedAttributes(void) {

 static bool UsesUnsupportedFeatures(const Executor *executor) {
   switch (xed_decoded_inst_get_category(gXedd)) {
+    case XED_CATEGORY_SYSTEM:
+      switch (xed_decoded_inst_get_iform_enum(gXedd)) {
+        case XED_IFORM_RDTSC:
+        case XED_IFORM_RDTSCP:
+          return false;
+        default:
+          return true;
+      }
     case XED_CATEGORY_3DNOW:
     case XED_CATEGORY_MPX:
     case XED_CATEGORY_AES:

DF not handled properly

DF is not having a correct value after executing some instruction. Best seen with popf and can crash program in other cases (by possibly not restoring properly?)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.