Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > EmbeddedWB, как не загружать с другого домена


Автор: lollollollol 21.3.2013, 20:51
Снова всех приветствую.

Добился стабильной работы от EmbeddedWB, избавился от утечки памяти, и похоже осталась финальная загвоздка.
Сайт, который загружается в EmbeddedWB подгружает какие-то картинки и js с другого домена, но тот домен по неизвестным причинам не работает.
Результат - долго пытается загрузить страничку.

Я хочу сделать так, чтобы EmbeddedWB не загружал никаких файлов со сторонних доменов.
Например я открываю сайт http://vasya.com/
На этом сайте выполняется загрузка картинок,js,css не только с домена http://vasya.com/, но и с http://blabla.com/
Нужно сделать чтобы загрузка скриптов и картинок выполнялась только с домена http://vasya.com/.

Посмотрел все свойства компонента, ничего не нашел. Подскажите в каком направлении копать, я что-то даже в юнитах компонента не нашел кода загрузки скриптов и картинок, хотел прям там условие прописать.

Прошу помощи, кто чем может

Автор: lollollollol 21.3.2013, 22:15
Ничего в голову не приходит... Можно конечно создать socks на 127.0.0.1:Любой порт, настроить работу через прокси, и уже на уровне прокси фильтровать куда пускать запрос, но я считаю это уже изврат высшей степени.

Должна быть другая возможность решить проблему

Автор: lollollollol 22.3.2013, 19:29
Ещё думал может изменить html таким оразом, чтобы там небыло ссылок на другие домены, но ведь браузер вначале всё загружает

Автор: lollollollol 23.3.2013, 06:30
Я вот подумал, может быть можно достучаться до функций которые выполняют парсинг ссылок перед тем как браузер начнёт грузить необходимые файлы, прописаные в html? Не удаётся найти, есть ли смысл копать  этом направлении, или за это ядро IE отвечает?

Автор: Чучмек 25.3.2013, 08:35
Цитата(lollollollol @  23.3.2013,  06:30 Найти цитируемый пост)
Я вот подумал, может быть можно достучаться до функций которые выполняют парсинг ссылок перед тем как браузер начнёт грузить необходимые файлы, прописаные в html

Перехвати gethostbyname (getaddrinfo) и connect из WS2_32.dll

Автор: lollollollol 25.3.2013, 20:01
Эт как перехватить? Я ради интереса делал подобное год назад, но я там свою функцию перехватывал:
Менял адрес вызова функции, и выполнял свою функцию
Сейчас попробую так сделать. Или существуют стандартные методы перехвата, чтото типа дополнительного uses?

Автор: Чучмек 25.3.2013, 20:10
Цитата(lollollollol @  25.3.2013,  20:01 Найти цитируемый пост)
чтото типа дополнительного uses

Можешь пока воспользоваться моим.
Код

uses ...,FunctionPatch;
...
function old_connect(s: TSocket; var name: TSockAddr; namelen: Integer): Integer; stdcall;
asm
db '000000000000000000000000000000000000000000000000';
end;
function my_connect(s: TSocket; var name: TSockAddr; namelen: Integer): Integer; stdcall;
begin
Result:=old_connect(s,name,namelen);
end;
...
begin
Patch('WS2_32.dll','connect',@my_connect,@old_connect);
...



Автор: lollollollol 25.3.2013, 20:49
Спасибо, завтра отпишу что получилось

Автор: lollollollol 26.3.2013, 08:09
Спасибо большое!

Как появилось время сразу решил сделать, и всё получилось. 
Правда мне удобнее было перехватывать функцию getaddrinfo, сделал по Вашему примеру, всё сразу заработало так как и ожидалось! 

Ещё раз большое спасибо!

Автор: Чучмек 26.3.2013, 09:14
Цитата(lollollollol @  26.3.2013,  08:09 Найти цитируемый пост)
Правда мне удобнее было перехватывать функцию getaddrinfo

IE6 использует gethostbyname. Для совместимости необходимо перехватывать и эту функцию.

Автор: lollollollol 26.3.2013, 16:06
у меня ие8, getaddrinfo работает, если я сделаю gethostbyname, на ие 8 тоже будет работать?


Автор: Чучмек 26.3.2013, 16:39
Цитата(lollollollol @  26.3.2013,  16:06 Найти цитируемый пост)
на ие 8 тоже будет работать
 если только getaddrinfo - нет.
Необходимо перехватывать обе функции.

Добавлено через 2 минуты и 28 секунд
Какой алгоритм используешь?

Автор: lollollollol 26.3.2013, 16:46
Поясни принцип работы, а то чтото торможу.

Вот есть 3 функции, 

Код


  Patch('WS2_32.dll','gethostbyname',@my_gethostbyname,@old_gethostbyname);
  Patch('WS2_32.dll','getaddrinfo',@my_getaddrinfo,@old_getaddrinfo);
  Patch('WS2_32.dll','connect',@my_connect,@old_connect);

Код

function old_gethostbyname(name: PChar): PHostEnt; stdcall;
asm
  db '000000000000000000000000000000000000000000000000';
end;

function old_getaddrinfo(nodename, servname: PChar; hints: paddrinfo; var res: paddrinfo): integer; stdcall;
asm
  db '000000000000000000000000000000000000000000000000';
end;

function old_connect(s: TSocket; var name: TSockAddr; namelen: Integer): Integer; stdcall;
asm
  db '000000000000000000000000000000000000000000000000';
end;


Что происходит когда они вызываются? 
Строка   db '000000000000000000000000000000000000000000000000'; за что отвечает?

Автор: Чучмек 26.3.2013, 17:04
Цитата(lollollollol @  26.3.2013,  16:46 Найти цитируемый пост)
Строка   db '000000000000000000000000000000000000000000000000'; за что отвечает?

Резервирует место

Добавлено через 6 минут и 14 секунд
По адресу перехватываемой функции записывается переход на my_function
По адресу old_function переносится часть кода из перехватываемой, которая затирается переходом, и переход на оставшийся код.

Автор: lollollollol 26.3.2013, 17:26
Цитата

По адресу перехватываемой функции записывается переход на my_function
По адресу old_function переносится часть кода из перехватываемой, которая затирается переходом, и переход на оставшийся код. 

Да, сам алгоритм я понял, меня смутило то что во всех случаях одна строка кода выполняется

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)