...
void disassembly_vm1(vm_sub
*
ctx)
{
char
*
eip
=
ctx
-
>vm_ins;
char
*
esp
=
eip
+
2
*
ctx
-
>size;
ks_engine
*
ks;
ks_err err;
err
=
ks_open(KS_ARCH_X86, KS_MODE_32, &ks);
if
(err !
=
KS_ERR_OK)
{
cout <<
"Keystone open error."
<< endl;
return
;
}
ostringstream dasm
=
ostringstream();
dasm <<
"push 6;"
<< endl;
dasm <<
"push 0x20000;"
<< endl;
dasm <<
"call vmins_0;"
<< endl;
dasm <<
"jmp vmins_ret;"
<< endl;
while
(eip < ctx
-
>vm_ins
+
0x792
)
{
int
vm_offset
=
eip
-
ctx
-
>vm_ins;
dasm <<
"vmins_"
<< vm_offset <<
":"
<< endl;
int
ins
=
*
eip
+
+
;
switch (ins)
{
case
17
:
{
dasm <<
"push ebx;"
<< endl;
break
;
}
case
1
:
{
uint8_t off
=
(uint8_t)
*
eip
+
+
;
dasm <<
"xor eax, eax;"
<< endl;
dasm <<
"mov al, "
<< (
int
)off <<
";"
<< endl;
dasm <<
"lea ebx, [ebp+eax*4-400h];"
<< endl;
break
;
}
case
13
:
{
dasm <<
"mov ebx, [ebx];"
<< endl;
break
;
}
case
3
:
{
ecx
=
(uint8_t)
*
eip
+
+
;
dasm <<
"mov ebx, "
<< (
int
)ecx <<
";"
<< endl;
break
;
}
case
8
:
{
uint32_t off
=
*
(uint32_t
*
)eip;
dasm <<
"test ebx, ebx;"
<< endl;
dasm <<
"jz vmins_"
<< (
int
)(vm_offset
+
1
+
off) <<
";"
<< endl;
dasm <<
"jmp vmins_"
<< (
int
)(vm_offset
+
1
+
4
) <<
";"
<< endl;
eip
+
=
4
;
break
;
}
case
21
:
{
dasm <<
"pop ecx;"
<< endl;
dasm <<
"cmp ecx, ebx;"
<< endl;
dasm <<
"jnz vmins_"
<< vm_offset <<
"set0;"
<< endl;
dasm <<
"mov ebx, 1;"
<< endl;
dasm <<
"jmp vmins_"
<< vm_offset
+
1
<<
";"
<< endl;
dasm <<
"vmins_"
<< vm_offset <<
"set0:"
<< endl;
dasm <<
"mov ebx, 0;"
<< endl;
break
;
}
case
15
:
{
dasm <<
"pop edx;"
<< endl;
dasm <<
"mov [edx], ebx;"
<< endl;
break
;
}
case
6
:
{
uint32_t off
=
*
(uint32_t
*
)eip;
/
/
In disassembly mode we do
not
jump, but skip this instruction.
/
/
eip
+
=
off;
if
(off !
=
4
)
dasm <<
"jmp vmins_"
<< (
int
)(vm_offset
+
1
+
off) <<
";"
<< endl;
eip
+
=
4
;
break
;
}
case
29
:
{
dasm <<
"pop ecx;"
<< endl;
dasm <<
"add ebx, ecx;"
<< endl;
break
;
}
case
30
:
{
dasm <<
"pop eax;"
<< endl;
dasm <<
"sub eax, ebx;"
<< endl;
dasm <<
"mov ebx, eax;"
<< endl;
break
;
}
case
14
:
{
dasm <<
"xor ecx, ecx;"
<< endl;
dasm <<
"mov cl, [ebx];"
<< endl;
dasm <<
"mov ebx, ecx;"
<< endl;
break
;
}
case
31
:
{
dasm <<
"pop edx;"
<< endl;
dasm <<
"imul ebx, edx;"
<< endl;
break
;
}
case
16
:
{
dasm <<
"pop eax;"
<< endl;
dasm <<
"mov [eax], bl;"
<< endl;
dasm <<
"movsx ebx, bl;"
<< endl;
break
;
}
case
33
:
{
dasm <<
"pop eax;"
<< endl;
dasm <<
"xor edx, edx;"
<< endl;
dasm <<
"div ebx;"
<< endl;
dasm <<
"mov ebx, edx;"
<< endl;
break
;
}
case
23
:
{
dasm <<
"pop ecx;"
<< endl;
dasm <<
"cmp ecx, ebx;"
<< endl;
dasm <<
"jnb vmins_"
<< vm_offset <<
"set0;"
<< endl;
dasm <<
"mov ebx, 1;"
<< endl;
dasm <<
"jmp vmins_"
<< vm_offset
+
1
<<
";"
<< endl;
dasm <<
"vmins_"
<< vm_offset <<
"set0:"
<< endl;
dasm <<
"mov ebx, 0;"
<< endl;
break
;
}
case
32
:
{
dasm <<
"pop eax;"
<< endl;
dasm <<
"xor edx, edx;"
<< endl;
dasm <<
"div ebx;"
<< endl;
dasm <<
"mov ebx, eax;"
<< endl;
break
;
}
case
24
:
{
dasm <<
"pop edx;"
<< endl;
dasm <<
"cmp edx, ebx;"
<< endl;
dasm <<
"jbe vmins_"
<< vm_offset <<
"set0;"
<< endl;
dasm <<
"mov ebx, 1;"
<< endl;
dasm <<
"jmp vmins_"
<< vm_offset
+
1
<<
";"
<< endl;
dasm <<
"vmins_"
<< vm_offset <<
"set0:"
<< endl;
dasm <<
"mov ebx, 0;"
<< endl;
break
;
}
case
18
:
{
dasm <<
"pop ecx;"
<< endl;
dasm <<
"or ebx, ecx;"
<< endl;
break
;
}
case
28
:
{
dasm <<
"pop eax;"
<< endl;
dasm <<
"mov ecx, ebx;"
<< endl;
dasm <<
"shr eax, cl;"
<< endl;
dasm <<
"mov ebx, eax;"
<< endl;
break
;
}
case
20
:
{
dasm <<
"pop ecx;"
<< endl;
dasm <<
"and ebx, ecx;"
<< endl;
break
;
}
case
19
:
{
dasm <<
"pop ecx;"
<< endl;
dasm <<
"xor ebx, ecx;"
<< endl;
break
;
}
case
27
:
{
dasm <<
"pop edx;"
<< endl;
dasm <<
"mov ecx, ebx;"
<< endl;
dasm <<
"shl edx, cl;"
<< endl;
dasm <<
"mov ebx, edx;"
<< endl;
break
;
}
case
22
:
{
dasm <<
"pop eax;"
<< endl;
dasm <<
"cmp eax, ebx;"
<< endl;
dasm <<
"jz vmins_"
<< vm_offset <<
"set0;"
<< endl;
dasm <<
"mov ebx, 1;"
<< endl;
dasm <<
"jmp vmins_"
<< vm_offset
+
1
<<
";"
<< endl;
dasm <<
"vmins_"
<< vm_offset <<
"set0:"
<< endl;
dasm <<
"mov ebx, 0;"
<< endl;
break
;
}
case
26
:
{
dasm <<
"pop ecx;"
<< endl;
dasm <<
"cmp ecx, ebx;"
<< endl;
dasm <<
"jb vmins_"
<< vm_offset <<
"set0;"
<< endl;
dasm <<
"mov ebx, 1;"
<< endl;
dasm <<
"jmp vmins_"
<< vm_offset
+
1
<<
";"
<< endl;
dasm <<
"vmins_"
<< vm_offset <<
"set0:"
<< endl;
dasm <<
"mov ebx, 0;"
<< endl;
break
;
}
case
0
:
{
uint8_t off
=
(uint8_t)
*
eip
+
+
;
/
/
ecx
=
(uint32_t)&eax[
4
*
off];
dasm <<
"xor edx, edx;"
<< endl;
dasm <<
"mov dl, "
<< (
int
)off <<
";"
<< endl;
dasm <<
"lea ebx, [ebp+edx*4];"
<< endl;
break
;
}
case
11
:
{
uint32_t off
=
*
(uint32_t
*
)eip;
/
/
esp
+
=
4
*
off;
dasm <<
"mov eax, "
<< (
int
)(off
*
4
) <<
";"
<< endl;
dasm <<
"add esp, eax;"
<< endl;
eip
+
=
4
;
break
;
}
case
4
:
{
ecx
=
*
(uint32_t
*
)eip;
eip
+
=
4
;
dasm <<
"mov ebx, "
<< (
int
)ecx <<
";"
<< endl;
break
;
}
case
40
:
{
/
/
We do
not
execute
/
/
char
*
buf
=
(char
*
)
*
((uint32_t
*
)esp
+
2
);
/
/
uint32_t size
=
*
(uint32_t
*
)esp;
/
/
ecx
=
(uint32_t)buf;
/
/
memset(buf, esp[
4
], size
+
(size &
3
));
/
/
eax
=
ebx;
dasm <<
"mov ecx, [esp+0];"
<< endl;
dasm <<
"xor eax, eax;"
<< endl;
dasm <<
"mov al, [esp+4];"
<< endl;
dasm <<
"mov edi, [esp+8];"
<< endl;
dasm <<
"mov ebx, edi;"
<< endl;
dasm <<
"rep stosb;"
<< endl;
break
;
}
case
42
:
{
/
/
We do
not
execute
/
/
ecx
=
(uint32_t)
*
((uint32_t
*
)esp
+
2
);
/
/
memcpy((void
*
)
*
((uint32_t
*
)esp
+
2
), (void
*
)
*
((uint32_t
*
)esp
+
1
),
*
((uint32_t
*
)esp));
/
/
eax
=
ebx;
dasm <<
"mov ecx, [esp+0];"
<< endl;
dasm <<
"mov edi, [esp+8];"
<< endl;
dasm <<
"mov esi, [esp+4];"
<< endl;
dasm <<
"mov ebx, edi;"
<< endl;
dasm <<
"rep movsb;"
<< endl;
break
;
}
case
9
:
{
uint32_t off
=
*
(uint32_t
*
)eip;
dasm <<
"test ebx, ebx;"
<< endl;
dasm <<
"jz vmins_"
<< (
int
)(vm_offset
+
1
+
4
) <<
";"
<< endl;
dasm <<
"jmp vmins_"
<< (
int
)(vm_offset
+
1
+
off) <<
";"
<< endl;
eip
+
=
4
;
break
;
}
case
2
:
{
uint32_t off
=
*
(uint32_t
*
)eip;
/
/
ecx
=
(uint32_t)&eax[
4
*
off];
eip
+
=
4
;
dasm <<
"mov ecx, "
<< (
int
)off <<
";"
<< endl;
dasm <<
"lea ebx, [ebp+ecx*4];"
<< endl;
break
;
}
case
7
:
{
uint32_t off
=
*
(uint32_t
*
)eip;
/
/
push(esp, (uint32_t)eip
+
4
);
/
/
In disassembly mode we do
not
jump, but skip this instruction.
/
/
eip
+
=
off;
dasm <<
"call vmins_"
<< (
int
)(vm_offset
+
1
+
off) <<
";"
<< endl;
dasm <<
"mov ebx, eax;"
<< endl;
eip
+
=
4
;
break
;
}
case
10
:
{
uint32_t off
=
*
(uint32_t
*
)eip;
dasm <<
"push ebp;"
<< endl;
dasm <<
"mov ebp, esp;"
<< endl;
dasm <<
"sub esp, "
<< off
*
4
<<
";"
<< endl;
eip
+
=
4
;
break
;
}
case
12
:
/
/
return
{
dasm <<
"mov eax, ebx;"
<< endl;
dasm <<
"mov esp, ebp;"
<< endl;
dasm <<
"pop ebp;"
<< endl;
dasm <<
"ret;"
<< endl;
break
;
}
case
43
:
{
dasm <<
"mov eax, [esp];"
<< endl;
dasm <<
"ret;"
<< endl;
goto finished;
}
default:
{
cout <<
"Error"
;
break
;
}
}
}
finished:
dasm <<
"vmins_ret:"
<< endl;
dasm <<
"push ebx;"
<< endl;
dasm <<
"mov eax, [esp];"
<< endl;
dasm <<
"ret;"
<< endl;
unsigned char
*
output;
size_t outlen
=
0
;
size_t outcnt
=
0
;
string disasm
=
dasm.
str
();
ofstream fout
=
ofstream(
"./disasm_vm1.txt"
, ios_base::ate);
fout << disasm;
fout.flush();
fout.close();
const char
*
code
=
disasm.c_str();
if
(ks_asm(ks, code,
0
, &output, &outlen, &outcnt) !
=
KS_ERR_OK)
{
ks_err err
=
ks_errno(ks);
cout << err;
}
fout
=
ofstream(
"./disasm_vm1.bin"
, ios_base::ate | ios_base::binary);
fout.write((const char
*
)output, outlen);
fout.flush();
fout.close();
ks_free(output);
ks_close(ks);
}