[c++] [firefox] скрытый переход по линку

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by qsd, 4 Jan 2010.

  1. qsd

    qsd New Member

    Joined:
    4 Jan 2010
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    Добрый день,

    К примеру есть следующая хтмл страница, открытая в лисе (допустим ее адрес, находящийся в панели адреса - http://www.CURRENT.com/another.php):

    <html>
    <body>
    <form action=http://www.ORIGINAL.com/main.php>
    ....... // контент формы
    </form>
    </body>
    </html>

    нужно чтобы после сабмита юзером формы, в браузере остался адрес http://www.CURRENT.com/another.php, а ответ был отображен от сервера http://www.ORIGINAL.com/main.php

    Желательно сделать это хуком какойнить функции фф или winsock. Посдкажите каким образом можно реализовать подобный скрытый серфинг?

    Я вообще хотел делать так:
    1. в PR_Write (оболочка для send) изменить заголовки так, чтобы они соответствовали http://www.CURRENT.com/main.php
    2. в send поменять заголовки обратно))

    таким образом фф занесет нужный адрес урла (http://www.ORIGINAL.com/main.php) в нужный буффер и в нужный момент времени, а именно как только получит первые данные от recv, в поле урла должен отобразиться нужный урл))) во всяком случае это в теории
     
    #1 qsd, 4 Jan 2010
    Last edited: 4 Jan 2010
  2. qsd

    qsd New Member

    Joined:
    4 Jan 2010
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    еще вопрос, как быть с хттпс? весь запрос включая хедеры и тело шифруется и подменить нужный текст запроса не получится(
     
  3. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    эм если пишешь под windows что мешает тебе напрямую работать с окном fireFox через winAPI функции?

    FindWindow, GetWindowText, SetWindowText

    чтобы быстро найти нужный элемент используй стандартную утилиту VS - Spy++
    чтоб писать легче было прогу

    алгоритм такой:
    нашли окно
    нашли нужный элемент

    цикл бесконечный с задержкой в несколько миллисекунд чтобы не грузить процессор
    запросили текст элемента в нем, если нужный сайт переписываем что нужно...
     
    _________________________
  4. qsd

    qsd New Member

    Joined:
    4 Jan 2010
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    это работает с ИЕ (причем некрасиво), но не работает с фф, т.к. там механизм окон реализован подругому. я не нашел окна, ответственного за прием сообщений об изменении поля с урл.

    я вообще хз че с этим фф делать(
     
  5. qsd

    qsd New Member

    Joined:
    4 Jan 2010
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    только что промониторил все окна мозиллы, ничего с http туда не приходит, нужен другой подход. хук send тоже неподходит. остается хук PR_Write, но подменяя хедеры GET / на GET /adad.php в строке урла получаем:
    http://ya,ru/adad.php
    !!!

    то же самое с хуком send, значит получение урла, откуда получен ответ, происходит какимто другим образом
     
  6. qsd

    qsd New Member

    Joined:
    4 Jan 2010
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    вопрос: откуда можно достать инфу с какого урла качается в данный момент инфа (функцией PR_Read или recv)? насколько мне известно в ответе от сервера нет информации откуда пришел ответ!
     
  7. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    ага... нету есть только запрос
    GET path HTTP
    POST path HTTP

    ну а вообще вроде поле HOST является обязательным параметром.
    + ко всему есть такая штука как индификатор сокета - а его можно узнать
    так же можно узнать какие сокеты открыл процесс с какими индификаторами...
    http://forum.antichat.ru/showpost.php?p=1302363&postcount=28

    в общем трындец )
     
    _________________________
  8. qsd

    qsd New Member

    Joined:
    4 Jan 2010
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    ну допустим я знаю идентификатор сокета(они передаются как параметры функциям PR_Read/PR_Write, а они обе у меня захучены) че дальше?))

    это имеешь ввиду?
    Code:
    							ress = sizeof(sockaddr_in);//--- commenting this line would cause an 10014 error.
    							getpeername((SOCKET)ObjHandle, (sockaddr *)&sockname, &ress);
    
    							//--- определяем локальный IP и порт
    							ress = sizeof(sockaddr_in);//--- commenting this line would cause an 10014 error.
    							getsockname((SOCKET)ObjHandle, (sockaddr *)&locname, &ress);
    				
    
    							//--- коевертируем в понятные для глаза данные )
    							remaddr = inet_ntoa(sockname.sin_addr);
    							rem_port = ntohs(sockname.sin_port);
    
    							locaddr = inet_ntoa(locname.sin_addr);
    							loc_port = ntohs(locname.sin_port);
    
    я просто не силен в сокетах) самое главное подменить URL-Path, т.е. с хостом то можно разобраться хуком connect'a, а вот с URL-Path, который идет после слеша, я вообще хз как быть( че только не пробовал, эта сцука все равно отображает полный путь!

    может ff список какойнить создает, где хранится этот path?
     
    #8 qsd, 5 Jan 2010
    Last edited: 5 Jan 2010
  9. qsd

    qsd New Member

    Joined:
    4 Jan 2010
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    чет не понял что ты хотел сказать своим постом) за коды ответа спасибо, но мне нужно всего-лишь одно:
    чтобы я перешел на yandex.ru/yandsearch?text=any а в строке браузера было: http://yandex.ru/
    !

    ща перелопатил исходники фф вместе с документацией пришел к выводу, что докопаться до поля урла можно 2мя способами:
    1. xpcom
    2. чезез shell-функции мозиллы (LoadURI()/OnLinkClick())
    https://developer.mozilla.org/en/Document_Loading_-_From_Load_Start_to_Finding_a_Handler

    с первым я никогда не работал, а вторые проблематично вызвать, т.к. они находятся в самом ехе, а не во внешней длл(

    в общем какойто пестец
     
  10. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    ну а че тут не понятного? ) тебе надо хреначить расширение для мозилы-тормозилы )
    читай как это делается https://developer.mozilla.org/En/Firefox_addons_developer_guide
    я в принципе допер ) все пишется на языке javascript используя DOM мозилы и ее внутренние всякие функции...
     
    _________________________
  11. qsd

    qsd New Member

    Joined:
    4 Jan 2010
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    я инжектюсь в АП фф, хотелось бы решить это без аддонов) либо написать его так, чтобы я имел полный контроль над аддоном. в принципе нужно это тока для хттпс, возможно прокатит такой вариант:
    1. подменяем в PR_Write path на тот что наодится в поле адреса в данный момент
    2. расшифровываем send и подменяем запрос обратно

    по идее не должен он из зашифрованного запроса выстаскивать урл... ну самый крайний вариант - написать свой send или отлавливать запрос на более низком уровне..
     
  12. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    qsd главный вопрос - зачем? )))

    вот тебе еще бредовая идея )
    делать WM_POPUP окно поверх всех окон. в нем рисовать белую полоску и текст с адресом.

    вот оно и будет перекрывать адрес )))) ахахах
     
    _________________________
    #12 Gar|k, 5 Jan 2010
    Last edited: 5 Jan 2010
  13. qsd

    qsd New Member

    Joined:
    4 Jan 2010
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    нужно очень) есть есть силы, возможности и желание, заплачу за реализацию)

    ps я уже думал об этом))
     
  14. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    вот набросал на FASM :)
    нужно из объявлений удалить не используемые функции + удалить

    cmp [uMsg],WM_LBUTTONDBLCLK
    je .destroy

    что бы она не закрывалась по двойному нажатию
    и изменить mov [wc.hbrBackground],25d // 25d это цвет подсказки на COLOR_WINDOW+1
    и по хорошему сделать командную строку для запуска типа

    x y width height text

    Code:
    format PE GUI 4.0
    entry start
    
    include 'C:\FASM\INCLUDE\win32a.inc'
    
    section '.text' code import writeable readable executable
    
    ;---------импорт функций
    library kernel32, 'kernel32.dll',\
    		user32,'user32.dll',\
    		gdi32,'Gdi32.dll'
    		
    import gdi32,\
    TextOut,'TextOutA',\
    SetBkMode,'SetBkMode',\
    GetStockObject,'GetStockObject',\
    SelectObject,'SelectObject',\
    MoveTo,'MoveToEx',\
    LineTo,'LineTo'
    
    import kernel32,\
      ExitProcess, 'ExitProcess',\
      GetModuleHandle,'GetModuleHandleA',\
      GetLocalTime,'GetLocalTime',\
      CreateFile,'CreateFileA',\
      ReadFile,'ReadFile',\
      CloseHandle,'CloseHandle',\
      CreateEvent,'CreateEventA',\
      WaitForSingleObject,'WaitForSingleObject',\
      CreateThread,'CreateThread'
      
    
    import user32,\
    RegisterClass,'RegisterClassExA',\
    LoadCursor,'LoadCursorA',\
    CreateWindow,'CreateWindowExA',\
    ShowWindow,'ShowWindow',\
    UpdateWindow,'UpdateWindow',\
    GetMessage,'GetMessageA',\
    TranslateMessage,'TranslateMessage',\
    DispatchMessage,'DispatchMessageA',\
    DefWindowProc,'DefWindowProcA',\
    PostQuitMessage,'PostQuitMessage',\
    BeginPaint,'BeginPaint',\
    EndPaint,'EndPaint',\
    SendMessage,'SendMessageA',\
    wsprintf,'wsprintfA'
    
    
    proc WndProc,hWnd,uMsg,wParam,lParam
    
    
    push	ebx esi edi
    cmp [uMsg],WM_CREATE
    je .create
    cmp [uMsg],WM_LBUTTONDBLCLK 
    je .destroy
    cmp	[uMsg],WM_DESTROY
    je .destroy
    cmp [uMsg],WM_PAINT
    je .paint
    jmp .def
    
    
    .create:
    invoke GetStockObject,ANSI_VAR_FONT
    mov [hFont],eax
    jmp .retrun_null
    
    .paint:
    invoke BeginPaint,[hWnd],PaintStruct
    mov [hDC],eax
    
    invoke SetBkMode,[hDC],TRANSPARENT
    invoke SelectObject,[hDC],[hFont]
    invoke TextOut,[hDC],3,3,string,13
    invoke EndPaint,[hWnd],PaintStruct
    jmp .retrun_null
    
    .destroy:
    invoke PostQuitMessage,0
    jmp .retrun_null
    
    .def:
    invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
    jmp .exit
    
    .retrun_null:
    xor eax,eax
    .exit:
    pop	edi esi ebx
    ret
    endp 
    
    
    proc WinMain,hInst
    
    mov   [wc.cbSize],48d
    mov   [wc.style], CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
    mov   [wc.lpfnWndProc], WndProc
    mov   [wc.cbClsExtra],NULL
    mov   [wc.cbWndExtra],NULL
    push  [hInstance]
    pop   [wc.hInstance]
    mov   [wc.hbrBackground],25d
    mov   [wc.lpszMenuName],NULL
    mov   [wc.lpszClassName],ClassName
    mov   [wc.hIcon],NULL
    invoke LoadCursor,NULL,IDC_ARROW
    mov   [wc.hCursor],eax
    
    invoke RegisterClass,wc
    invoke CreateWindow,WS_EX_TOOLWINDOW or WS_EX_TOPMOST,\
                    ClassName,\
                    NULL,\
                    WS_POPUP,\
                    150,\
                    150,\
                    [sizeW],\
                    [sizeH],\
                    NULL,\
                    NULL,\
                    [hInst],\
                    NULL
      
    mov [hwnd],eax
    invoke ShowWindow, [hwnd],SW_SHOWDEFAULT
    invoke UpdateWindow, [hwnd]
    
    .while:
    invoke GetMessage,msg,NULL,0,0
    test eax,eax
    jz .exit
    invoke TranslateMessage, msg
    invoke DispatchMessage, msg
    jmp .while
    
    .exit:
     mov  eax,[msg.wParam]
    ret
    endp
    
    start:
    invoke	GetModuleHandle,0
    mov [hInstance],eax
    push eax
    call WinMain
    invoke ExitProcess, 0
    
    ;----------данные
    ClassName db 'x',0
    sizeW dd 117
    sizeH dd 18
    string db 'http://ya.ru/'
    hInstance dd ?
    wc WNDCLASSEX ? 
    hwnd dd ?
    msg MSG ?
    hDC dd ? 
    PaintStruct	PAINTSTRUCT ? 
    hFont dd ?
    
    все просто компилируется > fasm code.asm
    у меня получилась 2048 байт прога ) но думаю можно и поменьше сделать
     
    _________________________
    #14 Gar|k, 5 Jan 2010
    Last edited: 5 Jan 2010
  15. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Retimiled :) если бы там был едит контрол...
     
    _________________________
  16. Retimiled

    Retimiled Banned

    Joined:
    23 Dec 2009
    Messages:
    110
    Likes Received:
    17
    Reputations:
    0
    Беру слова обратно ... на графику отвечайте графикой! 8))
     
    #16 Retimiled, 5 Jan 2010
    Last edited: 5 Jan 2010
  17. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Retimiled типа умный? посмотри на мозилку через spy++ , а потом говори.

    у нее собственный интерфейс и стандартные виндовые функции тут не работают.

    и вообще 5 января люди расслабляют мозг ) креатив выходит с бадуна ) заплатки вон оконные :D
     
    _________________________
    #17 Gar|k, 5 Jan 2010
    Last edited: 5 Jan 2010
  18. qsd

    qsd New Member

    Joined:
    4 Jan 2010
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    Gar|k
    спасиб за код, но нада бы найти более красивый метод) слишком много вариантов когда это не прокатит (например - юзер ресайзит окно) ну ты и сам понимаешь)))