Я совершенно новичок в сборке, и я программирую в 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