From dbcd9e686d14b0e2e8dceb4b1ed48694eba63ebc Mon Sep 17 00:00:00 2001 From: _xeroxz Date: Sat, 22 May 2021 06:42:28 +0000 Subject: [PATCH 1/5] Update README.md --- README.md | 151 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) diff --git a/README.md b/README.md index e69de29..c3ae34c 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,151 @@ +# vm_entry - an entry point into the vm + +`vm_entry` is the code name for the vmp2 routine which is used to transition control flow from non-virtualized code to virtualized code. Prior to calling this function a value is pushed onto the stack. + +#### encrypted opcode rva + +```nasm +push 0xFFFFFFFF890001FA +jmp vm_entry +``` + +The value pushed onto the stack is an encrypted RVA to the vm instructions to execute. As you can see below, the value is decrypted inside of the `vm_entry` function and is loaded into RSI. The decryption is unique per-build, however it seems that there is only three transformations done, no more, no less. + +#### decrypt opcode rva + +```nasm +; pushed value on stack (0xFFFFFFFF890001FA) +mov esi, [rsp+0xA0] + +; unique, per-build, decryption. there seems to obly be 3 of these. +not esi +neg esi +ror esi, 0x1A + +; vmp2 image base address is always 0x14000000... +mov rax, 0x100000000 +add rsi, rax + +; add module base +add rsi, [rbp+0] +``` + +If you decrypt the encrypted stack value, you end up with `0x140007EE2`. This is the image based address of the virtual instructions which will be executed by the vm. These virtual instructions are encrypted. I talk more about those in the `virtual instructions` section of the readme. + +### calc_jmp - transition from one vm handler to another + +`calc_jmp` is a part of the `vm_entry` routine. vm handler jmp's to this section of code in order to calculate the address of the next vm handler. This code decrypts the first opcode of the next virtual instruction, advances vip, obtains and decrypts the next vm handler's linear virtual address, and finally jmps to it. `AL` contains the index into the vm handler table after the jmp, and `BL` contains the decryption key for the first opcode. `BL` is then used by vm handlers to decrypt immediate values. + +```nasm +; get the first opcode of the next virtual instruction +mov al, [rsi] + +; this is in every single vmp2 binary... +; BL contains a "rolling" encryption key... +xor al, bl + +; again, three unique transformations... +neg al +rol al, 5 +inc al + +; this is in every single vmp2 binary... +; BL is a "rolling" encryption key... +; it gets updated here... +xor bl, al + +; index into the vm handler table... +movzx rax, al +mov rdx, [r12+rax*8] + +; decrypt the vm handler rva... +xor rdx, 7F3D2149h + +; advance the virtual instruction pointer (++VIP) +inc rsi + +; jmp to next vm handler +add rdx, r13 +jmp rdx +``` + +# virtual instructions - opcode's, vm handler index, and immediate values + +virtual instructions are per-build encrypted RISC based instructions. They consist of an encrypted vm handler index, and optionally an encrypted immediate value. They are located inside of `.vmp` and `.text` sections. When execution of opcodes is desired, a push of an encrypted rva to these opcodes is done. Sadly, the rva is only 32bit's so you cannot easily run your own sequence of vm handlers. I suppose you could but you would need to be near the vmp'ed module in memory. + +``` +[vm handler index][immediate value up to 8 bytes] +``` + +*note that the vm handler index and immediate values are all encrypted* + +#### opcode encryption + +each opcode of a virtual instruction is encrypted by itself. + +##### first opcode - vm handler index + +```nasm +; note trans is short for transformation... +; this includes: xor, neg, not, nor, add, sub, etc + +mov al, [rsi] ; RSI is VIP... + ; BL is the byte address of the encrypted opcode... + ; (only for the first decryption of the first opcode....) +trans al, bl ; AL is the encrypted opcode... + +; note that there is ALWAYS three transformations... +trans al +trans al +trans al + + +trans bl, al ; at this point AL contains the decrypted opcode + ; (which is the vm handler index)... + ; BL now can decrypt the next opcode... + ; also note that the transformation done to BL is also done to AL... +``` + +*first opcode decryption of the first virtual instruction* + + +```nasm +mov al, [rsi] ; RSI is VIP... +trans al, bl ; AL is the encrypted opcode... + +; note that there is ALWAYS three transformations... +trans al +trans al +trans al + +trans bl, al ; BL contains the decrypt key from the last virtual instruction... + ; read the assembly above at this instruction for BL... +``` + +*first opcode decryption of the second virtual instruction* + +##### second opcode - immediate values + +Each virtual instruction can have a second opcode. This second opcode is decrypted by the "rolling" decryption key stored in `BL`. An example of a second opcode would be the first virtual instruction always executed. + +```nasm +movzx eax, byte ptr [rsi] + +; transformations done by vm handlers on immediate values are unique... +; unlike the `calc_jmp` block of code which vm handlers use to get to the next virtual instruction... +sub al, bl + +; again, three unique transformations done on AL... +ror al, 2 +not al +inc al + +; the same transformation done al AL is then done on BL with the decrypted opcode... +sub bl, al + +; this is some sort of VPOP and store instruction where a value comes off the virtual stack and into a place in RDI +; RDI seems to be scratch space, heap, or a per-binary virtual register mapping, not sure yet. +mov rdx, [rbp+0] +add rbp, 8 +mov [rax+rdi], rdx +``` \ No newline at end of file From e755eb3e8e23a6d25ab1d7a9383e91fb38f27eda Mon Sep 17 00:00:00 2001 From: _xeroxz Date: Sat, 22 May 2021 06:46:36 +0000 Subject: [PATCH 2/5] Update README.md --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c3ae34c..b91c4a1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,12 @@ -# vm_entry - an entry point into the vm +# vmemu - Virtual Machine Emulation + +VMEmu uses unicorn to emulate x86_64 instructions which make up the virtual machine handlers. This project is extremely simple in that it will check every executed instruction in order to find any `JMP` instruction which uses a register and jumps to a vm handler. When this JMP is executed all native registers, virtual scratch registers, and the virtual stack are saved into a trace entry. Emulation ends when a VMEXIT instruction is found. + +You can continue the analysis using IDA outside of the virtual machine and then use VMEmu again once execution enters back into the virtual machine. I have plans to turn this into a library and inherit this library into `vmprofiler-qt` and make a split view where you can see what native instructions are executed prior to the next vm entry. However for now this project is used to generate vmtrace files which `vmprofiler-qt` can parse. + +# VMProtect 2 - Virtual Machine Architecture Overview + +## vm_entry - an entry point into the vm `vm_entry` is the code name for the vmp2 routine which is used to transition control flow from non-virtualized code to virtualized code. Prior to calling this function a value is pushed onto the stack. From 0022ec09e76b2725c4ee4d4660214e486a866926 Mon Sep 17 00:00:00 2001 From: _xeroxz Date: Sat, 22 May 2021 06:51:02 +0000 Subject: [PATCH 3/5] Update README.md --- README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/README.md b/README.md index b91c4a1..574917c 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,30 @@ +
+
+ +
+
+ # vmemu - Virtual Machine Emulation VMEmu uses unicorn to emulate x86_64 instructions which make up the virtual machine handlers. This project is extremely simple in that it will check every executed instruction in order to find any `JMP` instruction which uses a register and jumps to a vm handler. When this JMP is executed all native registers, virtual scratch registers, and the virtual stack are saved into a trace entry. Emulation ends when a VMEXIT instruction is found. You can continue the analysis using IDA outside of the virtual machine and then use VMEmu again once execution enters back into the virtual machine. I have plans to turn this into a library and inherit this library into `vmprofiler-qt` and make a split view where you can see what native instructions are executed prior to the next vm entry. However for now this project is used to generate vmtrace files which `vmprofiler-qt` can parse. +# Usage - Creating A Trace + +In order to use VMEmu you must have an unpacked VMProtect 2 binary which you know some basic information about. + +``` +Usage: uc-tracer [options...] +Options: + --vmentry relative virtual address to a vm entry... (Required) + --vmpbin path to unpacked virtualized binary... (Required) + --imagebase image base from optional PE header... (Required) + --out output file name for trace file... (Required) + --advancement the way in which the virtual instruction pointer advances... 'forward' or 'backward'... (Required) + -h, --help Shows this page +``` + # VMProtect 2 - Virtual Machine Architecture Overview ## vm_entry - an entry point into the vm From 3b79f9b5d7a0161863bba04a83ddb02e3e3a12f1 Mon Sep 17 00:00:00 2001 From: _xeroxz Date: Sat, 22 May 2021 06:52:18 +0000 Subject: [PATCH 4/5] Delete test.vmp2 --- src/test.vmp2 | Bin 153648 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/test.vmp2 diff --git a/src/test.vmp2 b/src/test.vmp2 deleted file mode 100644 index d6fd1da6e88c9bb057aeb334613e2663f4a1424b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153648 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 From b8de4312c3ec3aede38c58ac370b902348b8d8ea Mon Sep 17 00:00:00 2001 From: _xeroxz Date: Sat, 22 May 2021 06:52:32 +0000 Subject: [PATCH 5/5] Delete vmptest.vmp.exe --- src/vmptest.vmp.exe | Bin 24064 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/vmptest.vmp.exe diff --git a/src/vmptest.vmp.exe b/src/vmptest.vmp.exe deleted file mode 100644 index 60c276e74f089de6a42cd355f0b8885e353efbe5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24064 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