El segundo artículo de una pequeña serie sobre protección utilizado para ocultar el algoritmo de una aplicación. En el último artículo, cubrimos las partes principales de la protección y armamos una aplicación de prueba. Aquí nos familiarizaremos con la estructura de los controladores de comandos e intentaremos depurar y decodificar el archivo ejecutable.
Descripción del trabajo VMProtect
, -. :
;
;
, , .
:
, VMP . , .
, , VMP . .
pusha ;
push 0 ;
mov esi, [esp+x+var] ; esi = VM , x var
mov ebp, esp ; VMProtect , ebp = VM "stack"
sub esp, 0C0h
mov edi, esp ; edi = ,
:
add esi, [ebp+0]
:
mov al, [esi]; EIP
movzx eax, al
sub esi, -1; EIP
jmp ds:VMHandlers[eax*4] ;
, :
, , :
, , .
VM
x64dbg, Windows ( WinDBG). , , . :
, . , , main_loop. , :
main loop. , , ESI. EIP AX . . , , . , , breakpoint, . .
, :
"breakpoints" :
, "Log Text" . , : { : }
. eax
$breakpointcounter
.
Command Text
. , .
:
, — 669. , , . . notepad++ :
: ^(.*?)$\s+?^(?=.*^\1$)
53 . , .
, . , main loop. ? .
, :
import pefile
#
pe = pefile.PE(filePath)
#
image = pe.get_memory_mapped_image()
#
baseOffset = 0xB400
# 255
handlers = []
for i in range(255):
offset+=4
handlers.append(image[offset])
#
for h in handlers:
md = Cs(CS_ARCH_X86, CS_MODE_32)
for i in md.disasm(h, 0x1000):
print("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))
:
— .
"Reverse-Engineering. Basic".
« . 2»: type confusion; .