1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

bind cmd

Тема в разделе "NASM", создана пользователем Orbit, 14 дек 2016.

Метки:
  1. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.179
    Orbit,
    можно и через смещение, например вот так
    Код (ASM):
    1. xor eax,eax
    2. mov [rax+смещение],значение
     
  2. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    669
    Я разве так написал?
    Код (Text):
    1. -LARGEADDRESSAWARE:NO
    Я вообще так делаю:
    Код (Text):
    1. nasm code.asm -f win64 -o code.obj
    2. ink code.obj Ws2_32.lib Kernel32.lib -OUT:code.exe -MACHINE:X64 -ENTRY:main
    Во-вторых, зачем тебе хранить в секции данных локальные переменные?
     
  3. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    109
    Адрес:
    г. Москва
    а как хранятся локальные переменные в nasm ?
    Может попробывать взять другой линкер? но gcc мне нравится : (
     
    Последнее редактирование: 15 дек 2016
  4. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.179
    там справка должна быть, поищи в примерах использование local, должно быть что-то типа
    Код (ASM):
    1. DlgFunc proc hDlg:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
    2. LOCAL hLib:DWORD
    3. LOCAL buffer[128]:byte
    4. LOCAL buffer1[128]:byte
    5. LOCAL rect:RECT
    6. . . .
     
  5. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    669
    Попробуй GoLink
    Код (Text):
    1. nasm code.asm -f win64 -o code.obj
    2. GoLink code.obj Ws2_32.dll Kernel32.dll /ENTRY:main
    Вот с таким кодом:
    Код (ASM):
    1. extern WSAStartup
    2. extern WSACleanup
    3. extern WSAGetLastError
    4. extern socket
    5. extern Sleep
    6. extern ExitProcess
    7. extern accept
    8. extern listen
    9. extern bind
    10.  
    11. struc in_addr
    12.     .s_addr: resd 1
    13.     .size:
    14. endstruc
    15.  
    16. struc sockaddr
    17.     .sin_family: resw 1
    18.     .sin_port: resw 1
    19.     .sin_addr: resb in_addr.size
    20.     .sin_zero: resb 8
    21.     .size:
    22. endstruc
    23.  
    24. struc WSADATA
    25.     .wVersion: resw 1
    26.     .wHighVersion: resw 1
    27.     .szDescription: resb 256
    28.     .szSystemStatus: resb 256
    29.     .iMaxSockets: resw 1
    30.     .iMaxUdpDg: resw 1
    31.     .lpVendorInfo: resq 1
    32.     .size:
    33. endstruc
    34.  
    35. SECTION .bss
    36. ws_addr: resb sockaddr.size
    37. ws_wsa: resb WSADATA.size
    38.  
    39. SECTION .code
    40. port: equ 777
    41.  
    42. global main
    43. main:
    44.  
    45. sub rsp , 0x28
    46. lea rdx , [ws_wsa]
    47. mov rcx , 0x202
    48. call WSAStartup
    49. mov r8 , 0
    50. mov rdx , 1
    51. mov rcx , 2
    52. call socket
    53. mov r13 , rax
    54.  
    55. mov dword [ws_addr + sockaddr.sin_family] , 1
    56. mov qword [ws_addr + sockaddr.sin_addr] , 0
    57. mov ax , port
    58. xchg ah , al
    59. mov [ws_addr + sockaddr.sin_port] , ax
    60. mov r8 , sockaddr.size
    61. lea rdx , [ws_addr]
    62. mov rcx , r13
    63. call bind
    64.  
    65. call WSAGetLastError
    66.  
    67. mov rdx , 13
    68. mov rcx , r13
    69. call listen
    70. mov r8 , 0
    71. lea rdx , [ws_addr]
    72. mov rcx , r13
    73. call accept
    74. mov rcx , 60000
    75. call Sleep
    76. call WSACleanup
    77. mov rcx,rax
    78.  
    79. call ExitProcess
     
    Mikl___ и _edge нравится это.
  6. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    632
    Адрес:
    Russia
    Теперь шаг 2 - отладка, или "почему никто не отвечает в телнет" :) До шага 3 - прячем от АВ, далеко. Дойдем ли до пряток импорта? :)
     
    Orbit нравится это.
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.474
    Адрес:
    Russia
    по поводу GCC
    а пробовали передать правильный параметр:
     
  8. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    109
    Адрес:
    г. Москва
    Попробовал, всеравно та же ошибка:
    cmd.obj:cmd.asm:dntknw:.code+0x2a): relocation truncated to fit: R_X86_64_32 against `.bss'
     
  9. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.474
    Адрес:
    Russia
    Ну короче, эта ошибка связана с тем, что вы используете адресацию , где адрес 1 операнда 64 а адрес второго 32.
    Найдите эти инструкции и измените их. В общем как запостите эти строки сюда, мы вам покажем как их поменять.
     
  10. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    109
    Адрес:
    г. Москва
    Это строки
    Код (ASM):
    1.  
    2. SECTION .bss
    3. sockethandle: resd 1
    4. ...
    5. mov dword [sockethandle] , eax
    6. и
    7. mov ecx , sockethandle
    8.  
    9.  
     
    Последнее редактирование: 15 дек 2016
  11. shufps

    shufps New Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    10
    Вообщем с кодом Thetrik, если через gcc, то так сработает, удобно через bat файл, пропиши переменные окружения до nasm в PATH и до папки с ld (это стандартный линковщик gcc, в nasm-e он вроде тоже присутствует), пути до библиотек поправь... Собственно объектный файл нужен в формате coff поскольку ld работает с ними...
    Код (Text):
    1. nasm test.asm -f win64 -o test.o
    2. ld -emain -o test.exe test.o -s -lws2_32 -lkernel32 -LC:\MinGW\x86_64-w64-mingw32\lib
    3. PAUSE
     
  12. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.474
    Адрес:
    Russia
    Ну все понятно.
    У вас три варианта.
    1) Перенести переменную в .data
    2) Перенести переменную в стек
    3) заменить код на следующий

    Код (ASM):
    1.  
    2. SECTION .bss
    3. sockethandle: resq 1
    4. ...
    5. mov [sockethandle] , rax
    6. и
    7. mov rcx , sockethandle  ;только тут наверно всеже логчнее [sockethandle]. Но я логику кода не читал, смотрите сами.
    8.  
    Смысл в том, что в 64 битном режиме у вас хендлы тоже имеют размер 64 бита.
    А ошибка из за того, что bss требует выравнивания по размеру учетверенного слова.

    В общем попробуйте.
    Я не запускал, и вообще не смотрел особо ваш код, все советы даю только исходя из ошибок и моих предположений.
    Во первых - дать вам рабочую версию под gcc так как вы хотите - слишком просто для вас. Нет момента обучения.
    Так что - вы уж постарайтесь, подумать.

    Думать - это не простое занятие, видимо по этому этим занимаются столь мало людей.)
     
    _edge нравится это.
  13. Vityacv

    Vityacv New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2011
    Сообщения:
    6
    Есть еще ulink ftp://ftp.styx.cabel.net/pub/UniLink
    опции:
    ulink.exe -q -w- -Z- -ZX- -ap -Tpe+ -eMain "cmd.obj" kernel32.dll ws2_32.dll
     
  14. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    109
    Адрес:
    г. Москва
    В общем сделал пока без переменных :dntknw:

    Код (ASM):
    1.  
    2. extern WSAStartup
    3. extern WSACleanup
    4. extern socket
    5. extern Sleep
    6. extern ExitProcess
    7. extern accept
    8. extern listen
    9. extern bind
    10.  
    11. SECTION .data
    12.  
    13. port: equ 777
    14.  
    15. struc WSADATA
    16. .wVersion: resw 1
    17. .wHighVersion: resw 1
    18. .szDescription: resb 256
    19. .szSystemStatus: resb 256
    20. .iMaxSockets: resd 1
    21. .iMaxUdpDg: resd 1
    22. .lpVendorInfo: resq 1
    23. endstruc
    24.  
    25. stWSADATA:
    26. istruc WSADATA
    27. at WSADATA.wVersion, dw 0
    28. at WSADATA.wHighVersion, dw 0
    29. at WSADATA.szDescription, db 0
    30. at WSADATA.szSystemStatus, db 0
    31. at WSADATA.iMaxSockets, dd 0
    32. at WSADATA.iMaxUdpDg, dd 0
    33. at WSADATA.lpVendorInfo, dq 0
    34. iend
    35.  
    36. struc sockaddr_in
    37. .sin_family: resd 1
    38. .sin_port: resd 1
    39. .sin_addr: resq 1
    40. .sin_zero: resb 8
    41. .size:
    42. endstruc
    43.  
    44. stsockaddr_in:
    45. istruc sockaddr_in
    46. at sockaddr_in.sin_family, dd 0
    47. at sockaddr_in.sin_port, dd 0
    48. at sockaddr_in.sin_addr, dq 0
    49. at sockaddr_in.sin_zero, db 0
    50. iend
    51.  
    52. struc in_addr
    53. .s_addr: resq 1
    54. endstruc
    55.  
    56. stin_addr:
    57. istruc in_addr
    58. at in_addr.s_addr, dq 0
    59. iend
    60.  
    61. SECTION .code
    62.  
    63. global main
    64.  
    65. main:
    66.  
    67. lea rdx , [WSADATA]
    68. mov rcx , 0x202
    69. call WSAStartup
    70.  
    71. mov r8 , 0
    72. mov rdx , 1
    73. mov rcx , 2
    74. call socket
    75.  
    76. mov r15 , rax
    77.  
    78. mov dword [sockaddr_in.sin_family] , 1
    79. mov qword [sockaddr_in.sin_addr] , 0
    80.  
    81. mov ax , port
    82. xchg ah , al
    83. mov word [sockaddr_in.sin_port] , ax
    84. mov r8 , sockaddr_in.size
    85. lea rdx , [sockaddr_in]
    86. mov rcx , r15
    87. call bind
    88.  
    89. mov rdx , 13
    90. mov rcx , r15
    91. call listen
    92.  
    93. mov r8 , 0
    94. lea rdx , [sockaddr_in]
    95. mov rcx , r15
    96. call accept
    97.  
    98. mov rcx , 60000
    99. call Sleep
    100.  
    101. call WSACleanup
    102. mov rcx , rax
    103. call ExitProcess
    104.  
    Код (Text):
    1.  
    2. nasm cmd.asm -f win64 -o cmd.obj
    3. gcc cmd.obj -lws2_32 -m64 -o cmd.exe
    4. pause
    5.  
    Не понимаю как указать ссылку на структуру ?

    Вываливается вот на этом месте и таких ошибок в коде несколько:

    [​IMG]

    И socket handle в r15 FFFFFFFFFFFFFFFF
     
    Последнее редактирование: 16 дек 2016
  15. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    109
    Адрес:
    г. Москва
    Лучше конечно использовать r13 так как r15 занят, постоянно меняется
    Но всё жеж, почему call socket возвращает FFFF , вроде вызываю правильно
     
  16. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    109
    Адрес:
    г. Москва
    https://vk.com/msys2
     
  17. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.474
    Адрес:
    Russia
    Это вам винда сообщает ошибку INVALID_SOCKET. Юзайте функцию WSAGetLastError, чтоб понять какая ошибка произошла.
    Ну и что это у вас за тип протокола такой? (R8 параметр содержит 0).ек Докуметация конечно говорит, что можно оставить 0, на выбор ОС. Но это не тот случай, давайте просто делать указывая явно, все параметры. Там надо 6 поставить, если у вас TCP протокол.
    Изучайте: тут

    А чтоб не париться с регистрами - запихивайте данные в стек, что мешает?
     
  18. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    109
    Адрес:
    г. Москва
    push pop? но его придется класть туда несколько раз, мне кажется лучше через r13
    или положить один раз и высчитывать смещение? но это мутарно писать :dntknw:
     
  19. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.474
    Адрес:
    Russia
    Знаете, на асме все муторно писать.
    Скажу вам честно, как человек, который проходил и асм и сокеты, и че только не изучал я, ей богу, аж страшно. Сократ бы свернулся в трубочку от такого количества инфы...
    Так вот - асм и сокеты, это очень такая гремучая смесь. Любая ошибка там стоит огромного кол-ва времени и нервов. По этому мой вам совет. Напишите эту программу на Си. Поймите для начала как работают сокеты. А потом уже переведите на асм (при этом изучив ассемблер в том числе 64 битный, а так же архитектуру компа, как работать со стеком.

    Просто те, кто уже знают сокеты, не задают вопрос - а почему возвращается -1... Это уже в коре головного мозга прошито как отче наш.
     
    _edge нравится это.
  20. Vityacv

    Vityacv New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2011
    Сообщения:
    6
    Такой вариант работает
    Код (ASM):
    1. global Main
    2.  
    3. default rel
    4.  
    5. ;kernel32.dll
    6. extern \
    7. RtlZeroMemory,\
    8. Sleep,\
    9. ExitProcess
    10. ;ws2_32.dll
    11. extern \
    12. WSAStartup,\
    13. WSACleanup,\
    14. socket,\
    15. accept,\
    16. listen,\
    17. bind
    18.  
    19. struc WSADATA
    20. .wVersion resw 1
    21. .wHighVersion resw 1
    22. .szDescription resb 256+1
    23. .szSystemStatus resb 128+1
    24. .iMaxSockets resw 1
    25. .iMaxUdpDg resw 1
    26. alignb 8
    27. .lpVendorInfo resq 1
    28. endstruc
    29.  
    30. struc SOCKADDR_IN
    31. .sin_family resw 1
    32. .sin_port resw 1
    33. .sin_addr resq 1
    34. .sin_zero resb 8
    35. endstruc
    36.  
    37. struc S_un_b
    38. .s_b1 resb 1
    39. .s_b2 resb 1
    40. .s_b3 resb 1
    41. .s_b4 resb 1
    42. endstruc
    43.  
    44. struc S_un_w
    45. .s_w1 resw 1
    46. .s_w2 resw 1
    47. endstruc
    48.  
    49. struc IN_ADDR
    50. .S_un resb S_un_b_size
    51. .s_addr resq 1
    52. endstruc
    53.  
    54.  
    55. SECTION .code
    56. Main:
    57. struc .locals
    58. resq 4
    59. ;.5 resq 1
    60. ;.6 resq 1
    61. ;.7 resq 1
    62. ;.8 resq 1
    63. .wsadata resb WSADATA_size
    64. .sockaddr_in resb SOCKADDR_IN_size
    65. .in_addr resb IN_ADDR_size
    66. alignb 16
    67. resq 1
    68. endstruc
    69. sub rsp,.locals_size
    70.  
    71. lea rcx,[rsp+.wsadata]
    72. mov edx,WSADATA_size+SOCKADDR_IN_size+IN_ADDR_size
    73. call RtlZeroMemory
    74.  
    75. mov ecx,0x2020 ;2.2
    76. lea rdx,[rsp+.wsadata]
    77. call WSAStartup
    78.  
    79. mov ecx,2 ;FWP_IP_VERSION_NONE
    80. mov edx,1 ;SOCK_STREAM
    81. xor r8,r8 ;IPPROTO_IP
    82. call socket
    83. mov rbp,rax
    84.  
    85. mov word[rsp+.sockaddr_in+SOCKADDR_IN.sin_family],2 ;AF_INET
    86. mov word[rsp+.sockaddr_in+SOCKADDR_IN.sin_port],777
    87.  
    88. mov rcx,rbp
    89. lea rdx,[rsp+.sockaddr_in]
    90. mov r8d,SOCKADDR_IN_size
    91. call bind
    92.  
    93. mov rcx,rbp
    94. mov edx,13
    95. call listen
    96.  
    97. mov rcx,rbp
    98. lea rdx,[rsp+.sockaddr_in]
    99. xor r8,r8
    100. call accept
    101.  
    102. call WSACleanup
    103. mov ecx,60000
    104. call Sleep
    105. mov rcx,rax
    106. call ExitProcess
    107. add rsp,.locals_size
    108. ret
     
    Последнее редактирование модератором: 16 дек 2016