2014-05-24 1 views
0

웹 페이지의 소스를 읽는 데이 C++ 코드가 있습니다.경관 또는 웹 사이트에서 웹 페이지의 소스를 읽으십시오.

#include "stdafx.h" 
#include <winsock2.h> 
#include <windows.h> 
#include <iostream> 
#include <fstream> 
#pragma comment(lib,"ws2_32.lib") 

using namespace std; 

int main(){ 
    WSADATA wsaData; 

    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { 
     cout << "WSAStartup failed.\n"; 
     system("pause"); 
     return 1; 
    } 

    SOCKET Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

    struct hostent *host; 
    host = gethostbyname("www.last.fm"); 

    SOCKADDR_IN SockAddr; 
    SockAddr.sin_port = htons(80); 
    SockAddr.sin_family = AF_INET; 
    SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr); 

    cout << "Connecting...\n"; 
    if (connect(Socket, (SOCKADDR*)(&SockAddr), sizeof(SockAddr)) != 0){ 
     cout << "Could not connect"; 
     system("pause"); 
     return 1; 
    } 
    cout << "Connected.\n"; 

    send(Socket, "GET /music/Taylor+swift/+albums?order=reach&page=1 HTTP/1.1\r\nHost: www.last.fm\r\nConnection: close\r\n\r\n", strlen("GET /music/taylor+swift/+albums?order=reach&page=1 HTTP/1.1\r\nHost: www.cplusplus.com\r\nConnection: close\r\n\r\n"), 0); 
    char buffer[10000]; 

    int nDataLength; 
    while ((nDataLength = recv(Socket, buffer, 10000, 0)) > 0){ 
     int i = 0; 
     while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') { 
      cout << buffer[i];   
      i += 1; 
     } 
    } 

    closesocket(Socket); 
    WSACleanup(); 


    system("pause"); 
    return 0; 
} 

나는 이것을 fasm 어셈블리로 변환하려고 시도했지만 작동하지 않았습니다. 누군가 그것을 조립으로 전환시키는 것을 도울 수 있습니까? 덕분에 (내가 그래서이 코드가 가까우면 확실하지 않다 전에 ASM 소켓과 협력하거나하지 못했던주의, 나는 그것이 연결 생각하지만, 그것은 빈 메시지 박스 대신 웹 페이지 소스 코드 제공)

format PE GUI 4.0 
entry start 

include '\Fasm\INCLUDE\win32ax.inc' 

section '.data' data readable writeable 
    IPPROTO_TCP = 6 


wsadata WSADATA 
_caption db 'Client application',0 
_igang db 'The client has started very well.',13,10,'It is now going to connect to your own computer',0 
_hostname db 'Wrong hostname',0 

    hostname db 'www.lastfm.com',0 
    hSock dd ? 
    saddr sockaddr_in 
    sizesaddr = $-saddr 


    buffer rb 0x3000 

    sender db 'GET /music/Taylor+swift/+albums?order=reach&page=1 HTTP/1.1\r\nHost: www.last.fm\r\nConnection: close\r\n\r\n',13,10 
     rb 0x100 

section '.code' code readable executable 
start: 

     invoke WSAStartup,0101h,wsadata ; initialiserer winsock-bibliotek 

     invoke ws_gethostbyname,hostname 
     or  eax,eax 
     jz  bad_hostname 
       virtual at eax 
       .host hostent 
       end virtual 
     mov eax,[.host.h_addr_list] 
     mov eax,[eax] 
     mov eax,[eax] 
     mov  [saddr.sin_addr],eax 
     invoke MessageBox,0,_igang,_caption,0 
     mov al,00 
     mov ah,80   ; port 80 
     mov  [saddr.sin_port],ax 
     mov  [saddr.sin_family],AF_INET 
     invoke ws_socket, AF_INET, SOCK_STREAM, IPPROTO_TCP 
     mov  [hSock], eax 
     xchg eax, esi 
     invoke ws_connect, esi, saddr, sizesaddr 
     .if eax = 0 
     invoke MessageBox,0, "connected", _caption,0 
     .endif 
     .if eax <> 0 
     invoke MessageBox,0, "not connected", _caption,0 
     .endif 
     mov  ebx, buffer 
     invoke ws_send,esi,sender,109,0 
     invoke ws_recv, esi, ebx, 1000, 0 
     invoke MessageBox,0, buffer, _caption,0 
     .connectSucceeded: 
     invoke ws_closesocket,esi 
     invoke WSACleanup 
     jmp stopp 

