Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
crowman2
0 / 0 / 0
Регистрация: 26.01.2015
Сообщений: 5
1

Перехват API winsock32.recv - под отладчиком работает 100%, без отладчика - 50%

26.01.2015, 16:52. Просмотров 1047. Ответов 5
Метки нет (Все метки)

Добрый день, уважаемые Киберчане. Прошу Вашей поддрежки.

Описание проблемы.

Вызов функции CreateFileA, для записи буфера переданного Wsock32.Recv, препятствует нормальной работе браузера FireFox - нормально грузится только 50% страниц.

Что делаю.

Ничего нового и сверхестественного - всё как по школьному учебнику:
1. Внедряем свою DLL в процесс FireFox.
2. Редактируем импорт "nss3.dll" - подменяем оригинальный вызов Wsock32.Recv своей функцией WSock32_recv.
3. В своей функции вызываем оригинал Wsock32.Recv.
4. Записываем полученный буфер с данными в файл.
5. Возвращаемся к вызывавшему коду.

Что происходит в процессе:

1. Если код нашей функции трейсим под отладчиком - все страницы загружаются 100%.
2. Если мы трейсим код с бряком на Wsock32.Recv (оригинал вызывается из моей функции уже) по Run тоже всё грузится 100%.
2. Как только функция в свободном плавании - часть страниц перестаёт загружаться. Лог, куда пишется буфер, показывает,что данные просто не приходят.
3. Если мы убираем (читай - нопим) CreateFileA, а ставим (или не ставим) любую другую (MBox например, кроме оберток для CreateFileA) - то всё сразу начинает грузиться.

Вопрос:
В какую сторону копать? Можно меня пнуть.

Мои версии следующие:
Это происходит из за синхронизации потоков. Только пока не могу понять каких и почему. Отладчик же брейкает все потоки.

P.S. Код DLL и инжектора приложил. Результат VirusTotal тоже.
0
Миниатюры
Перехват API winsock32.recv - под отладчиком работает 100%, без отладчика - 50%   Перехват API winsock32.recv - под отладчиком работает 100%, без отладчика - 50%  
Вложения
Тип файла: zip Injector.zip (851.9 Кб, 5 просмотров)
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2015, 16:52
Ответы с готовыми решениями:

Запуск программ под отладчиком
Уважаемые форумчане, подскажите новичку, как запускать программу под...

Программа под отладчиком работает не так как без отладчика. Магия?
Ситуёвина такова, что прога правильно работает под отладчиком, но неправильно...

Программа без отладчика и с ним работает по-разному
Здравствуйте. Помогите разобраться со следующей проблемой: Програмка на...

recv - постоянно возвращает -1 (на c под api) все работало
recv - постоянно возвращает -1 (на c под api) все работало. пытаюсь...

Свойство HPageBreaks.Count работает только под отладчиком
Ситуация такая. Где-то на листе есть несколько заполненных строк. Надо их...

5
crowman2
0 / 0 / 0
Регистрация: 26.01.2015
Сообщений: 5
26.01.2015, 17:04  [ТС] 2
Не нашёл как тему отредактировать.
Вот код функции, где CreateFileA, которая препятствует нормальной работе.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
WSock32_recv    proc s, pBuf, len2, flags: DWORD
    
    LOCAL hFile, hSockBuf, rcBuf:   DWORD
    
    invoke recv, s, pBuf, len2, flags
    
    pusha   
    
    mov rcBuf, eax  
    .IF len2 > 1000h        
        
        invoke CreateFile, addr LogfileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
        mov hFile, eax      
        invoke SetFilePointer, hFile, NULL, NULL, FILE_END
        mov eax, rcBuf
        invoke WriteFile, hFile, pBuf, rcBuf, addr NumberOfBytesWritten, NULL
        invoke WriteFile, hFile, addr Frm1, 4, addr NumberOfBytesWritten, NULL  
        invoke CloseHandle, hFile 
    .endif
    
    popa
    
    ret
 
WSock32_recv endp
0
Убежденный
Ушел с форума
Эксперт С++
16137 / 7284 / 1182
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
26.01.2015, 17:13 3
Лучший ответ Сообщение было отмечено crowman2 как решение

Решение

Во-первых, непонятно, почему запись в файл выполняется только при "len2 > 1000h".
Во-вторых: Вы уверены, что firefox не использует nonblocking или overlapped I/O ?
Ведь в этом случае recv может вернуть управление задолго до того, как что-то
будет записано в буфер и звать WriteFile прямо в обработчике нет смысла...
1
Charles Kludge
Клюг
7646 / 3161 / 383
Регистрация: 03.05.2011
Сообщений: 8,382
26.01.2015, 19:19 4
Попробуйте использовать fopen/fseek/fwrite/fclose из msvcrt.dll. В масме они все с префиксом crt_ .
0
crowman2
0 / 0 / 0
Регистрация: 26.01.2015
Сообщений: 5
26.01.2015, 21:22  [ТС] 5
Во-первых, непонятно, почему запись в файл выполняется только при "len2 > 1000h".
Убежденный,
благодарю. Натолкнули на мысль все переменные проверить.

В MSDN не нашёл, что recv может возвращать -1 (нет этих констант), а также что "len" (её переменная) может -1 принимать (зачем???). Когда у меня выполнялась функция WriteFileA, мы пытались писать в файл 0xFFFFFFFh байт, а это "многовато" и когда память заканчивалась функция "улетала".

Очень странно, что эксепшенов не было никаких (видимо стандартным SEH ловились.. но отладчик их не показал??)

Решение (изменил условие записи):

...
.IF (eax) && (len2 != -1) && (eax != -1) && (len2)
...
А пишем при len2>1000h, т.к. там мусор иначе принимается вида: "88 888"
0
Убежденный
Ушел с форума
Эксперт С++
16137 / 7284 / 1182
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
26.01.2015, 22:29 6
Цитата Сообщение от crowman2 Посмотреть сообщение
В MSDN не нашёл, что recv может возвращать -1 (нет этих констант), а также что "len" (её переменная) может -1 принимать (зачем???)
Функция recv возвращает количество прочитанных байт, которое может
быть либо равно, либо меньше, чем размер принимающего буфера.
Она может вернуть 0, если на той стороне соединения вызвали shutdown(SD_SEND).
И еще она может вернуть -1, что обычно означает ошибку. В случае с
асинхронными сокетами, если после "recv==-1" функция WSAGetLastError
возвращает WSA_IO_PENDING, это значит, что операция ввода-вывода началась.
Короче, что я тут распинаюсь, лучше почитайте "программирование в
сетях Windows", там все эти темы с сокетами хорошо расписаны.

Цитата Сообщение от crowman2 Посмотреть сообщение
Очень странно, что эксепшенов не было никаких
Для кода, в котором возможные отказы тупо игнорируются, ничего странного.
Скорее всего, WriteFile просто возвращала ошибку. Но здесь это не проверяется.

Цитата Сообщение от crowman2 Посмотреть сообщение
А пишем при len2>1000h, т.к. там мусор иначе принимается вида: "88 888"
Выглядит как еще один костыль, выросший из неправильной схемы
работы с сокетами.
0
26.01.2015, 22:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2015, 22:29

recv (socket api)
при первом в хождении в цикл рекв возвращает как положено количество принятых...

Приложение крашится под отладчиком
при запуске без отладчика из-под креатора - работает замечательно. как только...

Без отладчика и опыта
Всем привет. Устроился тут в контору, делают довольно простые "коробочки" для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru