[ Assembler ] — начинающим: задаем вопросы

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by !_filin_!, 25 May 2007.

  1. 2serg2

    2serg2 New Member

    Joined:
    21 Aug 2007
    Messages:
    24
    Likes Received:
    1
    Reputations:
    0
    Спасибо за подсказку. Написал скрипт, при помощи программы Neo Sign 0f Misery, скрывающий окно. Затем при помощи отладчика посмотрел, как заполнено STARTUPINFO.
     
  2. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Народ,начал изучать WinSock.Вот наткнулся на исходники sams`a.Вот серверная часть:
    Code:
    .386
    .model Flat, StdCall
    option casemap:none
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\wsock32.lib
    include \masm32\include\kernel32.inc
    include \masm32\include\user32.inc
    include \masm32\include\wsock32.inc
    include \masm32\include\windows.inc
    .data
    wsadata WSADATA <>
    mCaption db "Error! Suxx!", 0
    mText1 db "Error WSAStartUp", 0
    mText2 db "Error2", 0
    hSock DWORD ?
    hSock2 dd ?
    sin sockaddr_in <>
    sPort DWORD 6001
    sIP db "127.0.0.1", 0
    buffer db 1024 dup (0)
    mCaption2 db "Woohoo", 0
    mText3 db "Connected!", 0
    
    .code
    Main:
    
    invoke WSAStartup, 101h, ADDR wsadata
    .if eax!=NULL
    invoke MessageBoxA, 0, ADDR mText1, ADDR mCaption, 0
    .endif
    
    invoke socket, AF_INET, SOCK_STREAM, 0
    .if eax==INVALID_SOCKET
    invoke WSAGetLastError
    .endif
    mov hSock, eax
    
    invoke htons, sPort
    mov sin.sin_port, ax
    invoke inet_addr, ADDR sIP
    mov sin.sin_addr, eax
    mov sin.sin_family, AF_INET
    
    invoke bind, hSock, ADDR sin, sizeof sin
    invoke listen, hSock, SOMAXCONN
    invoke accept, hSock, NULL, NULL
    mov hSock2, eax
    
    datarecv:
    invoke recv, hSock2, ADDR buffer, 1024, 0
    .if byte ptr buffer=="Q"
    invoke MessageBoxA, 0, ADDR mText3, ADDR mCaption2, 0
    jmp Quit
    .endif
    
    jmp datarecv
    
    Quit:
    invoke WSACleanup
    invoke ExitProcess, 0
    end Main
    Клиент:
    Code:
    .386
    .model flat, stdcall
    option casemap:none
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\wsock32.lib
    include \masm32\include\kernel32.inc
    include \masm32\include\user32.inc
    include \masm32\include\wsock32.inc
    include \masm32\include\windows.inc
    .data
    wsadata WSADATA <>
    mCaption db "Error! Suxx!", 0
    mText1 db "Error WSAStartUp", 0
    mText2 db "Error Connect", 0
    mText3 db "Error Send", 0
    hSock DWORD ?
    hSock2 dd ?
    sin sockaddr_in <>
    sPort DWORD 6001
    sIP db "127.0.0.1", 0
    buffer db "Q", 0
    
    .code
    Main:
    
    invoke WSAStartup, 101h, ADDR wsadata
    .if eax!=NULL
    invoke MessageBoxA, 0, ADDR mText1, ADDR mCaption, 0
    jmp Quit
    .endif
    
    invoke socket, AF_INET, SOCK_STREAM, 0
    .if eax==INVALID_SOCKET
    invoke WSAGetLastError
    jmp Quit
    .endif
    mov hSock, eax
    
    invoke htons, sPort
    mov sin.sin_port, ax
    invoke inet_addr, ADDR sIP
    mov sin.sin_addr, eax
    mov sin.sin_family, AF_INET
    
    invoke connect, hSock, ADDR sin, sizeof sin
    .if eax==SOCKET_ERROR
    invoke MessageBoxA, 0, ADDR mText2, ADDR mCaption, 0
    jmp Quit
    .endif
    mov hSock2, eax
    
    invoke send, hSock, ADDR buffer, sizeof buffer, 0
    .if eax==SOCKET_ERROR
    invoke MessageBoxA, 0, ADDR mText3, ADDR mCaption, 0
    jmp Quit
    .endif
    
    Quit:
    invoke closesocket, hSock
    invoke WSACleanup
    invoke ExitProcess, 0
    end Main
    А можно ли сделать,что-бы клиент коннектился с сервером с любого айпи?То есть сервер открыл порт,и обрабатывает запроосы с разных айпи.Или я что-то не допонимаю?
     
  3. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    если в виду имеется, что у сервера есть несколько IP и все их нужно связать с сокетом, то при связывании(bind) следует передать в функцие константу INADDR_ANY(раная нулю) вместо IP адреса.
     
  4. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Кто подскажет?Почему не коннектится сокет?Вот исходники:
    Сервер:
    Code:
    .386
    .model Flat, StdCall
    option casemap:none
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\wsock32.lib
    include \masm32\include\kernel32.inc
    include \masm32\include\user32.inc
    include \masm32\include\wsock32.inc
    include \masm32\include\windows.inc
    .data
    wsadata WSADATA <>
    mCaption db "Error! Suxx!", 0
    mText1 db "Error WSAStartUp", 0
    mText2 db "Error2", 0
    hSock DWORD ?
    hSock2 dd ?
    sin sockaddr_in <>
    sPort DWORD 5555
    buffer db 1024 dup (0)
    mCaption2 db "Woohoo", 0
    mText3 db "Connected!", 0
    
    .code
    Main:
    
    invoke WSAStartup, 101h, ADDR wsadata
    .if eax!=NULL
    invoke MessageBoxA, 0, ADDR mText1, ADDR mCaption, 0
    .endif
    
    invoke socket, AF_INET, SOCK_STREAM, 0
    .if eax==INVALID_SOCKET
    invoke WSAGetLastError
    .endif
    mov hSock, eax
    
    invoke htons, sPort
    mov sin.sin_port, ax
    mov sin.sin_addr,0
    mov sin.sin_family, AF_INET
    
    invoke bind, hSock, ADDR sin, sizeof sin
    invoke listen, hSock, SOMAXCONN
    invoke accept, hSock, NULL, NULL
    mov hSock2, eax
    
    datarecv:
    invoke recv, hSock2, ADDR buffer, 1024, 0
    .if byte ptr buffer=="Q"
    invoke MessageBoxA, 0, ADDR mText3, ADDR mCaption2, 0
    jmp Quit
    .endif
    
    jmp datarecv
    
    Quit:
    invoke WSACleanup
    invoke ExitProcess, 0
    end Main
    Клиент:
    Code:
    .386
    .model flat, stdcall
    option casemap:none
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\wsock32.lib
    include \masm32\include\kernel32.inc
    include \masm32\include\user32.inc
    include \masm32\include\wsock32.inc
    include \masm32\include\windows.inc
    .data
    wsadata WSADATA <>
    mCaption db "Error! Suxx!", 0
    mText1 db "Error WSAStartUp", 0
    mText2 db "Error Connect", 0
    mText3 db "Error Send", 0
    hSock DWORD ?
    hSock2 dd ?
    sin sockaddr_in <>
    sPort DWORD 5555
    sIP db "ТУТ ВНЕШНИЙ АЙПИ СЕРВЕРА", 0
    buffer db "Q", 0
    
    .code
    Main:
    
    invoke WSAStartup, 101h, ADDR wsadata
    .if eax!=NULL
    invoke MessageBoxA, 0, ADDR mText1, ADDR mCaption, 0
    jmp Quit
    .endif
    
    invoke socket, AF_INET, SOCK_STREAM, 0
    .if eax==INVALID_SOCKET
    invoke WSAGetLastError
    jmp Quit
    .endif
    mov hSock, eax
    
    invoke htons, sPort
    mov sin.sin_port, ax
    invoke inet_addr, ADDR sIP
    mov sin.sin_addr, eax
    mov sin.sin_family, AF_INET
    
    invoke connect, hSock, ADDR sin, sizeof sin
    .if eax==SOCKET_ERROR
    invoke MessageBoxA, 0, ADDR mText2, ADDR mCaption, 0
    jmp Quit
    .endif
    mov hSock2, eax
    
    invoke send, hSock, ADDR buffer, sizeof buffer,0
    .if eax==SOCKET_ERROR
    invoke MessageBoxA, 0, ADDR mText3, ADDR mCaption, 0
    jmp Quit
    .endif
    
    Quit:
    invoke closesocket, hSock
    invoke WSACleanup
    invoke ExitProcess, 0
    end Main
    Пишет error connect,хотя при айпшнике 127.0.0.1 все работает нормально.В чем проблема?
    Может это из за того,что у меня стоит роутер?Даже при запуске у меня на компе,открывается порт 5555 если я сканирую мои внутренний айпи(192.168.1.102).А если внешний,то сканер показывается порт закрыт!
     
    #1044 MTV, 9 Jul 2011
    Last edited: 9 Jul 2011
  5. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    ты используешь sockaddr_in, на сколько я помню - это более новая версия структуры sockaddr. структура эволюционировала, но прототипы ф-й остались старыми. короче говоря - ф-я connect принимает указатель на структуру sockaddr, а ты ей передаешь указатель на sockaddr_in.

    может еще что то есть, но дальше не смотрел.
     
  6. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,284
    Reputations:
    327
    да мсдн читайте то хоть. код таки под винду, поэтому и кроссрефы все к мсдн должны вести
     
  7. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    К стати вот еще:
    Code:
    struct sockaddr_in{
       short sin_family;
       unsigned short sin_port;
       struct in_addr sin_addr;
       char sin_zero[8];
    };
    мы видим, что sin_addr - это обьект структуры in_addr.

    Смотрим:
    Code:
    typedef struct in_addr {
      union {
        struct {
          u_char s_b1,s_b2,s_b3,s_b4;
        } S_un_b;
        struct {
          u_short s_w1,s_w2;
        } S_un_w;
        u_long S_addr;
      } S_un;
    } IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;
    
     
  8. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Нет,ребят,мне кажется дело не в этом.У меня стоит роутер. У меня просто не открывается порт.Точнее если я у себя на компе запущу сервер,то при скане внутреннего айпи(192.168.1.102)-порт открыт.А при скане внешнего моего айпи- закрыт.Через хамачи все нормально работает .
     
  9. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    Эм, а при чем тут вообще ассемблер и программирование? Настройки роутера -> Виртуальная машина. Перенаправленные с внешнего айпи на внутренний. Читай документацию.
     
  10. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    А кто подскажет как программно открыть bat файл?Делал так:
    Code:
    invoke WinExec,addr file1,ShowWindow
    Вообще не чего не просиходит((
    Пробовал еще вот так:
    Code:
    invoke CreateFile,addr file2,GENERIC_WRITE,FILE_SHARE_WRITE,0,0,FILE_ATTRIBUTE_NORMAL,0
    mov [handle],eax
    invoke ShellExecute,handle,addr open1,addr file2,0,0,addr tmp1
    Тоже самое(Нечего не происходит((
     
  11. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Code:
    invoke ShellExecute, 0, chr$("open"), chr$("file.bat"), 0, 0, SW_SHOW
    
    Макрос chr$ можно при необходимости заменить на адрес строки.
    Вообще, все же написано предельно ясно: http://msdn.microsoft.com/en-us/library/bb762153%28v=vs.85%29.aspx
     
  12. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    open BYTE "open",0
    fn db 'bat.bat',0
    invoke ShellExecute,0,addr open,addr fn,0,0,SW_SHOW
     
  13. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Я же говорю так не работает(
     
  14. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Нет,батник там работает,но не запускается програмнно!
     
  15. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Вот код:
    Code:
    .386
    .model Flat, StdCall
    option casemap:none
    ;#########################################################
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\user32.lib
    includelib C:\masm32\lib\shell32.lib
    
    include \masm32\include\shell32.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\user32.inc
    include \masm32\include\windows.inc
    ;##########################################################
    .data?
    handle dd ?
    tmp dd ?
    .data
    file1 db 'D:\boot.bat',0
    open1 byte 'open',0
    buffer db 'dir D:\>>1.txt',0
    cr db 0dh,0ah
    chcp db 'chcp 1251',0
    .code
    start:
    invoke CreateFile,addr file1,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
    mov [handle],eax
    invoke WriteFile,handle,addr chcp,9,addr tmp,0
    invoke WriteFile,handle,addr cr,2,addr tmp,0
    invoke WriteFile,handle,addr buffer,150,addr tmp,0
    invoke Sleep,10000
    invoke ShellExecute, handle,addr open1,addr file1,0,0,SW_SHOW
    invoke CloseHandle,handle
    invoke ExitProcess,0
    end start
     
  16. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    посмотри как ты пишешь в файл,естесно он не запустится.
     
  17. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Я видел как я пишу.Почему тогда у меня все запускается?Если даже сделать не 150 а 14 байт прописывалось,все равно не запускается!
     
  18. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    MTV, неужели не дано прочитать док по функции ShellExecute? Первый параметр - это не хендл файла, а хендл окна, а так как у тебя нет окон в приложении, то просто 0. Смотри мой предыдущий пост. Файл надо открыть, записать туда данные, потом закрыть, а потом запустить, как я показал выше. Кроме того, параметр FILE_SHARE_WRITE говорит о том, что пока ты держишь файл открытым, другая программа сможет открыть его только для записи, но никак не для чтения.
     
  19. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    вот короче рабочий код.
    Code:
     
    ;This program was created in assembler editor
    .386
    .model Flat, StdCall
    option casemap:none
    includelib lib\kernel32.lib
    includelib lib\user32.lib
    includelib lib\shell32.lib
    
    include include\shell32.inc
    include include\kernel32.inc
    include include\user32.inc
    include include\windows.inc
    
    .data?
    handle dd ?
    tmp dd ?
    .data
    file1 db 'D:\boot.bat',0
    open1 BYTE "open",0
    bufer db 'dir D:\ >>1.txt',0
    cr db 0dh,0ah
    chcp db 'chcp 1251',0
    .code
    start:
    invoke CreateFile,addr file1,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
    mov handle,eax
    invoke WriteFile,handle,addr chcp,9,addr tmp,0
    invoke WriteFile,handle,addr cr,2,addr tmp,0
    invoke WriteFile,handle,addr bufer,15,addr tmp,0
    invoke CloseHandle,handle
    
    invoke ShellExecute,0,addr open1,addr file1,0,0,SW_SHOW
    invoke ExitProcess,0
    end start
    
     
  20. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Все работает))Большое спасибо,ребят.