Разрабатываю собственный протектор с реализацией виртуализации инструкций.
На этапе инициализации возникла проблема, программа успешно находит целевой файл, но отказывается выполнять его маппинг в адресное пространство процесса, уже минут 30 не могу понять в чем проблема.
Был бы благодарен, если бы кто-то помог решить данную проблему
На этапе инициализации возникла проблема, программа успешно находит целевой файл, но отказывается выполнять его маппинг в адресное пространство процесса, уже минут 30 не могу понять в чем проблема.
Был бы благодарен, если бы кто-то помог решить данную проблему
C:
_MAP_FILE_TO_MEMORY:
lea rcx, [array]
mov rdx, 80000000h
mov r8, 1
xor r9, r9
mov qword [rsp + 20h], 3
mov qword [rsp + 28h], 80h
mov qword [rsp + 30h], 0
call [CreateFileA]
cmp rax, -1
je _FATAL_ERROR
mov [hFile], rax
mov r14, rax
mov rcx, r14
xor rdx, rdx
mov r8d, 2
xor r9d, r9d
mov qword [rsp + 20h], 0
mov qword [rsp + 28h], 0
call [CreateFileMappingA]
test rax, rax
jz _FATAL_ERROR
mov [hMap], rax
mov rcx, rax
mov edx, 4
xor r8d, r8d
xor r9d, r9d
mov qword [rsp + 20h], 0
call [MapViewOfFile]
test rax, rax
jz _FATAL_ERROR
mov [pMap], rax
mov r13, rax
lea rcx, [mapping_ok]
call [printf]
jmp _PARSE_PE_HEADER
C:
format PE64 console
entry start
include 'win64a.inc'
; const
INVALID_FILE_ATTRIBUTES equ -1
;-----
section '.data' data readable writeable
inputs db "Please specify the full path to the file: ", 0
fmt_path db '%[^\n]s', 0
; ----
msg_ok db 27, '[92m[GOOD]', 27, '[0m File accepted for processing! Compiling...', 10, 0
msg_bad db 27, '[91m[ERROR]', 27, '[0m This file does not exist or you have specified an incorrect path!', 10, 0
; ----
msg_no_mapping db 27, '[91m[ERROR]', 27, '[0m The file could not be mapped!', 10, 0
mapping_ok db 27, '[92m[GOOD]', 27, '[0m [+] File mapping...', 10, 0
section '.bss' readable writeable
hFile dq ?
hMap dq ?
pMap dq ?
dwSize dd ?
dwMode dd ?
hOut dq ?
array rb 260
section '.code' code readable executable
start:
sub rsp, 48h
mov rcx, -11
call [GetStdHandle]
mov [hOut], rax
mov rcx, [hOut]
mov rdx, dwMode
call [GetConsoleMode]
mov rcx, [hOut]
mov edx, [dwMode]
or edx, 4
call [SetConsoleMode]
; --- ---
lea rcx, [inputs]
call [printf]
lea rcx, [fmt_path]
lea rdx, [array]
call [scanf]
lea rcx, [array]
call [GetFileAttributesA]
cmp eax, INVALID_FILE_ATTRIBUTES
je file_not_found
; -----
lea rcx, [msg_ok]
call [printf]
call [_getch]
_MAP_FILE_TO_MEMORY:
lea rcx, [array]
mov rdx, 80000000h
mov r8, 1
xor r9, r9
mov qword [rsp + 20h], 3
mov qword [rsp + 28h], 80h
mov qword [rsp + 30h], 0
call [CreateFileA]
cmp rax, -1
je _FATAL_ERROR
mov [hFile], rax
mov r14, rax
mov rcx, r14
xor rdx, rdx
mov r8d, 2
xor r9d, r9d
mov qword [rsp + 20h], 0
mov qword [rsp + 28h], 0
call [CreateFileMappingA]
test rax, rax
jz _FATAL_ERROR
mov [hMap], rax
mov rcx, rax
mov edx, 4
xor r8d, r8d
xor r9d, r9d
mov qword [rsp + 20h], 0
call [MapViewOfFile]
test rax, rax
jz _FATAL_ERROR
mov [pMap], rax
mov r13, rax
lea rcx, [mapping_ok]
call [printf]
jmp _PARSE_PE_HEADER
_FATAL_ERROR:
lea rcx, [msg_no_mapping]
call [printf]
jmp _CLEANUP
_CLEANUP:
mov rcx, [pMap]
test rcx, rcx
jz @f
call [UnmapViewOfFile]
@@:
mov rcx, [hMap]
test rcx, rcx
jz @f
call [CloseHandle]
@@:
mov rcx, [hFile]
test rcx, rcx
jz @f
call [CloseHandle]
@@:
call [_getch]
xor rcx, rcx
call [ExitProcess]
_PARSE_PE_HEADER:
file_not_found:
lea rcx, [msg_bad]
call [printf]
call [_getch]
add rsp, 48h
ret
section '.idata' import data readable
library kernel32, 'kernel32.dll', \
msvcrt, 'msvcrt.dll'
import kernel32, \
GetStdHandle, 'GetStdHandle', \
GetConsoleMode, 'GetConsoleMode', \
SetConsoleMode, 'SetConsoleMode', \
ExitProcess, 'ExitProcess', \
GetFileAttributesA, 'GetFileAttributesA', \
CreateFileA, 'CreateFileA', \
CreateFileMappingA, 'CreateFileMappingA', \
MapViewOfFile, 'MapViewOfFile', \
UnmapViewOfFile, 'UnmapViewOfFile', \
CloseHandle, 'CloseHandle', \
GetFileSize, 'GetFileSize'
import msvcrt, \
printf, 'printf', \
_getch, '_getch', \
scanf, 'scanf', \
gets, 'gets'