Реферат: API Spying

// Вызвана перехваченная функция

case WM_CALLED:

// Увеличиваем количество вызовов

functions[wParam].count++;

printf("Called %s\n", functions[wParam].name.c_str());

return 0;

// Не удалось установиь перехватчик на функцию

case WM_CANNOTHOOK:

// Уведомляемпользователя

printf("Can not hook %s\n", functions[wParam].name.c_str());

return 0;

}

return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

ПРИМЕЧАНИЕ

Для простоты этот код не проверяет имя функции на уникальность, поэтому в functions может оказаться несколько записей для одной и той же функции.

Внедрение в приложение и перехват GetProcAddress

Так как эта статья не посвящена ни перехвату, ни внедрению (на эти темы есть много других хороших статей), для реализации выбраны простые, но радикальные средства. Внедрение сделано через CreateRemoteThread, а перехват GetProcAddress – заменой её первых пяти байт на команду jmp.

Для передачи внедрённой dll описателя окна, которому она должна посылать сообщения (g_hSecretWindow в примере), использована техника из статьи «HOWTO: Вызов функции в другом процессе».

Чем же всё это закончится?

Будет завершение процесса. Как известно, во время завершения процесса все dll выгружаются, и вся выделенная память освобождается. При этом могут произойти следующие неприятности:

Наша dll будет выгружена раньше времени.

Раньше времени будет освобождена память, в которой расположены сгенерированные функции.

В обоих случаях исследуемое приложение получит Access Violation, после чего говорить о том, что его работа не нарушена, будет достаточно сложно.

Невыгружаемая dll

Поскольку у нашей dll счётчик ссылок всегда больше 0 (LoadLibrary была вызвана, а FreeLibrary нет), она выгружается одной из последних, но в некоторых случаях этого может оказаться недостаточно. Радикальным решением проблемы является «ручная» загрузка dll, описанная в статье Максима М. Гумерова «Загрузчик PE-файлов». Это довольно трудоёмкий, но зато практически гарантированный вариант. Другим возможным решением (для NT/2000/…) может быть удаление dll из списка загруженных модулей в PEB, но как это сделать и будет ли это работать, я пока не знаю…

Последняя идея, пришедшая мне в голову:

честно загрузить dll в процесс, позволить загрузчику выполнить свою работу

скопировать получившийся образ

К-во Просмотров: 1001
Бесплатно скачать Реферат: API Spying