Нарушение прав доступа при попытке изменить байт в процедуре сборки под NASM Windows - PullRequest
0 голосов
/ 17 февраля 2019

Я совершенно новичок в сборке, и я программирую в Linux около 2 недель и могу выводить определенную информацию на терминал под Linux.Однако сегодня, когда я начал писать код под Windows, я столкнулся с проблемой: я не могу изменить байт в строке, которую я передаю в качестве параметра функции.Я отладил программу в OllyDbg, и она говорит мне, что при записи в [адрес] есть нарушение прав доступа - используйте Shift F7 / F8 / F9 для передачи исключения в программу.Я не могу передать исключение в программу, так как в программе нет обработчика исключений.Это незаконно, чтобы изменить символ в строке, переданной процедуре?Я разместил код ниже.

section .bss
    var resb 6

section .text
    global _start
    _start:
        xor eax, eax                        ; empty all registers
        xor ebx, ebx
        xor ecx, ecx
        xor edx, edx
        jmp short get_library
    get_lib_addr:                           ; get_lib_addr(char *name)
        mov ecx, [esp+8]                    ; get the first parameter
        xor edx, edx                        ; zero out register
        mov byte [ecx+6], dl                ; add null terminating character to string
        jmp short fin                       ; go to end
    get_library:
        xor ecx, ecx
        mov ebx, var                        ; start address of var
        jmp start_loop                      ; start looping
    start_loop:
        cmp ecx, 5
        jge end_loop
        mov byte [ebx+ecx], 'h'
        inc ecx
        jmp start_loop
    end_loop:
        push dword var                      ; at this point - var = "hhhhh"
        call get_lib_addr                   ; call get_lib_addr("hhhhh")
    fin:
        xor eax, eax
        mov ebx, 0x750b4b80                 ; ExitProcess
        push eax                            ; eax = 0
        call ebx                            ; ExitProcess(0)

И скриншот отладки в OllyDbg.

https://imgur.com/a/48RAXOw

2-й случай Частькод Кодировка оболочки Vivid Machines для Linux и Windows скопирована ниже.Когда я пытаюсь использовать этот синтаксис для передачи параметров (при условии, что это то, что происходит), я получаю нарушение прав доступа при попытке изменить строку и добавить нулевой завершающий символ вместо N.Я уверен, что строка передана и ecx получает правильную строку.По какой-либо причине это не работает?

LibraryReturn:
    pop ecx             ;get the library string
    mov [ecx + 10], dl      ;insert NULL - ***Access violation here***

;the N at the end of each string signifies the location of the NULL
;character that needs to be inserted

GetLibrary:
    call LibraryReturn
    db 'user32.dllN'

Снимок экрана с отладочной информацией во втором сценарии, показывающий, что N действительно является редактируемым значением.

https://imgur.com/a/W5vdR7d

...