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

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

  1. e4key

    e4key New Member

    Joined:
    24 Jul 2009
    Messages:
    24
    Likes Received:
    1
    Reputations:
    0
    Вопрос 2:

    Спустя некоторое время программа вываливается с ошибкой 11010 (нехватка ресурсов). Собственно программа в бесконечном цикле посылает icmp-пакеты :)))

    Code:
    .sendicmp:
            invoke  IcmpSendEcho, [handle], [addr], 0, 0, 0, reply, 100, timeout
            cmp     eax, 0
            je      .error
            invoke  Sleep, sleep
            jmp     .sendicmp  
    
    константа sleep = 3000 (мс). может следует увеличить слип? до 10к? 15к? больше?

    естественно в реальном проекте ошибка вываливаться не будет.

    Еще кто работал с icmpsendecho: что не так? :) значение ReplySize я взял от "балды" :)

    в msdn написано, что это должна быть сумма размеров структуры ICMP_ECHO_REPLY и поля RequestSize. Последний у меня равен нулю, а размер структуры - sizeof.ICMP_ECHO_REPLY. Или я не прав?

    теперь еще 1 вопрос - как можно сделать авторестарт после завершения программы с ошибкой?

    спасибо.
     
    #561 e4key, 22 Aug 2009
    Last edited: 22 Aug 2009
  2. e4key

    e4key New Member

    Joined:
    24 Jul 2009
    Messages:
    24
    Likes Received:
    1
    Reputations:
    0
    Еще раз привет всем:

    Code:
    format PE GUI 4.0
    entry main
    
    include 'win32a.inc'
    
    section '.data' data readable writeable
            ip      db '127.0.0.1', 0
            wdata   WSADATA
            saddr   sockaddr_in AF_INET, 80, ip
            sock    dd ?
            hello   db 'GET http://localhost/hello.php HTTP/1.0', 10, 13
                    db 'Host: localhost', 0
    
    section '.code' code readable executable
      main:
            invoke  WSAStartup, 0101h, wdata
            invoke  socket, AF_INET, SOCK_STREAM, 6
            mov     [sock], eax
            invoke  connect, [sock], saddr, sizeof.sockaddr_in
            invoke  send, [sock], hello, 57, 0
            invoke  closesocket, [sock]
            invoke  ExitProcess, 0
    
    section '.idata' import data readable
            library kernel32, 'kernel32.dll',\
                    user32, 'user32.dll',\
                    wsock32, 'wsock32.dll'
    
            include 'api\kernel32.inc'
            include 'api\user32.inc'
            include 'api\wsock32.inc'
    
    В hello.php находится код чего-то, что напоминает счетчик посещений (при каждом обращении к странице прибавляет к значению счетчика еденицу).

    Но почему то указанный код не работает :(

    Еще раз заранее спасибо всем тем, кто ответит.
     
  3. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    HTTP запросы должна заканчиваться 2-мя crlf
    так что типа

    hello db 'GET http://localhost/hello.php HTTP/1.0', 10, 13
    db 'Host: localhost', 13,10,13,10,0
    ну и соответственно перерасчитай длинну посылаемых данных в
    invoke send, [sock], hello, 57, 0

    лучше заюзай типа
    invoke lstrlenA, hello
    invoke send, [sock], hello, eax, 0
     
  4. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    может чтото ты чтото напутал? Но код
    mov [ip], eax
    ip dd ?
    спокойно компилится в FASM
     
  5. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    насчет пинга вот код который я юзал -
    Code:
     ; необходимые структуры
    struct IP_OPTION_INFORMATION
      Ttl db 0
      Tos db 0
      Flags db 0
      OptionsSize db 0
      OptionsData dd 0
    ends
    
    struct ICMP_ECHO_REPLY
     Address dd 0
     Status dd 0
     RoundTripTime dd 0
     DataSize  dw 0
     Reserved  dw 0
     Data dd 0
     Options IP_OPTION_INFORMATION
     PingBuf db 32 dup (0)
    ends
    
    struct TInAddr
     b1 db 0
     b2 db 0
     b3 db 0
     b4 db 0
    ends
    
    Optionss IP_OPTION_INFORMATION
    InAddr TInAddr
    Reply ICMP_ECHO_REPLY
    PingBuf db 32 dup (0)
    
    proc Ping InetAddress,ttl  ; пингование передается адрес сервера и ТТЛ
     invoke IcmpCreateFile	;
     cmp eax,INVALID_HANDLE_VALUE  ; если не удалось создать "ICMP файл"
     je exitp
     mov [handle],eax  ;сохраним дискриптор
     invoke gethostbyname,[InetAddress]  ; попытка отпределяни IP адреса
     cmp eax,0  ; если не удалось
     je exitp  ; то
     mov eax,[eax+0ch]  ; заполение необходимой струкуры
     mov eax,[eax]
     mov cl,[eax]
     mov [InAddr.b1],cl
     mov cl,[eax+1]
     mov [InAddr.b2],cl
     mov cl,[eax+2]
     mov [InAddr.b3],cl
     mov cl,[eax+3]
     mov [InAddr.b4],cl
    
     mov eax,PingBuf
     mov [Reply.Data],eax
     mov [Reply.DataSize],32
     mov al,byte [ttl]
     mov [Optionss.Ttl],al
     mov eax,[InAddr]
     invoke IcmpSendEcho,[handle],eax,PingBuf,32,Optionss,Reply,92,3000  ; пинг
     cmp eax,0
     je exitp
     mov eax,1
     ret
    exitp:
     xor eax,eax
     ret
    endp
    
    
     
  6. e4key

    e4key New Member

    Joined:
    24 Jul 2009
    Messages:
    24
    Likes Received:
    1
    Reputations:
    0
    slesh, спасибо огромное за ответы :)

    Так всеравно не вышло :( Кстати собственно через lstrlen и было, только не отсылал и посчитал и поставил конкретное значение :)

    при запуске данная программа просто висит в процессах, никаких пакетов, ничего не отсылвается. может лучше сделать через wininet?

    действительно :)

    насчет icmp - он и этот код отлично пингует, но вываливается через некоторое время с ошибкой.
     
  7. e4key

    e4key New Member

    Joined:
    24 Jul 2009
    Messages:
    24
    Likes Received:
    1
    Reputations:
    0
    а что в твоем коде должно содержаться в PingBuf? или это просто пустой буфер в 32 байта?
     
  8. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    PingBuf - это просто буфер для данных которые идут в нагрузку с пингом. В ответ должны приходить этиже данные для того чтобы проверить корректность работы.

    насчет того что прога висит в процессах итд итп. то советую тебе поглядеть как ты реализовал заполнение addr для connect
    погляди исходники моего спам бота - он в разделе избранное валяется вроде. написан полностью на FASM и там была функция для посылки HTTP запроса на сервак и корректное получение ответа.
     
  9. e4key

    e4key New Member

    Joined:
    24 Jul 2009
    Messages:
    24
    Likes Received:
    1
    Reputations:
    0
    спасибо :) сейчас получилось - изменил элементы sockaddr_in:

    1. перед загрузкой элемента sin_port обработал его функцией htons
    2. перед загрузкой элемента sin_addr обработал его функцией inet_addr

    снифер пакеты отслеживает, но эффекта 0 :(

    вот код на асме:

    Code:
    format PE GUI 4.0
    entry main
    
    include 'win32a.inc'
    
    section '.data' data readable writeable
            ip      db '127.0.0.1', 0
            wdata   WSADATA
            saddr   sockaddr_in
            sock    dd ?
            hello   db 'GET http://localhost/hello.php HTTP/1.0', 13, 10
                    db 'Host: localhost', 13, 10, 13, 10, 0
    
    section '.code' code readable executable
      main:
            invoke  WSAStartup, 0101h, wdata
            invoke  socket, AF_INET, SOCK_STREAM, 6
            mov     [sock], eax
            mov     [saddr.sin_family], AF_INET
            invoke  htons, 80
            mov     [saddr.sin_port], ax
            invoke  inet_addr, ip
            mov     [saddr.sin_addr], eax
            invoke  connect, [sock], saddr, sizeof.sockaddr_in
            invoke  lstrlen
            invoke  send, [sock], hello, eax, 0
            invoke  closesocket, [sock]
            invoke  ExitProcess, 0
    
    section '.idata' import data readable
            library kernel32, 'kernel32.dll',\
                    user32, 'user32.dll',\
                    wsock32, 'wsock32.dll'
    
            include 'api\kernel32.inc'
            include 'api\user32.inc'
            include 'api\wsock32.inc'
    
    вот скрипт hello.php (в php не шарю :))
    Code:
    <?php
        $handle = fopen("hello.txt", "a+");
        $count = fread($handle, filesize("hello.txt"));
        fclose($handle);
        $count++;
        $handle = fopen("hello.txt", "w");
        fwrite($handle, $count);
        fclose($handle);
        echo $count;
    ?>
    
    в итоге в файле hello.txt цифра должна при каждом обращении увеличиваться.
     
  10. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    советую заюзать вот такой вот скрипт
    PHP:
    <?
        
    $handle fopen('hello.txt''a+');
        
    $count intval(fgets($handle));
        
    fclose($handle);
        
    $count++;
        
    $handle fopen('hello.txt''w');
        
    fputs($handle$count);
        
    fclose($handle);
        echo 
    $count;
    ?>
     
  11. e4key

    e4key New Member

    Joined:
    24 Jul 2009
    Messages:
    24
    Likes Received:
    1
    Reputations:
    0
    thx, но тут вроде не совсем от скрипта зависит :( это что-то с самой программой.

    можно легко сделать на wininet, но хотелось попрактиковаться в winsock.
     
  12. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    1) у тебя скрипт почемуто выдавал ошибку.
    2) invoke lstrlen
    А где параметры? забыл указать строку длинну которой считать
     
  13. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    вот рабочий код.
    Я тут внес некоторую оптимизацию )
    Теперь размер 1024 байта после компила )

    Code:
    format PE GUI 4.0
    entry main
    
    include 'win32a.inc'
    
    section '.text' data readable writeable executable import
    ;--------------- IMPORT -------------------
            library kernel32, 'kernel32.dll',\
                    wsock32, 'wsock32.dll'
            include 'api\kernel32.inc'
            include 'api\wsock32.inc'
    ;--------------- CODE -------------------
      main:
            invoke  WSAStartup, 0101h, wdata
            invoke  socket, AF_INET, SOCK_STREAM, 6
            mov     [sock], eax
            mov     [saddr.sin_family], AF_INET
            invoke  htons, 80
            mov     [saddr.sin_port], ax
            invoke  inet_addr, ip
            mov     [saddr.sin_addr], eax
            invoke  connect, [sock], saddr, sizeof.sockaddr_in
            invoke  lstrlen, hello
            invoke  send, [sock], hello, eax, 0
            invoke  closesocket, [sock]
            invoke  ExitProcess, 0
    ;--------------- DATA -------------------
            ip      db '127.0.0.1', 0
            hello   db 'GET http://localhost/hello.php HTTP/1.0', 13, 10
                    db 'Host: localhost', 13, 10, 13, 10, 0
            wdata   WSADATA
            saddr   sockaddr_in
            sock    dd ?
    
     
    #573 slesh, 23 Aug 2009
    Last edited: 23 Aug 2009
    1 person likes this.
  14. e4key

    e4key New Member

    Joined:
    24 Jul 2009
    Messages:
    24
    Likes Received:
    1
    Reputations:
    0
    1) хм у меня вроде норм все было.
    2) действительно))

    собственно туплю :) поставил обработку ошибок и нашел ошибку 10061 после вызова функции connect. посмотерл - на локалхост не заходит хотя сервер запущен. кароче сменил сервер на vertrigo (был easyphp). все норм работает.

    а почему у тебя в пинге ReplySize = 92? ведь размер структуры = 24 а буфера 32,
     
    #574 e4key, 23 Aug 2009
    Last edited: 23 Aug 2009
  15. e4key

    e4key New Member

    Joined:
    24 Jul 2009
    Messages:
    24
    Likes Received:
    1
    Reputations:
    0
    ого 1 кб! :) -2 секции - 1 кб :) ушел читать твою статью про оптимизацию прог. на fasm :) спасибо!
     
  16. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    насчет 92 - это просто ошибка. когда переписывал.
    потому как включил буфер ответа в саму структуру, но забыл вычесть размер.
    ICMP_ECHO_REPLY - 28 байт + 32 буфер = 60 байт
    60 + точно я забыл удрать +32 какраз и вышло 92 )
    Да и код писал очень давно и криво, так что могут быть косяки всякие )
     
  17. e4key

    e4key New Member

    Joined:
    24 Jul 2009
    Messages:
    24
    Likes Received:
    1
    Reputations:
    0
    ну а в моем случае это будет размер ICMP_ECHO_REPLY + PingBuf = 24 + 32 = 56?
    структуру IP_OPTION_INFORMATION я не использую.

    но тогда после выполнения функции возвращается ошибка 11001.

    может следует взять с запасом или я ошибся в расчетах?
     
    #577 e4key, 23 Aug 2009
    Last edited: 23 Aug 2009
  18. e4key

    e4key New Member

    Joined:
    24 Jul 2009
    Messages:
    24
    Likes Received:
    1
    Reputations:
    0
    ни у кого нет примера серверной программы с использованием winapi? хотелось бы простой примерчик, например, выводящий полученную от клиента команду в messagebox'e.

    нашел немало такого, но не выходит перевести на асм :(

    спасибо :)
     
  19. e4key

    e4key New Member

    Joined:
    24 Jul 2009
    Messages:
    24
    Likes Received:
    1
    Reputations:
    0
    Вот что-то написал, но увы не работает:

    Code:
    format PE GUI 4.0
    entry main
    
    include 'win32a.inc'
    
    section '.data' data readable writeable
            hello   db 'hello', 0
            error   db 'Error: %d', 0
            ip      db '127.0.0.1', 0
            wdata   WSADATA
            laddr   sockaddr_in
            caddr   sockaddr_in
            sock    dd ?
            csock   dd ?
            temp    rb 15
            bufer   rb 1024
    
    section '.code' code readable executable
      main:
            invoke  WSAStartup, 0101h, wdata
            invoke  socket, AF_INET, SOCK_STREAM, 6
            mov     [sock], eax
            mov     [laddr.sin_family], AF_INET
            invoke  htons, 6112
            mov     [laddr.sin_port], ax
            invoke  inet_addr, ip
            mov     [laddr.sin_addr], eax
            invoke  bind, [sock], laddr, sizeof.sockaddr_in
            cmp     eax, 0
            jne     .error
            invoke  listen, [sock], 0
    
      .while:
            invoke  accept, [sock], caddr, sizeof.sockaddr_in
            mov     [csock], eax
            invoke  recv, [csock], bufer, 1024, 0
            invoke  lstrcmp, bufer, hello
            cmp     eax, 0
            jne     .while
            invoke  MessageBox, 0, hello, hello, 0
            jmp     .while
    
      .error:
            invoke  GetLastError
            invoke  wsprintf, temp, error, eax
            invoke  MessageBox, 0, temp, hello, MB_OK
            invoke  ExitProcess, 0
    
    section '.idata' import data readable
            library kernel32, 'kernel32.dll',\
                    user32, 'user32.dll',\
                    wsock32, 'wsock32.dll'
    
            include 'api\kernel32.inc'
            include 'api\user32.inc'
            include 'api\wsock32.inc'
    
     
  20. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    2 e4key TCP/IP клиент, сервер

    вот на fasm аналоги тех моих процедур recvall и sendall

    Code:
    ; TCP/IP функции для правильной работы клиента
    
    ;отправить все
    ;ecx - len
    ;ebx - &buf
    proc sendall
    local total dd 0
    
    .w:
    	
    	cmp [total],ecx
    	jnl .exit
    		add ebx,[total]
    		sub ecx,[total]
    
     		invoke send,[sock],ebx,ecx,0
     		inc eax
     		jz .exit
     		dec eax
    		add [total],eax
    		jmp .w
    .exit:
    ret
    endp
    
    ;принять все
    ;ecx - len
    ;ebx - &buf
    proc recvall
    local total dd 0
    
    .w:
    	
    	cmp [total],ecx
    	jnl .exit
    		add ebx,[total]
    		sub ecx,[total]
    
     		invoke recv,[sock],ebx,ecx,0
     		inc eax
     		jz .exit
     		dec eax
    		add [total],eax
    		jmp .w
    .exit:
    ret
    endp
    
    INFO
    http://www.insidepro.com/kk/006/006r.shtml - очень советую по WinSock
     
    _________________________
    #580 Gar|k, 24 Aug 2009
    Last edited: 24 Aug 2009