NASM WIN64 HELLO WORLD

Тема в разделе "NASM", создана пользователем Hacker, 9 янв 2021.

  1. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    169
    Адрес:
    Москва
    Хорошо, вижу с lld-link не заладилось.
    Как слинковать с помощью golink?
    Не могу уже стоять на месте, время пожимает, с lld-link разберемся потом, а сейчас нужно писать.
    Как слинковать и где тут ошибки?
    Код (ASM):
    1.  
    2. BITS 64
    3.  
    4. extern ExitProcess
    5. extern MessageBoxA
    6.  
    7. SECTION .data
    8.  MessageBoxText    db "Do you want to exit?", 0
    9.  MessageBoxCaption db "MessageBox 64", 0
    10.  
    11. SECTION .code
    12.  
    13. global start
    14. start:
    15.  
    16. nop
    17. nop
    18. nop
    19.  
    20.   mov r9 , 0
    21.   mov r8 , MessageBoxCaption
    22.   mov rdx , MessageBoxText
    23.   mov rcx , 0
    24.   call MessageBoxA
    25.  
    26.   mov rcx , 0
    27.   call ExitProcess
    28.  
    nasm prog.asm -f win64 -o prog.obj
    golink prog.obj kernel32.dll user32.dll /entry start

    делаю так - и тишина... программа не отрабатывает как нужно :dntknw:
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.707
    Hacker,
    попробуй
    Код (ASM):
    1. global start
    2.  
    3. NULL  equ 0
    4. MB_OK equ 0
    5.  
    6. extern MessageBoxA   ;from user32
    7. extern ExitProcess   ;from kernel32
    8.  
    9. section .data
    10. hello:  db 'Hello, Windows!',0
    11. title:  db 'My First Win64',0
    12.  
    13. section .text
    14. start:
    15.         sub     rsp,40
    16.  
    17.         mov     r9,MB_OK
    18.         mov     r8,title
    19.         mov     rdx,hello
    20.         mov     rcx,NULL
    21.         call    MessageBoxA
    22.  
    23.         xor     ecx,ecx
    24.         call    ExitProcess
    25.  
    26. ;nasm -f win64 myprog.asm
    27. ;golink myprog.obj user32.dll kernel32.dll
     
  3. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    169
    Адрес:
    Москва
    то же самое, программа не работает... в x64dbg вижу что заходит в главную процедуру, отнупывается, но MessageBoxA возвращает 0 в rax
     
  4. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    169
    Адрес:
    Москва
    Да! Огромное спасибо! Будем работать!
    Прошу поясните пожалуйста почему Вы делаете
    sub rsp,40
    при входе в главную процедуру? Это делается единожды или в каждой процедуре нужно будет выравнивать стек?
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.707
    Hacker,
    прочитай Сказки дядюшки Римуса
    кстати, можно и вот так
    Код (ASM):
    1. global start
    2. extern MessageBoxA   ;from user32
    3. extern ExitProcess   ;from kernel32
    4. section .text
    5. start:  push    rbp       ;sub     rsp,40
    6.         xor     r9d,r9d   ;mov     r9,MB_OK
    7.         mov     r8d,title
    8.         mov     edx,hello
    9.         xor     ecx,ecx   ;mov     rcx,NULL
    10.         call    MessageBoxA
    11.         xor     ecx,ecx
    12.         call    ExitProcess
    13. hello:  db 'Hello, Windows!',0
    14. title:  db 'My First Win64',0
    ;)
     
    Aiks нравится это.
  6. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    169
    Адрес:
    Москва
    Для дальнейшей работы мне понадобится GetLastError
    Почему-то линкер ругается, я все проверил сто раз не пойму на что :dntknw:

    Код (ASM):
    1.  
    2. global start
    3.  
    4. NULL equ 0
    5. SC_MANAGER_ALL_ACCESS equ 0xF003F
    6. FORMAT_MESSAGE_ALLOCATE_BUFFER equ 0x00000100
    7. FORMAT_MESSAGE_FROM_SYSTEM equ 0x00001000
    8.  
    9.  extern MessageBoxA
    10.  extern ExitProcess
    11.  extern GetLastError
    12.  extern FormatMessage
    13.  extern OpenSCManagerA
    14.  
    15. section .data
    16. dwError resq 1
    17.  
    18. section .code
    19. start:
    20.  
    21. sub rsp,40
    22.  
    23. mov rcx , SC_MANAGER_ALL_ACCESS
    24. mov rdx , NULL
    25. mov r8 , NULL
    26. call OpenSCManagerA
    27.  
    28. call GetLastError
    29.  
    30. mov rcx , NULL
    31. mov rdx , NULL
    32. mov r8 , dwError
    33. mov r9 , NULL
    34. push rax
    35. push NULL
    36. push FORMAT_MESSAGE_ALLOCATE_BUFFER + FORMAT_MESSAGE_FROM_SYSTEM
    37. call FormatMessage
    38.  
    39. mov rcx , NULL
    40. mov rdx , NULL
    41. mov r8 , dwError
    42. mov r9 , NULL
    43. call MessageBoxA
    44.  
    45. mov rcx , rax
    46. call ExitProcess
    47.  
    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


    Я понимаю, программирование на ассемблер требует внимательности, но я научусь привыкну находить свои ошибки, помогите мне в начале пожалуйста, я только учусь.
     
    Последнее редактирование: 9 янв 2021
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.707
    1. extern FormatMessageA
    2. call FormatMessageA
    3. golink myprog1.obj user32.dll kernel32.dll advapi32.dll
    Hacker,
    ты получишь ехе-файл, но он работать не будет, так как в исходном файле ошибка на ошибке :negative:
     
  8. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    169
    Адрес:
    Москва
    Майкл, не могли бы Вы поправить меня?
    Аргументы я передаю правильно функции?
    RCX , RDX , R8 , R9 , и дальше PUSH'ы

    Вот такой вариант то же не работает у меня :dntknw:

    Код (ASM):
    1.  
    2. global start
    3.  
    4. NULL equ 0
    5.  
    6. SC_MANAGER_ALL_ACCESS equ 0xF003F
    7. FORMAT_MESSAGE_ALLOCATE_BUFFER equ 0x00000100
    8. FORMAT_MESSAGE_FROM_SYSTEM equ 0x00001000
    9.  
    10.  extern MessageBoxA
    11.  extern ExitProcess
    12.  extern GetLastError
    13.  extern FormatMessageA
    14.  extern OpenSCManagerA
    15.  extern CloseServiceHandle
    16.  
    17. section .data
    18.  
    19. dwError resq 1
    20. schSCManager resq 1
    21.  
    22. section .code
    23. start:
    24.  
    25. sub rsp,40
    26.  
    27. mov rcx , SC_MANAGER_ALL_ACCESS
    28. mov rdx , NULL
    29. mov r8 , NULL
    30. call OpenSCManagerA
    31.  
    32. mov [schSCManager] , rax
    33.  
    34. call GetLastError
    35.  
    36. mov rcx , NULL
    37. mov rdx , NULL
    38. mov r8 , [dwError]
    39. mov r9 , NULL
    40. push rax
    41. push NULL
    42. push FORMAT_MESSAGE_ALLOCATE_BUFFER + FORMAT_MESSAGE_FROM_SYSTEM
    43. call FormatMessageA
    44.  
    45. mov rcx , NULL
    46. mov rdx , NULL
    47. mov r8 , dwError
    48. mov r9 , NULL
    49. call MessageBoxA
    50.  
    51. mov rcx , schSCManager
    52. call CloseServiceHandle
    53.  
    54. mov rcx , rax
    55. call ExitProcess
    56.  
     
    Последнее редактирование: 9 янв 2021
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.707
    Hacker,
    можно и пушами, но правильнее через mov [rsp+XXh],argN
    Код (ASM):
    1. mov [rsp+30h],arg7
    2. mov [rsp+28h],arg6
    3. mov [rsp+20h],arg5
    4. mov r9,arg4
    5. mov r8,arg3
    6. mov rdx,arg2
    7. mov rcx,arg1
    8. call foo
    И у меня возник вопрос, правильные ли аргументы передаются OpenSCManagerA, FormatMessageA и MessageBoxA ?
    Мне почему-то кажется, что неправильные. Покажи работающий первоисточник
    Код (C++):
    1. DWORD FormatMessage(DWORD dwFlags,
    2. LPCVOID lpSource,
    3. DWORD dwMessageId,
    4. DWORD dwLanguageId,
    5. LPTSTR lpBuffer,
    6. DWORD nSize,
    7. va_list *Arguments );
    Код (C++):
    1. SC_HANDLE OpenSCManagerA( LPCSTR lpMachineName,
    2.  LPCSTR lpDatabaseName,
    3.  DWORD dwDesiredAccess );
    Код (C++):
    1. int MessageBox( HWND hWnd,
    2.  LPCTSTR lpText,
    3.  LPCTSTR lpCaption,
    4.  UINT uType );
     
  10. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    169
    Адрес:
    Москва
    Первоисточника нету, как работать с сервисами прочитал из книги... про формат LastError смотрю в интернете коды
    Код (ASM):
    1.  
    2. mov r8 , SC_MANAGER_ALL_ACCESS
    3. mov rdx , NULL
    4. mov rcx , NULL
    5. call OpenSCManagerA
    6.  
    Если запускать от админа HANDLE выдается, в противном случаи NULL

    Код (ASM):
    1.  
    2. global start
    3.  
    4. NULL equ 0
    5.  
    6. SC_MANAGER_ALL_ACCESS equ 0xF003F
    7. FORMAT_MESSAGE_ALLOCATE_BUFFER equ 0x00000100
    8. FORMAT_MESSAGE_FROM_SYSTEM equ 0x00001000
    9.  
    10.  extern MessageBoxA
    11.  extern ExitProcess
    12.  extern GetLastError
    13.  extern FormatMessageA
    14.  extern OpenSCManagerA
    15.  extern CloseServiceHandle
    16.  
    17. section .data
    18. dwError resq 1
    19. schSCManager resq 1
    20.  
    21. section .code
    22. start:
    23.  
    24. sub rsp,40
    25.  
    26. mov r8 , SC_MANAGER_ALL_ACCESS
    27. mov rdx , NULL
    28. mov rcx , NULL
    29. call OpenSCManagerA
    30.  
    31. mov [schSCManager] , rax
    32.  
    33. call GetLastError
    34.  
    35. push FORMAT_MESSAGE_ALLOCATE_BUFFER + FORMAT_MESSAGE_FROM_SYSTEM
    36. push rax
    37. mov r9 , NULL
    38. mov r8 , NULL
    39. mov rdx , dwError
    40. mov rcx , NULL
    41. call FormatMessageA
    42.  
    43. mov r9 , NULL
    44. mov r8 , NULL
    45. mov rdx , dwError
    46. mov rcx , NULL
    47. call MessageBoxA
    48.  
    49. mov rcx , schSCManager
    50. call CloseServiceHandle
    51.  
    52. mov rcx , rax
    53. call ExitProcess
    54.  
    вот так работает но номера ошибки не видно почемуто в МесаджБоксе
     
    Последнее редактирование: 9 янв 2021
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.707
    Hacker,
    1. для начала посмотри какие параметры передаются в MessageBox и FormatMessage, и ЧТО передаешь ты
    2. строка sub rsp,40 ― число будет зависеть от функции с максимальным числом аргументов и должно быть кратно 16, поэтому здесь 7*8 (число параметров в FormatMessage)+8 для выравнивания
    3. не передавай параметры через push, только через mov
    4. Попробуй написать свою программу на C++/Delphi, добейся чтобы заработала, а уже потом пиши на NASM
     
  12. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    169
    Адрес:
    Москва
    Не совсем понял, но вот так вот ни чего вообще не работает:

    Код (ASM):
    1.  
    2. global start
    3.  
    4. NULL equ 0
    5.  
    6. SC_MANAGER_ALL_ACCESS equ 0xF003F
    7. FORMAT_MESSAGE_ALLOCATE_BUFFER equ 0x00000100
    8. FORMAT_MESSAGE_FROM_SYSTEM equ 0x00001000
    9.  
    10.  extern MessageBoxA
    11.  extern ExitProcess
    12.  extern GetLastError
    13.  extern FormatMessageA
    14.  extern OpenSCManagerA
    15.  extern CloseServiceHandle
    16.  
    17. section .data
    18.  
    19. dwError resq 1
    20. schSCManager resq 1
    21.  
    22. section .code
    23. start:
    24.  
    25. sub rsp,64
    26.  
    27. mov r8 , SC_MANAGER_ALL_ACCESS
    28. mov rdx , NULL
    29. mov rcx , NULL
    30. call OpenSCManagerA
    31.  
    32. mov [schSCManager] , rax
    33.  
    34. call GetLastError
    35.  
    36. mov dword [rsp+28h] , FORMAT_MESSAGE_ALLOCATE_BUFFER + FORMAT_MESSAGE_FROM_SYSTEM
    37. mov [rsp+20h] , rax
    38. mov r9 , NULL
    39. mov r8 , NULL
    40. mov rdx , [dwError]
    41. mov rcx , NULL
    42. call FormatMessageA
    43.  
    44. mov r9 , NULL
    45. mov r8 , NULL
    46. mov rdx , [dwError]
    47. mov rcx , NULL
    48. call MessageBoxA
    49.  
    50. mov rcx , schSCManager
    51. call CloseServiceHandle
    52.  
    53. mov rcx , rax
    54. call ExitProcess
    55.  
     
  13. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.707
    Hacker,
    внимательно прочитай то, о чем написано в #11 особенно о параметрах MessageBox и FormatMessage. Код ошибки нужно преобразовать в строку из цифр, эту строку и будет выводить MessageBox. Посмотри примеры в сети
     
  14. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    169
    Адрес:
    Москва
    Не могу найти ни одного толкового примера GetLastError на ассемблере
    --- Сообщение объединено, 9 янв 2021 ---
    Я как-то делал сто лет назад помню нормально, на fasm, был код на этом форуме, но куда-то он делся не могу найти :dntknw:
     
    Последнее редактирование: 9 янв 2021
  15. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.235
    Мне давно интересно, а почему это правильнее пушей? GCC компилятор, например, так делает и в 32-битном режиме.
     
  16. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.707
    Rel, тут нужно учесть два момента
    1. перед тем как пересылать аргументы при помощи push нужно сделать sub rsp,20h
    2. количество push должно быть четным
    поэтому новичку IMHO лучше передавать аргументы через mov [rsp+XXh], argN

    Hacker,
    С GetLastError у тебя проблемы нет, проблемы с MessageBox и FormatMessage вот по ним и ищи примеры на С++/Delphi
     
  17. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    169
    Адрес:
    Москва
    Нашел тут свои старые коды! Ура!
    Правильно это делается так:

    Код (ASM):
    1.  
    2. global start
    3.  
    4. NULL equ 0
    5.  
    6. SC_MANAGER_ALL_ACCESS equ 0xF003F
    7.  
    8.  extern MessageBoxA
    9.  extern ExitProcess
    10.  extern GetLastError
    11.  extern FormatMessageA
    12.  extern OpenSCManagerA
    13.  extern CloseServiceHandle
    14.  extern wsprintfA
    15.  
    16. section .data
    17.  
    18.     ErrorCode db 256 dup(?)
    19.     Format db '%08Xh',0
    20.  
    21.     schSCManager resq 1
    22.  
    23. section .code
    24. start:
    25.  
    26. sub rsp,40
    27.  
    28. mov r8 , SC_MANAGER_ALL_ACCESS
    29. mov rdx , NULL
    30. mov rcx , NULL
    31. call OpenSCManagerA
    32.  
    33. mov [schSCManager] , rax
    34.  
    35. call GetLastError
    36.  
    37. mov r8 , rax
    38. mov rdx , Format
    39. mov rcx , ErrorCode
    40. call wsprintfA
    41.  
    42. mov r9 , NULL
    43. mov r8 , NULL
    44. mov rdx , ErrorCode
    45. mov rcx , NULL
    46. call MessageBoxA
    47.  
    48. mov rcx , schSCManager
    49. call CloseServiceHandle
    50.  
    51. mov rcx , rax
    52. call ExitProcess
    53.  
     
    Mikl___ нравится это.
  18. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.707
    Hacker,

    Код (ASM):
    1. global start
    2. NULL  equ 0
    3. SC_MANAGER_ALL_ACCESS equ 0xF003F
    4.  extern MessageBoxA
    5.  extern ExitProcess
    6.  extern GetLastError
    7.  extern FormatMessageA
    8.  extern OpenSCManagerA
    9.  extern CloseServiceHandle
    10.  extern wsprintfA
    11. section .bss
    12.     ErrorCode resb 256
    13.     schSCManager resq 1
    14. section .data
    15.     Format db '%08Xh',0
    16. section .code
    17. start: sub esp,40
    18.    mov r8d, SC_MANAGER_ALL_ACCESS
    19.    xor edx,edx
    20.    xor ecx,ecx
    21.    call OpenSCManagerA
    22.    mov [schSCManager],rax
    23.    call GetLastError
    24.    mov r8d,eax
    25.    mov edx,Format
    26.    mov ecx,ErrorCode
    27.    call wsprintfA
    28.    xor r9d,r9d
    29.    xor r8d,r8d
    30.    mov edx,ErrorCode
    31.    xor ecx,ecx
    32.    call MessageBoxA
    33.    mov rcx,[schSCManager]
    34.    call CloseServiceHandle
    35.    xor ecx,ecx
    36.    call ExitProcess

    Hacker,
    NASM'у линкер (GoLink, alink и т.д.) не очень-то и нужен, заголовок и импорт NASM позволяет пользователю добавлять самому, так же как это делает FASM ;)
     
  19. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    169
    Адрес:
    Москва
    Как правильно добавить include вот такова вида, как должно выглядеть форматирование?

    Код (ASM):
    1.  
    2. wget_len = 4923280d ;004b1f90h
    3. wget: db 04dh, 05ah, 090h, 000h, 003h, 000h, 000h, 000h, 004h, 000h'\
    4.           db 000h, 000h, 0ffh, 0ffh, 000h, 000h, 0b8h, 000h, 000h, 000h'\
    5.            db 000h, 000h, 000h, 000h, 040h, 000h, 000h, 000h, 000h, 000h'\
    6.           db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h'
    7.                        ...
    8.  
    Ругается:
    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]

    вобщем по всякому :dntknw:

    Нужно запаковать в db и распаковать в File - wget

    ____

    Hacker,
    NASM'у линкер (GoLink, alink и т.д.) не очень-то и нужен, заголовок и импорт NASM позволяет пользователю добавлять самому, так же как это делает FASM ;)[/quote]
    Я хотел использовать lld-link из набора msys2 но что-то не срастается. Подскажете пожалуйста как собирать без GoLink?!
     
    Последнее редактирование: 9 янв 2021
  20. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.707
    Hacker,
    я давно не писал на NASM но 000h'\ (кавычки и слэши) здесь лишние, для повторяющихся символов есть директива times
    хорошо бы книжку по NASM найти, чтобы не тыкаться, как слепой котенок :)