Хорошо, вижу с lld-link не заладилось. Как слинковать с помощью golink? Не могу уже стоять на месте, время пожимает, с lld-link разберемся потом, а сейчас нужно писать. Как слинковать и где тут ошибки? Код (ASM): BITS 64 extern ExitProcess extern MessageBoxA SECTION .data MessageBoxText db "Do you want to exit?", 0 MessageBoxCaption db "MessageBox 64", 0 SECTION .code global start start: nop nop nop mov r9 , 0 mov r8 , MessageBoxCaption mov rdx , MessageBoxText mov rcx , 0 call MessageBoxA mov rcx , 0 call ExitProcess nasm prog.asm -f win64 -o prog.obj golink prog.obj kernel32.dll user32.dll /entry start делаю так - и тишина... программа не отрабатывает как нужно
Hacker, попробуй Код (ASM): global start NULL equ 0 MB_OK equ 0 extern MessageBoxA ;from user32 extern ExitProcess ;from kernel32 section .data hello: db 'Hello, Windows!',0 title: db 'My First Win64',0 section .text start: sub rsp,40 mov r9,MB_OK mov r8,title mov rdx,hello mov rcx,NULL call MessageBoxA xor ecx,ecx call ExitProcess ;nasm -f win64 myprog.asm ;golink myprog.obj user32.dll kernel32.dll
то же самое, программа не работает... в x64dbg вижу что заходит в главную процедуру, отнупывается, но MessageBoxA возвращает 0 в rax
Да! Огромное спасибо! Будем работать! Прошу поясните пожалуйста почему Вы делаете sub rsp,40 при входе в главную процедуру? Это делается единожды или в каждой процедуре нужно будет выравнивать стек?
Hacker, прочитай Сказки дядюшки Римуса кстати, можно и вот так Код (ASM): global start extern MessageBoxA ;from user32 extern ExitProcess ;from kernel32 section .text start: push rbp ;sub rsp,40 xor r9d,r9d ;mov r9,MB_OK mov r8d,title mov edx,hello xor ecx,ecx ;mov rcx,NULL call MessageBoxA xor ecx,ecx call ExitProcess hello: db 'Hello, Windows!',0 title: db 'My First Win64',0
Для дальнейшей работы мне понадобится GetLastError Почему-то линкер ругается, я все проверил сто раз не пойму на что Код (ASM): global start NULL equ 0 SC_MANAGER_ALL_ACCESS equ 0xF003F FORMAT_MESSAGE_ALLOCATE_BUFFER equ 0x00000100 FORMAT_MESSAGE_FROM_SYSTEM equ 0x00001000 extern MessageBoxA extern ExitProcess extern GetLastError extern FormatMessage extern OpenSCManagerA section .data dwError resq 1 section .code start: sub rsp,40 mov rcx , SC_MANAGER_ALL_ACCESS mov rdx , NULL mov r8 , NULL call OpenSCManagerA call GetLastError mov rcx , NULL mov rdx , NULL mov r8 , dwError mov r9 , NULL push rax push NULL push FORMAT_MESSAGE_ALLOCATE_BUFFER + FORMAT_MESSAGE_FROM_SYSTEM call FormatMessage mov rcx , NULL mov rdx , NULL mov r8 , dwError mov r9 , NULL call MessageBoxA mov rcx , rax call ExitProcess C:\Users\Alex\Desktop>nasm -f win64 GLE.asm GLE.asm:18: warning: uninitialised space declared in non-BSS section `.data': zeroing [-w+zeroing] C:\Users\Alex\Desktop>golink GLE.obj user32.dll kernel32.dll advapi32.dll GoLink.Exe Version 1.0.3.1 Copyright Jeremy Gordon 2002-2020 info@goprog.com Error! The following symbol was not defined in the object file or files:- FormatMessage Output file not made Я понимаю, программирование на ассемблер требует внимательности, но я научусь привыкну находить свои ошибки, помогите мне в начале пожалуйста, я только учусь.
extern FormatMessageA call FormatMessageA golink myprog1.obj user32.dll kernel32.dll advapi32.dll Hacker, ты получишь ехе-файл, но он работать не будет, так как в исходном файле ошибка на ошибке
Майкл, не могли бы Вы поправить меня? Аргументы я передаю правильно функции? RCX , RDX , R8 , R9 , и дальше PUSH'ы Вот такой вариант то же не работает у меня Код (ASM): global start NULL equ 0 SC_MANAGER_ALL_ACCESS equ 0xF003F FORMAT_MESSAGE_ALLOCATE_BUFFER equ 0x00000100 FORMAT_MESSAGE_FROM_SYSTEM equ 0x00001000 extern MessageBoxA extern ExitProcess extern GetLastError extern FormatMessageA extern OpenSCManagerA extern CloseServiceHandle section .data dwError resq 1 schSCManager resq 1 section .code start: sub rsp,40 mov rcx , SC_MANAGER_ALL_ACCESS mov rdx , NULL mov r8 , NULL call OpenSCManagerA mov [schSCManager] , rax call GetLastError mov rcx , NULL mov rdx , NULL mov r8 , [dwError] mov r9 , NULL push rax push NULL push FORMAT_MESSAGE_ALLOCATE_BUFFER + FORMAT_MESSAGE_FROM_SYSTEM call FormatMessageA mov rcx , NULL mov rdx , NULL mov r8 , dwError mov r9 , NULL call MessageBoxA mov rcx , schSCManager call CloseServiceHandle mov rcx , rax call ExitProcess
Hacker, можно и пушами, но правильнее через mov [rsp+XXh],argN Код (ASM): mov [rsp+30h],arg7 mov [rsp+28h],arg6 mov [rsp+20h],arg5 mov r9,arg4 mov r8,arg3 mov rdx,arg2 mov rcx,arg1 call foo И у меня возник вопрос, правильные ли аргументы передаются OpenSCManagerA, FormatMessageA и MessageBoxA ? Мне почему-то кажется, что неправильные. Покажи работающий первоисточник Код (C++): DWORD FormatMessage(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPTSTR lpBuffer, DWORD nSize, va_list *Arguments ); Код (C++): SC_HANDLE OpenSCManagerA( LPCSTR lpMachineName, LPCSTR lpDatabaseName, DWORD dwDesiredAccess ); Код (C++): int MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType );
Первоисточника нету, как работать с сервисами прочитал из книги... про формат LastError смотрю в интернете коды Код (ASM): mov r8 , SC_MANAGER_ALL_ACCESS mov rdx , NULL mov rcx , NULL call OpenSCManagerA Если запускать от админа HANDLE выдается, в противном случаи NULL Код (ASM): global start NULL equ 0 SC_MANAGER_ALL_ACCESS equ 0xF003F FORMAT_MESSAGE_ALLOCATE_BUFFER equ 0x00000100 FORMAT_MESSAGE_FROM_SYSTEM equ 0x00001000 extern MessageBoxA extern ExitProcess extern GetLastError extern FormatMessageA extern OpenSCManagerA extern CloseServiceHandle section .data dwError resq 1 schSCManager resq 1 section .code start: sub rsp,40 mov r8 , SC_MANAGER_ALL_ACCESS mov rdx , NULL mov rcx , NULL call OpenSCManagerA mov [schSCManager] , rax call GetLastError push FORMAT_MESSAGE_ALLOCATE_BUFFER + FORMAT_MESSAGE_FROM_SYSTEM push rax mov r9 , NULL mov r8 , NULL mov rdx , dwError mov rcx , NULL call FormatMessageA mov r9 , NULL mov r8 , NULL mov rdx , dwError mov rcx , NULL call MessageBoxA mov rcx , schSCManager call CloseServiceHandle mov rcx , rax call ExitProcess вот так работает но номера ошибки не видно почемуто в МесаджБоксе
Hacker, для начала посмотри какие параметры передаются в MessageBox и FormatMessage, и ЧТО передаешь ты строка sub rsp,40 ― число будет зависеть от функции с максимальным числом аргументов и должно быть кратно 16, поэтому здесь 7*8 (число параметров в FormatMessage)+8 для выравнивания не передавай параметры через push, только через mov Попробуй написать свою программу на C++/Delphi, добейся чтобы заработала, а уже потом пиши на NASM
Не совсем понял, но вот так вот ни чего вообще не работает: Код (ASM): global start NULL equ 0 SC_MANAGER_ALL_ACCESS equ 0xF003F FORMAT_MESSAGE_ALLOCATE_BUFFER equ 0x00000100 FORMAT_MESSAGE_FROM_SYSTEM equ 0x00001000 extern MessageBoxA extern ExitProcess extern GetLastError extern FormatMessageA extern OpenSCManagerA extern CloseServiceHandle section .data dwError resq 1 schSCManager resq 1 section .code start: sub rsp,64 mov r8 , SC_MANAGER_ALL_ACCESS mov rdx , NULL mov rcx , NULL call OpenSCManagerA mov [schSCManager] , rax call GetLastError mov dword [rsp+28h] , FORMAT_MESSAGE_ALLOCATE_BUFFER + FORMAT_MESSAGE_FROM_SYSTEM mov [rsp+20h] , rax mov r9 , NULL mov r8 , NULL mov rdx , [dwError] mov rcx , NULL call FormatMessageA mov r9 , NULL mov r8 , NULL mov rdx , [dwError] mov rcx , NULL call MessageBoxA mov rcx , schSCManager call CloseServiceHandle mov rcx , rax call ExitProcess
Hacker, внимательно прочитай то, о чем написано в #11 особенно о параметрах MessageBox и FormatMessage. Код ошибки нужно преобразовать в строку из цифр, эту строку и будет выводить MessageBox. Посмотри примеры в сети
Не могу найти ни одного толкового примера GetLastError на ассемблере --- Сообщение объединено, 9 янв 2021 --- Я как-то делал сто лет назад помню нормально, на fasm, был код на этом форуме, но куда-то он делся не могу найти
Мне давно интересно, а почему это правильнее пушей? GCC компилятор, например, так делает и в 32-битном режиме.
Rel, тут нужно учесть два момента перед тем как пересылать аргументы при помощи push нужно сделать sub rsp,20h количество push должно быть четным поэтому новичку IMHO лучше передавать аргументы через mov [rsp+XXh], argN Hacker, С GetLastError у тебя проблемы нет, проблемы с MessageBox и FormatMessage вот по ним и ищи примеры на С++/Delphi
Нашел тут свои старые коды! Ура! Правильно это делается так: Код (ASM): global start NULL equ 0 SC_MANAGER_ALL_ACCESS equ 0xF003F extern MessageBoxA extern ExitProcess extern GetLastError extern FormatMessageA extern OpenSCManagerA extern CloseServiceHandle extern wsprintfA section .data ErrorCode db 256 dup(?) Format db '%08Xh',0 schSCManager resq 1 section .code start: sub rsp,40 mov r8 , SC_MANAGER_ALL_ACCESS mov rdx , NULL mov rcx , NULL call OpenSCManagerA mov [schSCManager] , rax call GetLastError mov r8 , rax mov rdx , Format mov rcx , ErrorCode call wsprintfA mov r9 , NULL mov r8 , NULL mov rdx , ErrorCode mov rcx , NULL call MessageBoxA mov rcx , schSCManager call CloseServiceHandle mov rcx , rax call ExitProcess
Hacker, Код (ASM): global start NULL equ 0 SC_MANAGER_ALL_ACCESS equ 0xF003F extern MessageBoxA extern ExitProcess extern GetLastError extern FormatMessageA extern OpenSCManagerA extern CloseServiceHandle extern wsprintfA section .bss ErrorCode resb 256 schSCManager resq 1 section .data Format db '%08Xh',0 section .code start: sub esp,40 mov r8d, SC_MANAGER_ALL_ACCESS xor edx,edx xor ecx,ecx call OpenSCManagerA mov [schSCManager],rax call GetLastError mov r8d,eax mov edx,Format mov ecx,ErrorCode call wsprintfA xor r9d,r9d xor r8d,r8d mov edx,ErrorCode xor ecx,ecx call MessageBoxA mov rcx,[schSCManager] call CloseServiceHandle xor ecx,ecx call ExitProcess Hacker, NASM'у линкер (GoLink, alink и т.д.) не очень-то и нужен, заголовок и импорт NASM позволяет пользователю добавлять самому, так же как это делает FASM
Как правильно добавить include вот такова вида, как должно выглядеть форматирование? Код (ASM): wget_len = 4923280d ;004b1f90h wget: db 04dh, 05ah, 090h, 000h, 003h, 000h, 000h, 000h, 004h, 000h'\ db 000h, 000h, 0ffh, 0ffh, 000h, 000h, 0b8h, 000h, 000h, 000h'\ db 000h, 000h, 000h, 000h, 040h, 000h, 000h, 000h, 000h, 000h'\ db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h' ... Ругается: wget.inc:22: error: parser: instruction expected wget.inc:23: warning: unterminated string [-w+other] wget.inc:23: error: comma expected after operand wget.inc:56: warning: unterminated string [-w+other] wget.inc:57: warning: unterminated string [-w+other] вобщем по всякому Нужно запаковать в db и распаковать в File - wget ____ Hacker, NASM'у линкер (GoLink, alink и т.д.) не очень-то и нужен, заголовок и импорт NASM позволяет пользователю добавлять самому, так же как это делает FASM [/quote] Я хотел использовать lld-link из набора msys2 но что-то не срастается. Подскажете пожалуйста как собирать без GoLink?!
Hacker, я давно не писал на NASM но 000h'\ (кавычки и слэши) здесь лишние, для повторяющихся символов есть директива times хорошо бы книжку по NASM найти, чтобы не тыкаться, как слепой котенок