Проблема Ассемблер. Проблема

Gemfory

Green Team
03.01.2026
19
7
Разрабатываю собственный протектор с реализацией виртуализации инструкций.
На этапе инициализации возникла проблема, программа успешно находит целевой файл, но отказывается выполнять его маппинг в адресное пространство процесса, уже минут 30 не могу понять в чем проблема.
Был бы благодарен, если бы кто-то помог решить данную проблему
1774690743584.webp


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'
 
GetLastError() что говорит?
Вот процедура, которая покажет код ошибки в читабельном виде - вставьте её вызов после MapViewOfFile(), и узнаете проблему.

C-подобный:
proc  GetError
        push    rax
        invoke  GetLastError
        invoke  FormatMessage,FORMAT_MESSAGE_FROM_SYSTEM,0,eax,0,errBuff,128,0
        invoke  MessageBox,0, errBuff, 0,0
        pop     rax
        ret
endp
 
GetLastError() что говорит?
Вот процедура, которая покажет код ошибки в читабельном виде - вставьте её вызов после MapViewOfFile(), и узнаете проблему.

C-подобный:
proc  GetError
        push    rax
        invoke  GetLastError
        invoke  FormatMessage,FORMAT_MESSAGE_FROM_SYSTEM,0,eax,0,errBuff,128,0
        invoke  MessageBox,0, errBuff, 0,0
        pop     rax
        ret
endp
Пишет ошибка прав доступа, странно.
Пробовал запускать от имени администратора, программа которая маппится написана мною
OneDrive отключен
 
Сомнительно, что это сработает так, как вы предполагаете.

З. Ы. Вообще говоря, подобные ошибки лучше смотреть в отладчике.
Вроде как реализация с fmt работает идеально
А в отладчике бы показало что-то вроде "Ошибка. Нет прав доступа"
 
Тоже самое, перепробовал все его варианты
Кроме реализации с локальным стеком, там бы программа упала с Acess Violation, именно права доступа изменял как у него в коде, все также ошибка прав доступа
 
Вот преобразование вашего исходного кода с ошибкой в псевдокод с явным указанием всех аргументов:

Код:
FUNCTION MapFileToMemory():
    // Подготовка стека для shadow space (4 регистра = 32 байта + 8 байт выравнивания)
    // В оригинале нет выделения места на стеке!
    
    // Вызов CreateFileA
    hFile = CreateFileA(
        lpFileName = &array,                    // указатель на имя файла
        dwDesiredAccess = 0x80000000,           // GENERIC_READ (только чтение)
        dwShareMode = 1,                        // FILE_SHARE_READ
        lpSecurityAttributes = NULL,             // нет атрибутов безопасности
        dwCreationDisposition = 3,               // OPEN_EXISTING (открыть существующий)
        dwFlagsAndAttributes = 0x80,             // FILE_ATTRIBUTE_NORMAL
        hTemplateFile = NULL                     // нет шаблона
    )
    
    IF hFile == INVALID_HANDLE_VALUE (-1) THEN
        GOTO _FATAL_ERROR
    END IF
    
    Store hFile in [hFile] and r14
    
    // Вызов CreateFileMappingA
    hMap = CreateFileMappingA(
        hFile = r14,                            // хэндл открытого файла
        lpAttributes = NULL,                    // атрибуты безопасности
        flProtect = 2,                          // PAGE_READONLY (только чтение!)
        dwMaximumSizeHigh = 0,
        dwMaximumSizeLow = 0,                   // размер = размер файла
        lpName = NULL                           // без имени
    )
    
    IF hMap == NULL THEN
        GOTO _FATAL_ERROR
    END IF
    
    Store hMap in [hMap]
    
    // Вызов MapViewOfFile
    pView = MapViewOfFile(
        hFileMappingObject = hMap,              // хэндл отображения
        dwDesiredAccess = 4,                    // FILE_MAP_WRITE (ЗАПИСЬ!) ⚠️
        dwFileOffsetHigh = 0,
        dwFileOffsetLow = 0,                    // с начала файла
        dwNumberOfBytesToMap = 0                 // весь файл
    )
    
    IF pView == NULL THEN
        GOTO _FATAL_ERROR
    END IF
    
    RETURN pView
    
_FATAL_ERROR:
    // Обработка ошибки
    RETURN NULL
END FUNCTION

## Ключевое противоречие (причина ERROR_ACCESS_DENIED):

Код:
CreateFile:           GENERIC_READ (только чтение)
                     ↓
CreateFileMapping:    PAGE_READONLY (страницы только для чтения)
                     ↓
MapViewOfFile:        FILE_MAP_WRITE (ЗАПИСЬ!) ❌ НЕСОВМЕСТИМО!

## Исправленный вариант (для чтения):

Код:
FUNCTION MapFileToMemory_ReadOnly():
    // Выделяем shadow space
    AllocateStack(40h)
    
    hFile = CreateFileA(
        lpFileName = &array,
        dwDesiredAccess = GENERIC_READ,         // 0x80000000
        dwShareMode = FILE_SHARE_READ,          // 1
        lpSecurityAttributes = NULL,
        dwCreationDisposition = OPEN_EXISTING,  // 3
        dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL, // 0x80
        hTemplateFile = NULL
    )
    
    IF hFile == INVALID_HANDLE THEN GOTO Error
    
    hMap = CreateFileMappingA(
        hFile = hFile,
        lpAttributes = NULL,
        flProtect = PAGE_READONLY,              // 2
        dwMaximumSizeHigh = 0,
        dwMaximumSizeLow = 0,
        lpName = NULL
    )
    
    IF hMap == NULL THEN GOTO ErrorCloseFile
    
    pView = MapViewOfFile(
        hFileMappingObject = hMap,
        dwDesiredAccess = FILE_MAP_READ,        // 2 (исправлено!)
        dwFileOffsetHigh = 0,
        dwFileOffsetLow = 0,
        dwNumberOfBytesToMap = 0
    )
    
    IF pView == NULL THEN GOTO ErrorCloseMap
    
    FreeStack(40h)
    RETURN pView
    
ErrorCloseMap:
    CloseHandle(hMap)
ErrorCloseFile:
    CloseHandle(hFile)
Error:
    FreeStack(40h)
    RETURN NULL
END FUNCTION

## Таблица соответствия прав доступа:

| Режим | CreateFile | CreateFileMapping | MapViewOfFile |
|-------|------------|-------------------|---------------|
| Только чтение | GENERIC_READ | PAGE_READONLY (2) | FILE_MAP_READ (2) |
| Чтение/Запись | GENERIC_READ \| GENERIC_WRITE | PAGE_READWRITE (4) | FILE_MAP_WRITE (4) |
| Копирование при записи | GENERIC_READ | PAGE_WRITECOPY (8) | FILE_MAP_COPY (1) |

Проблема в вашем коде: при открытии файла только для чтения, вы пытаетесь получить отображение с правами на запись (FILE_MAP_WRITE), что система не позволяет сделать, возвращая ERROR_ACCESS_DENIED.
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Курс AD