Вообщем попался мне на глаза длоадер, давно хотел его посмотреть, но все времени не было
Тут на сайте видел даже, по-моему, обзор по реверсу был, но он мне вообще не понравился, так как не отражал истину до конца
Короче как-то так сложилось, что я привык юзать сокеты и wininet воспринимал как попсу и не при каких обстоятельствах не хотел юзать
Но вот сделал поверхностный реверс этого длоадера, увидел у него функцию загрузки
Короче.. примерно такой код:
Юзает он этот код, скорее всего из-за его компактности
Но я, к сожалению wininet не юзал и даже не ожидал, что столько может моментально появиться вопросов
В первую очередь погуглил и то, что прочитал, убило наповал, но да ладно оставлю за кадром...
Первый вопрос:
Цитата из статьи
http://www.rsdn.ru/article/inet/wininet.xml - Введение в WinInet
Вот хочу спросить у тех, кто юзал данный код - вариант с InternetSetFilePointer и FILE_END сто процентов рабочий или тоже траблы есть?
Я в принципе решение нашел, но вот ради интереса хочется узнать.
Второй вопрос:
InternetOpenUrl судя по моим тестам, работает совсем не так как мне нужно
Если картинка была ранее скачена через Internet Explorer и если комп в данный момент не имеет подключения к инету и Internet Explorer работает в автономном режиме, картинка будет "скачена" из кэша, а если в Internet Explorer работает НЕ в автономном режиме, то выскакивает мессага предлагая подключиться к инету, которая сразу палит все дело - но да ладно, эт можно тоже пофиксить
Проблема начинается при скачивании картинки, InternetOpenUrl "проверяет" кэш и если есть картинка в кэше, то и читает соответственно ее из кэша и даже не пытается скачать ее из инета притом, что комп имеет подключение к инету и находится в онлайн
Но даже у меня как-то получилось (я даже не понял как), чтобы InternetOpenUrl попыталась обратиться к урлу и там даже было получено несколько пакетов, в которых походу проверялась дата последнего обновления картинки и все, мля.. естественно она одинаковая и произошла загрузка опять из кэша
Вот хочу спросить у тех, кто юзал данный код - как заставить InternetOpenUrl при любых обстоятельствах скачать картинку, даже если дата "обновления" идентична?
ЗЫ: Если картинку качать первый раз, то все замечательно качает...
ЗЫЫ: Код находится в процессе explorer.exe
Тут на сайте видел даже, по-моему, обзор по реверсу был, но он мне вообще не понравился, так как не отражал истину до конца
Короче как-то так сложилось, что я привык юзать сокеты и wininet воспринимал как попсу и не при каких обстоятельствах не хотел юзать
Но вот сделал поверхностный реверс этого длоадера, увидел у него функцию загрузки
Короче.. примерно такой код:
Код:
DWORD dwSize;
HINTERNET hInternet = InternetOpen("UserAgent", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if(hInternet)
{
HINTERNET hUrl = InternetOpenUrl(hInternet, "http://wasm.ru/forum/img/Invision-board/title_cat.gif", NULL, 0, 0, 0);
if(hUrl)
{
DWORD FileSize = InternetSetFilePointer(hUrl, 0, NULL, FILE_END, 0);
if(FileSize != 0xFFFFFFFF && FileSize >= 10)
{
InternetSetFilePointer(hUrl, 0, NULL, FILE_BEGIN, 0);
FileSize++;
pbFile = (PBYTE)VirtualAlloc(NULL, FileSize, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE);
if(pbFile)
{
do{
if(!InternetReadFile(hUrl, pbFile, FileSize, &dwSize)) goto LEXIT;
}while(dwSize);
[...]
Но я, к сожалению wininet не юзал и даже не ожидал, что столько может моментально появиться вопросов
В первую очередь погуглил и то, что прочитал, убило наповал, но да ладно оставлю за кадром...
Первый вопрос:
Цитата из статьи
http://www.rsdn.ru/article/inet/wininet.xml - Введение в WinInet
Здесь как мы видим из кода, размер файла получаем с помощью InternetSetFilePointer и FILE_ENDИспользует для получения информации функцию HttpQueryInfo с параметром HTTP_QUERY_CONTENT_LENGTH. Я встречался с ситуацией, когда эта функция возвращала ноль, хотя после этого данные читались в полном объёме. Можно было бы использовать функцию InternetQueryDataAvailable, но с ней тоже не всё в порядке. Например, при чтении страницы ASP эта функция выдаёт не размер результирующей страницы, а размер самого скритпа, что, несомненно, является весьма интересной информацией, но совершенно бесполезной для нас. В результате, я не знаю и не могу предложить Вам абсолютно надёжного способа получить точную информацию о размере запрашиваемых данных. Скорее всего, это будет работать, но если Вы предполагаете использовать сервера, которые не можете заранее протестировать, то лучше не полагайтесь на эти функции.
Код:
DWORD FileSize = InternetSetFilePointer(hUrl, 0, NULL, FILE_END, 0);
Я в принципе решение нашел, но вот ради интереса хочется узнать.
Второй вопрос:
InternetOpenUrl судя по моим тестам, работает совсем не так как мне нужно
Если картинка была ранее скачена через Internet Explorer и если комп в данный момент не имеет подключения к инету и Internet Explorer работает в автономном режиме, картинка будет "скачена" из кэша, а если в Internet Explorer работает НЕ в автономном режиме, то выскакивает мессага предлагая подключиться к инету, которая сразу палит все дело - но да ладно, эт можно тоже пофиксить
Проблема начинается при скачивании картинки, InternetOpenUrl "проверяет" кэш и если есть картинка в кэше, то и читает соответственно ее из кэша и даже не пытается скачать ее из инета притом, что комп имеет подключение к инету и находится в онлайн
Но даже у меня как-то получилось (я даже не понял как), чтобы InternetOpenUrl попыталась обратиться к урлу и там даже было получено несколько пакетов, в которых походу проверялась дата последнего обновления картинки и все, мля.. естественно она одинаковая и произошла загрузка опять из кэша
Вот хочу спросить у тех, кто юзал данный код - как заставить InternetOpenUrl при любых обстоятельствах скачать картинку, даже если дата "обновления" идентична?
ЗЫ: Если картинку качать первый раз, то все замечательно качает...
ЗЫЫ: Код находится в процессе explorer.exe