Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   [c++] [firefox] скрытый переход по линку (https://forum.antichat.xyz/showthread.php?t=168230)

qsd 04.01.2010 20:18

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

К примеру есть следующая хтмл страница, открытая в лисе (допустим ее адрес, находящийся в панели адреса - 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, в поле урла должен отобразиться нужный урл))) во всяком случае это в теории

qsd 04.01.2010 21:44

еще вопрос, как быть с хттпс? весь запрос включая хедеры и тело шифруется и подменить нужный текст запроса не получится(

Gar|k 04.01.2010 22:18

эм если пишешь под windows что мешает тебе напрямую работать с окном fireFox через winAPI функции?

FindWindow, GetWindowText, SetWindowText

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

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

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

qsd 05.01.2010 00:35

это работает с ИЕ (причем некрасиво), но не работает с фф, т.к. там механизм окон реализован подругому. я не нашел окна, ответственного за прием сообщений об изменении поля с урл.

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

qsd 05.01.2010 00:56

только что промониторил все окна мозиллы, ничего с http туда не приходит, нужен другой подход. хук send тоже неподходит. остается хук PR_Write, но подменяя хедеры GET / на GET /adad.php в строке урла получаем:
http://ya,ru/adad.php
!!!

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

qsd 05.01.2010 01:07

вопрос: откуда можно достать инфу с какого урла качается в данный момент инфа (функцией PR_Read или recv)? насколько мне известно в ответе от сервера нет информации откуда пришел ответ!

Gar|k 05.01.2010 01:26

ага... нету есть только запрос
GET path HTTP
POST path HTTP

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

в общем трындец )

qsd 05.01.2010 01:34

ну допустим я знаю идентификатор сокета(они передаются как параметры функциям PR_Read/PR_Write, а они обе у меня захучены) че дальше?))

это имеешь ввиду?
Код:

                                                        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?

qsd 05.01.2010 05:37

чет не понял что ты хотел сказать своим постом) за коды ответа спасибо, но мне нужно всего-лишь одно:
чтобы я перешел на 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

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

в общем какойто пестец

Gar|k 05.01.2010 20:26

ну а че тут не понятного? ) тебе надо хреначить расширение для мозилы-тормозилы )
читай как это делается https://developer.mozilla.org/En/Firefox_addons_developer_guide
я в принципе допер ) все пишется на языке javascript используя DOM мозилы и ее внутренние всякие функции...

qsd 05.01.2010 21:06

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

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

Gar|k 05.01.2010 21:08

qsd главный вопрос - зачем? )))

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

вот оно и будет перекрывать адрес )))) ахахах

qsd 05.01.2010 21:33

нужно очень) есть есть силы, возможности и желание, заплачу за реализацию)

ps я уже думал об этом))

Gar|k 05.01.2010 22:36

вот набросал на FASM :)
нужно из объявлений удалить не используемые функции + удалить

cmp [uMsg],WM_LBUTTONDBLCLK
je .destroy

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

x y width height text

Код:

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 байт прога ) но думаю можно и поменьше сделать

Gar|k 05.01.2010 22:48

Retimiled :) если бы там был едит контрол...

Retimiled 05.01.2010 22:50

Беру слова обратно ... на графику отвечайте графикой! 8))

Gar|k 05.01.2010 22:58

Retimiled типа умный? посмотри на мозилку через spy++ , а потом говори.

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

и вообще 5 января люди расслабляют мозг ) креатив выходит с бадуна ) заплатки вон оконные :D

qsd 06.01.2010 15:45

Gar|k
спасиб за код, но нада бы найти более красивый метод) слишком много вариантов когда это не прокатит (например - юзер ресайзит окно) ну ты и сам понимаешь)))


Время: 23:35