Проблемы с InternetReadFile

Тема в разделе "WASM.WIN32", создана пользователем Freecod, 1 окт 2008.

  1. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    Внедрился в чужой процесс, получил хендл запроса на сервер, хочу считать страницу в ответ.
    Перехватываю IRF.

    Код (Text):
    1. char buff[255];
    2. while (true)
    3. {
    4.     if (!OrigInternetReadFile(hFile, buff, sizeof(buff), &dwSize)) // hFile - перехваченный хендл
    5.     {
    6.         MessageBox(0, "InternetReadFile", "IRF", 0);
    7.         goto fck;
    8.     }
    9.  
    10.     if (dwSize == 0)
    11.         break;
    12.  
    13.     buff[dwSize] = 0x00;
    14.     page += buff;
    15.     dwReadPtr += dwSize;
    16. }
    Но этот код работает из рук вон плохо. То считает половину страницы и обломается (dwSize == 0), то IRF возвращает 0. В последней мутации =\ вообще после первого вызова IRF возвращает true, но dwSize = 0.

    Как стабильности добиться? С чем может быть связанна такая ерунда?
     
  2. dendi

    dendi New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    233
    InternetQueryDataAvailable Function
    Queries the server to determine the amount of data available.
     
  3. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    А как вызов IRF влияет на хендл? т.е. можно как-то имея хенд прочитать всю страницу, но при этом вернуть хендл так, как будто чтения не было, и след. вызов IRF читал страницу снова?
     
  4. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    Ещё вопрос -
    я перехватил InternetReadFileExA, получил данные - как дать знать пользовательскому коду что ф-я отработала?
     
  5. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    не поделитесь паблик сорсом подмены странички под IE? а то сталкиваюсь с некоторыми стихийными и непонятными проблемами, стремясь вывести себя в лидеры гугла =)
     
  6. x0man

    x0man New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2008
    Сообщения:
    358
    Сам разберись, потом будет легче.
     
  7. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    Да свои наработки есть, но работает оно через раз по непонятной причине. Заценить бы чужие разработки.
     
  8. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    А почему может возникать такая проблема - пишу функцию - заменитель InternetQueryDataAvailable, в ней читаю всю страничку при первом её вызове, возвращаю как доступно весь размер странички. Но после этого хендл этот закрывается, а мне выводится dnserror.htm. InternetReadFile даже не вызывается.
     
  9. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    ау, народ, дайте хоть самую убогую подмену странички, застрял на месте. Стабильность на нуле =(
     
  10. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Выкладывайте свой -- может у кого-то будет желание посмотреть\проверить
     
  11. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    Freecod
    Перехватывай WSARecv проблем никаких не будет, а если ещё и внимательно посмотришь на неё под дизасмом перехватишь незаметно для rku/gmer.
     
  12. dendi

    dendi New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    233
    проблемы будут только с https
     
  13. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    В функции - переходнике IQDA
    Код (Text):
    1.     std::string page="";
    2.  
    3.     //Sleep(1000);
    4.     DWORD dwSize = 0, dwReadPtr = 0, lpBytesAvailable = 0;
    5.     char * buff = NULL;
    6.  
    7.     while (true)
    8.     {
    9.         bool ret = OrInternetQueryDataAvailableA(hFile, &lpBytesAvailable, NULL, NULL);
    10.         if (ret)
    11.         {
    12.             buff = (char *)LocalAlloc(GMEM_FIXED | LMEM_ZEROINIT, lpBytesAvailable+1);
    13.             if (!OrInternetReadFile(hFile, buff, lpBytesAvailable, &dwSize))
    14.             {
    15.                 LocalFree(buff);
    16.                 MessageBox(0, "InternetReadFile", "IRF", 0);
    17.                 return false;
    18.             }
    19.  
    20.             if (dwSize == 0)
    21.             {
    22.                 LocalFree(buff);
    23.                 break;
    24.             }
    25.  
    26.             buff[dwSize] = 0x00;
    27.             page += buff;
    28.             dwReadPtr += dwSize;
    29.             LocalFree(buff);
    30.         }
    31.     }
    32.         ...
    33.         dwPgSize = page.size();
    34.         *lpdwNumberOfBytesAvailable = dwPgSize;
    35.         return 1;
    По логике должно работать. Не работает. Страницу читает, размер возвращает. dnserror.htm в итоге
    Если снять коммент со Sleep в начале - некоторые страницы робит нормально. Некоторые - опять dnserr
    Вызывается IQDA, возвращается размер прочитанной страницы (всей) и true, - после этого след. вызов InternetCloseHandle, закрывает мой хендл и на ошибку.
     
  14. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Freecod
    ИМХО, какой код -- так и работает :derisive: Вообще в идеале надо выдавать минимальный код, к-рый можно собрать и запустить (а стало быть и отладить). А здесь какой-то ошметок хз чего. std::string а значит что код в отдельной dll? У меня просто все хуки сплайсенгом устанавливаются, не могу позволить такую роскошь ;). Далнее, зачем вообще ставить Sleep'ы в обработчик функций? Потом, если уж используешь С++, то вместо LocalAlloc/LocalFree предпочтительней использовать std::vector, что-то вроде std::vector<char> v(lpBytesAvailable + 1); InternetReadFile(hFile, &v[0], lpBytesAvailable, &dwSize); std::string page(&v[0]); Также, некошерно втыкать в обработчики MessageBox'ы (скока раз уж об этом талдычили), если уж так хочется делать OutputDebugString и смотри в DebugView. + в прототипе функции стоит BOOL, а значит и обработчик должен возращать FALSE/TRUE, а не false/1. Ну а ошибка конечно же в ... :)

    P.S. Никогда не перехватывал InternetQueryDataAvailable, есть предположение: написать тестовую программу к-рая будет скачивать файл с помощью wininet'a и посмотреть что будет если между 2мя вызовами сабжа сделать InternetReadFile.

    P.S.1. Попробовал делать хук на subj, все ловится, но пораждает глюки. Соб-но а зачем её хукать?
     
  15. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    Хорошо. Чхать на InternetReadFile и IQDA. Что использует IE НАД ними? То есть что он наверняка ипользует ещё одну апи что бы получить всю страницу целиком.
     
  16. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
  17. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    там инфа только как перехватить... Чтож, не судьба тут помощи найти.
     
  18. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    я ж тебе сказал что лучше всего перехватывать, и не обязательно что б функция получала всю страницу целиком это можно и вручную сделать.
     
  19. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    > и не обязательно всю страницу целиком это можно и вручную сделать.

    Как предлагаешь это сделать? Проверять каждый "Кусочек" на нужные данные? а если они будут "разрезанны"?
     
  20. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    WSARecv - читал мсдн так и не вник - это прямой аналог recv?