bad_hostname: 
     invoke MessageBox,0,_hostname,_caption,0 
     jmp stopp 

stopp: 
     invoke ExitProcess,0 



section '.idata' import data readable writeable 

    library kernel,'KERNEL32.DLL',\ 
      winsock,'WSOCK32.DLL',\ 
      user,'USER32.DLL' 

    import kernel,\ 
     ExitProcess,'ExitProcess' 

    import winsock,\ 
     WSAStartup,'WSAStartup',\ 
     ws_socket,'socket',\ 
     ws_connect,'connect',\ 
     ws_gethostbyname,'gethostbyname',\ 
     ws_send,'send',\ 
     ws_recv,'recv',\ 
     ws_closesocket,'closesocket',\ 
     WSACleanup,'WSACleanup' 

    import user,\ 
     MessageBox,'MessageBoxA' 
+2

_ "누군가가 나를 어셈블리로 변환하는 데 도움을 줄 수 있습니까?"_는 StackOverflow에서 특히 좋은 질문이 아닙니다. 문제가있는 코드의 특정 부분을 가리킬 수 있습니까? (코드 조각이 무엇을 기대하고 실제로 무엇을하는지에 대한 설명을 포함하십시오.) – Michael

+0

포트 80에서 lastfm에 연결되어있는 것처럼 보이지만 올바른 GET 메시지를 보내지 않는다고 생각합니다. –

+0

나는 이것에 대해 많은 경험이 없지만 GET 메시지의 형식이 매우 까다 롭다고 말할 수 있습니다. "/ n/r"이 올바르게 이스케이프 처리되는지 궁금합니다. 내가 당신이 얻고있는 것이 확실하지 않다면 그것들을 명시적인 "13, 10"으로 대체하려고 노력할 것입니다. –

답변

0

I을 당신이 소켓에 신경 쓰지 않고 WinInet의 기능을 사용하는 것이 좋습니다. 이 WinAPI는 fASM에서 사용하기 쉽습니다.

2

내 inet 기능, 아마도 당신을 도울 것입니다.

push cookie 
push post 
push url 
push buffer 
call connectHTTP 

결과가 버퍼에 저장됩니다. 기능이 최적화되지는 않았지만 안정적으로 작동합니다.

; ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ 
; 
; inet.asm 
; 
; HFT -> inet functions 
; 
; Copyright (C) 2013 Ilya M. Chirkunov ([email protected]) 
; 
; - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - 

format ELF 

include 'cdecl.inc' 

public connectHTTP 

extrn gethostbyname 
extrn socket 
extrn htons 
extrn connect 
extrn send 
extrn recv 
extrn close 
extrn strcpy2 
extrn strcat2 
extrn strpos 
extrn strlen2 
extrn hex2decascii 
extrn push_ad 
extrn pop_ad 

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
;          С Е К Ц И Я К О Д А 
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

section '.text' executable 

; ------------------------------------- HTTP запрос 

proc connectHTTP 

     call push_ad 

     pop  eax           ; сохраняем адрес возврата 
     pop  edi esi ecx edx        ; edi - buffer, esi - url, ecx - post, edx - cookie 
     push eax           ; восстанавливаем адрес возврата 

;  (составляем запрос) 
     sub  esp,10000 
     mov  ebx,esp          ; в ebx будем собирать запрос 

     cmp  dword[esi],"http" 
     jne  _not_http 
     add  esi,7           ; убираем "http://" 
    _not_http: 

     push szPOST 
     push ebx 
     call strcpy2          ; "POST " 
     cmp  ecx,0 
     jnz  _is_post 

     push szGET 
     push ebx 
     call strcpy2          ; "GET " 

    _is_post: 
     push szSlash 
     push ebx 
     call strcat2          ; "GET /" 

     push esi 
     push edi 
     call strcpy2          ; копируем url в буффер 

     push szSlash 
     push edi 
     call strpos          ; ищем URI 
     cmp  eax,-1 
     je  _only_host 
     mov  byte[edi+eax],0        ; в edi - host 
     add  esi,eax          ; в esi - uri 
     inc  esi 

     push esi 
     push ebx 
     call strcat2          ; "GET /full_uri HTTP/1.0" 

