Проблемы с InternetReadFile

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

  1. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Freecod
    :) 4 + 2 дополнительных перехвата хватает, чтобы сделать подмену страницы (проверенно на Opera/IE/FireFox/Safari, Google Chrome тока не проверял -- нет его у меня)
     
  2. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    Хм. а хотя бы какие функции перехватывать-то?
     
  3. Freecod

    Freecod New Member

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

    Предположим мне во всех страницах нужно заменить 'hello' на 'lol'
    В подмене InternetQueryDataAvailable вышепреведённым циклом читаю всю страницу. Возвращаю true и весь размер изменённой страницы.
    В изм. InternetReadFile отдаю страничку из своего буфера.

    Проблема: выводит стандартную страницу ошибки dnserror.htm. Хотя по логике должно работать.
    Внимание, чудеса. Если перед циклом чтения странички воткнуть Sleep на пару секунд, всё работает как надо!
    Естественно, чудес мне не надо.

    PS Если есть замечания по делу и желание помочь - пожалуйста. " =P а у меня есть, но не скажу" - не надо.
     
  4. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    Проверять данные на "HTTP 1.1" или как там в заголовке, если оно - выделяем буффер читаем туда с помощью той же WSARecv в цикле пока ReturnedBytes != 0, когда прочитали фиксим как нам хочется и возвращаем управление, проблем быть не должно. Но тут ещё есть несколько незначительных тонкостей и одна значительная.

    Когда-то я реализовывал, но у меня этого не было, просто парсился буффер на сигнатуру, но и задача была другая - перехватить незаметно любую функцию в ws2_32.
     
  5. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    хм. Вообщем как я понял в любом случае прийдётся хучить WSARecv, а по хорошему ещё и send. И парсить заголовки на предмет нужных данных. Но какие функции всё-таки брать для большего кол-ва браузеров - WSARecv \ WSASend или recv \ send ?
     
  6. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    WSARecv / send
    А вообще есть такая хорошая штука отладчик называется.
     
  7. djmans

    djmans New Member

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

    А вообще есть такая хорошая штука отладчик называется, она помогает разрулить все "чудеса".
     
  8. Selah

    Selah New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2007
    Сообщения:
    258
    нах тот отладчик) запарили уже, что ты там увидишь?

    по теме: для оперы надо хукать WSARecv/WSASend, для ослика WSARecv/send , а в лисе зависит от версии (может путаю)

    процедура обработки должна быть в потоке

    function New_WSA_Recv(......
    ...
    hThread:=beginthread(nil,0,@Parser,pointer(data),0,id);
    WaitForSingleObject(hThread, INFINITE);
    Result:=True_WSA_Recv(.....
    ....
     
  9. barton

    barton New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2008
    Сообщения:
    164
    Адрес:
    Czechoslovakia
    ТС, ты хочешь, чтоб тебе по-резкому обьяснили как написать очередного бота системного уровня с ХТМЛ инжектами в ИЕ ?)
    Я лишь могу тебе сказать, что твоих двух функций перехваченых недостаточно 100% и что заниматься сексом с мозгами придется ещё очень и очень долго, если вопросы "что такое std::string" имели место

    не забудь про msdn, кстати. IE работает в асинхронном режиме, причем ещё и не всегда.
    так же лучше посмотреть доки про InternetSetStatusCallback

    насчет Recv - дык а https не нужен?
     
  10. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    > ТС, ты хочешь, чтоб тебе по-резкому обьяснили как написать очередного бота системного уровня с ХТМЛ инжектами в ИЕ ?)

    Т.к. очередной, можно и резко =) Не мега 0дей же.

    В отладчике смотренно, но наблюдение не из простых - прервались на irf, вывалились по рет, тут снова пару pop и снова реты, реты, реты. пока не вывалимся хз пойми куда и в стеке у нас уже dnserror.htm.

    > процедура обработки должна быть в потоке
    почему?

    > IE работает в асинхронном режиме, причем ещё и не всегда.
    Вот про это вы где узнали? рыл интернет в поисках хоть какой нибудь инфы по внутренностям ie - ничего не нашёл.
    Т.е. все функции InternetReadFile, InternetConnection, итп - работают асинхронно, несмотря на то, что они не *Ex?
    Проясните этот момент или пихните куда смотреть. мсдн большой =(
    И оч. интересно - как повлиял sleep на асинхронное выполнение? Чем он помог-то?

    > а https не нужен?
    Как я понимаю - "выше" WSRecv общих для всех браузеров api нет и нужно извращаться?

    UPD: Ну подкинте идею! Понял что работать нужно именно с InternetSetStatusCallback (один ботнег в описании на kav её хучит =)), но как - не пойму. Он в начале сессии ставит калбек на свою функцию. Если не дать поставить - вернуть из захученой функции 0 - просто замерзаем, пустая страница.
     
  11. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    Нет, что за нафиг? Читаю страницу через
    Код (Text):
    1. INTERNET_BUFFERS lpBuffersOut;
    2. lpBuffersOut.dwStructSize = sizeof(INTERNET_BUFFERS);
    3. lpBuffersOut.dwHeadersLength = 255;
    4. lpBuffersOut.dwBufferLength = 1000000;
    5. lpBuffersOut.dwBufferTotal = 0;
    6. lpBuffersOut.lpvBuffer = (char *)LocalAlloc(GMEM_FIXED | LMEM_ZEROINIT, lpBuffersOut.dwBufferLength+1);
    7.  
    8. InternetReadFileExA(hFile, &lpBuffersOut, IRF_SYNC, 1);
    Вроде как он должен не возвращать управление пока не прочитает всё, но на деле читает около 30000 байт за раз и вываливается.
    Но даже если в асинхронном - как установить калбэк функцию для неё (не для всей wininet)?
     
  12. lamer2k

    lamer2k New Member

    Публикаций:
    0
    Регистрация:
    14 май 2006
    Сообщения:
    88
    Качай kerberos перехватывай эти функции в IE смотри как это работает, а вообще рановато ИМХО ты кинулся в "быдлкодинг". В мсдн все написанно, как работать в асинхронном режиме, даже есть полноценный исодник. На крайний случай загляни в исходники wininet :)
     
  13. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    =\ Если быдлокодинг это использование ф-й от MS - я согласен. В мсдн-не о IRFEx написано ровно одно - какие типы у переменных.
     
  14. barton

    barton New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2008
    Сообщения:
    164
    Адрес:
    Czechoslovakia
    всымсле?... ну как бы там явно видно, что InternetOpen вызывается с INTERNET_FLAG_ASYNC)
    sleep тебе помог тем, что где-то какой-то баг просто не сработал)) забей)
    InternetReadFile работает точно так же асинхронно в ие как и InternetReadFileExA/W


    Только к сожалению ИЕ работает не везде так, как написано в МСДН.

    точно, а какое может АПИ выше то?

    колбек функция ставится для всей Internet session (это то, что создает ИнторнетОпен) через InternetSetStatusCallback

    если вернула 0 и GetLasterr == ERROR_IO_PENDING, то значит жди INTERNET_STATUS_REQUEST_COMPLETE в перехваченом колбеке. иначе читай. но перед этим надо делать InternetQueryDataAvailable. Она так же - если вернула TRUE, то можешь читать возвращенное кол-во байт, если не тру - то ждать request complete.
    кстати это я все руками изучал отладчиком в ИЕ, в мсдне помоему хер вообще что поймешь)

    Угу и разницы нет (в контексте про ИЕ) между IRF и IRFEX[A/W]

    а ещё тебе придется думать то таблицы хендлов, сжатие, кеширование winInet'а, прокси, редиректы итд...
    и там все не менее весело и прикольно )
     
  15. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    да там гемороя немерено, самое главное правильно понять как работает вининет в ансихроне, мне это удалось раза с 4-го :/