Долой импорт! Николай «GorluM» Андреев Хакер, номер #080, стр. 080-116-3 Запуск MessageBox'а с такой функцией преобразиться следующим образом: ... HMODULE hKernel32 = GetKernel(); tLoadLibraryA pLoadLibraryA = GetProcAddressEx (hKernel32, 0xC8AC8026); HMODULE hUser32 = pLoadLibraryA ("user32.dll"); tMessageBox pMessageBox = GetProcAddressEx (hUser32, 0xABBC680D); ... Much better, теперь имена функций нигде в программе не фигурируют. Но черт! Так невозможно программировать! Уж лучше все знают, как моя программа работает. Ведь надо считать для каждой функции хэш, подставлять по мере необходимости, заного описывать каждую API. В общем, я как обычно придумал кучу проблем, чтобы с ней разобраться. [удобный интерфейс] Первое, от чего я хочу избавиться, так это от бесконечных определений функций. Всех этих typedef'ов кошмарных и т.п. Сделать это оказалось на удивление легко. Я просто создал несколько перегруженных шаблонов функций, которые в общей сложности могли принимать любое число параметров. И для выполнения нужной функции передавал шаблону хэш, хэндл модуля и аргументы. Все. Определять при этом каждую API не нужно, знай себе юзай шаблоны для ВСЕГО. Этакие гейты для API. Можно в них встроить какую-нибудь систему логирования, чтобы видеть все вызовы своей программы. Можно какой-нибудь время от времени срабатывающий антиотладочный прием поставить. Гейт для API в своей программе - полезная штука. В качестве препятствия анализу - особенно. Шаблоны выглядят так: // для функции без аргументов, к примеру GetTickCount template <HMODULE h, DWORD hash> inline LPVOID pushargEx() { typedef LPVOID (WINAPI *newfunc)(); newfunc func = (newfunc)GetProcAddressEx(h, hash); return func(); } // для функции с одним аргументом template <HMODULE h, DWORD hash, class A> inline LPVOID pushargEx(A a1) { typedef LPVOID (WINAPI *newfunc)(A); newfunc func = (newfunc)GetProcAddressEx(h, hash); return func(a1); } // для функции с двумя аргументами template <HMODULE h, DWORD hash, class A, class B> inline LPVOID pushargEx(A a1, B a2) { typedef LPVOID (WINAPI *newfunc)(A, B); newfunc func = (newfunc)GetProcAddressEx(h, hash); return func(a1,a2); } // для функции с тремя аргументами template <HMODULE h, DWORD hash, class A, class B, class C> inline LPVOID pushargEx(A a1, B a2, C a3) { typedef LPVOID (WINAPI *newfunc)(A, B, C); newfunc func = (newfunc)GetProcAddressEx(h, hash); return func(a1,a2,a3); } // и т.д. Соответственно, вызов функции через них может выглядеть следующим образом: // вызовем, например, Sleep с аргументом - // 1000, то есть одна секунда // kernel32 - хэндл ядра, вычисленный ранее pushargEx<kernel32, 0x3D9972F5>(1000); Просто, неправда ли? Однако по-прежнему смущают хэши, которые надо вычислять для каждой функции. Для того, чтобы не приходилось заниматься еще и этим геморроем, я написал отдельную маленькую утилиту, которая вычисляет хэши и создает h-файл со специальным определением всех функций в заданной dll. Она вместе с сорцами лежит на диске. Пользоваться ей очень легко, пишешь calchash user32.dll, она тебе выдает файл user32.dll.h с содержанием вроде такого: |