_only_host: 
     push szHTTP10 
     push ebx 
     call strcat2          ; "GET/HTTP/1.0" 
     push szDA 
     push ebx 
     call strcat2          ; "GET/HTTP/1.0",0xD,0xA 
     push szHost 
     push ebx 
     call strcat2          ; "GET/HTTP/1.0",0xD,0xA,"Host: " 
     push edi 
     push ebx 
     call strcat2          ; "GET/HTTP/1.0",0xD,0xA,"Host: sphost.org" 
     push szDA 
     push ebx 
     call strcat2          ; "GET/HTTP/1.0",0xD,0xA,"Host: sphost.org",0xD,0xA 

     cmp  ecx,0 
     jz  _finish_query_string 

     push szContType 
     push ebx 
     call strcat2          ; "POST/HTTP/1.0",0xD,0xA,"Host: sphost.org",0xD,0xA,"Content-Type: application/x-www-form-urlencoded" 
     push szDA 
     push ebx 
     call strcat2          ; "POST/HTTP/1.0",0xD,0xA,"Host: sphost.org",0xD,0xA,"Content-Type: application/x-www-form-urlencoded",0xD,0xA 
     push szLength 
     push ebx 
     call strcat2          ; "POST/HTTP/1.0",0xD,0xA,"Host: sphost.org",0xD,0xA,"Content-Length: " 

     push ecx 
     call strlen2 
     push eax 
     push szSize 
     call hex2decascii 

     push szSize 
     push ebx 
     call strcat2          ; "POST/HTTP/1.0",0xD,0xA,"Host: sphost.org",0xD,0xA,"Content-Length: 64" 
     push szDA 
     push ebx 
     call strcat2          ; "POST/HTTP/1.0",0xD,0xA,"Host: sphost.org",0xD,0xA,"Content-Length: 64",0xD,0xA 
     push szDA 
     push ebx 
     call strcat2          ; "POST/HTTP/1.0",0xD,0xA,"Host: sphost.org",0xD,0xA,"Content-Length: 64",0xD,0xA,0xD,0xA 
     push ecx 
     push ebx 
     call strcat2          ; "POST/HTTP/1.0",0xD,0xA,"Host: sphost.org",0xD,0xA,"Content-Length: 64",0xD,0xA,0xD,0xA,"post" 
     push szDA 
     push ebx 
     call strcat2          ; "POST/HTTP/1.0",0xD,0xA,"Host: sphost.org",0xD,0xA,"Content-Length: 64",0xD,0xA,0xD,0xA,"post",0xD,0xA 

_finish_query_string: 
     push szDA 
     push ebx 
     call strcat2          ; "GET/HTTP/1.0",0xD,0xA,"Host: sphost.org",0xD,0xA,0xD,0xA 

;  (отправляем запрос) 
     ccall gethostbyname, edi 
     ;cmp  eax,0 
     ;jz  _ret_conHTTP 
     mov  eax,[eax+16] 
     mov  eax,[eax] 
     mov  eax,[eax] 
     mov  dword[sin_addr],eax 

     ccall socket, 2, 1, 6        ; AF_INET, SOCK_STREAM, IPPROTO_TCP 
     ;cmp  eax, -1 
     ;je  _ret_conHTTP 
     mov  dword[sockfd],eax 

     ccall htons, 80 
     mov  word[sin_port],ax 
     mov  word[sin_family],2 

     ccall connect, dword[sockfd], sin_family, 16 
     ;cmp  eax,0 
     ;jnz  _ret_conHTTP 

     push ebx 
     call strlen2 

     ccall send, dword[sockfd], ebx, eax, 0 
     add  esp,10000 

;  (получаем ответ) 
    _getURL_recv: 
     ccall recv, dword[sockfd], edi, 1024, 0 
     add  edi,eax 
     cmp  eax,0 
     jnz  _getURL_recv 
     mov  byte[edi],0 

     ccall close,dword[sockfd] 

_ret_conHTTP: 
     call pop_ad 
     ret 

endp 

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
;          С Е К Ц И Я Д А Н Н Ы Х 
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

section '.data' writeable 

    szGET    db "GET ", 0 
    szPOST   db "POST ", 0 
    szSlash   db "/",0 
    szHTTP10   db " HTTP/1.0",0 
    szDA    db 0xD,0xA,0 
    szHost   db "Host: ", 0 
    szContType  db "Content-Type: application/x-www-form-urlencoded",0 
    szLength   db "Content-Length: ", 0 
    szSize   db 12 dup (0) 
    sockfd   dd 0 

; sockaddr_in  db 16 dup (0) 
    sin_family  db 2 dup (0) 
    sin_port   db 2 dup (0) 
    sin_addr   db 4 dup (0) 
    sin_zero   db 8 dup (0) 
관련 문제