PDA

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


qsd
04.01.2010, 20:18
Добрый день,

К примеру есть следующая хтмл страница, открытая в лисе (допустим ее адрес, находящийся в панели адреса - 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 (http://vsokovikov.narod.ru/New_MSDN_API/Window/win_functions.htm)

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