какой мудень написал такой дров, который грузит длл прозрачно от загрузчика и дажэ не возращает вызывающему коду базу её загрузки?
HMODULE дров возвращает, только GetProcAddres мне 0 возвращает при попытке получить экспортные функции с загруженной дровом длл) --- Сообщение объединено, 18 ноя 2019 --- Не получается у меня взять адрес функции класса в длл мейн крч безнадежен я походу..
Если надо, для x32 весьма которкая функа поиска функций по именам и базе модуля уже запиленная в виде числового массива, только пара аргументов передается через регистры, что впрочем не мешает при х32 сделать ассемблерную вставку и оформить функцию в виде hex-массива Код (ASM): ;##################################################### NTDLL_BASE equ 0b KERNEL_BASE equ 1b FIND_ADDR equ 00b FIND_SERVICE equ 10b SEARCH_HASH equ 000b SEARCH_NAME equ 100b LIB_NAME equ 2 END_IMPORT_TABLE equ -1 FindAddrFunc: ; find_flag:dword, ;base_image - edx ; eax - hash or name ; поиск номера сервиса в нтдлл или адреса функи в ; нтдлл или кернел32 ; по хешу имени функи или по имени функи ; или же поиск оной же буйни по базе имиджа ;------------------------------------------------- ; in: ; dword(find_flag): ; 0 - ntdll base ; 1 - kernel32 base ; 00 - addr func ; 10 - No service (ntdll base) ; 000 - hash find (edi - hash) ; 100 - name find (edi - offset name) ; edi - hash func or offset ; dword(base_image): ; address base of image dll to search or NULL ; out: ; eax - addr func or number of service ;##################################################### --------РЕЗАТЬ ЗДЕСЬ------- Код (ASM): FindAddrFunc: db 00bh, 0c0h, 00fh, 084h, 0ach, 000h, 000h, 000h, 060h, 033h, 0ffh, 087h, 07ch, 024h, 01ch, 092h db 00bh, 0c0h, 075h, 01eh, 064h, 0ffh, 035h, 030h, 000h, 000h, 000h, 058h, 08bh, 040h, 00ch, 08bh db 070h, 00ch, 0adh, 08bh, 070h, 018h, 096h, 0f6h, 044h, 024h, 024h, 001h, 074h, 004h, 0adh, 08bh db 040h, 018h, 08bh, 0d8h, 08bh, 040h, 03ch, 003h, 0c3h, 08bh, 040h, 078h, 003h, 0c3h, 08bh, 048h db 014h, 08dh, 050h, 01ch, 08bh, 070h, 020h, 003h, 0f3h, 08bh, 068h, 010h, 0adh, 003h, 0c3h, 056h db 052h, 033h, 0d2h, 096h, 0f6h, 044h, 024h, 02ch, 004h, 074h, 017h, 092h, 057h, 040h, 080h, 03ch db 006h, 000h, 075h, 0f9h, 040h, 091h, 0f3h, 0a6h, 05fh, 091h, 00bh, 0c0h, 075h, 002h, 08bh, 0d7h db 0ebh, 012h, 0f8h, 0ach, 002h, 0d0h, 0c1h, 0c2h, 004h, 081h, 0f2h, 046h, 075h, 043h, 06bh, 080h db 03eh, 000h, 075h, 0efh, 092h, 05ah, 05eh, 03bh, 0c7h, 075h, 021h, 08bh, 042h, 008h, 003h, 0c3h db 02bh, 06ah, 0f4h, 066h, 08bh, 02ch, 068h, 08bh, 002h, 003h, 0c3h, 08bh, 004h, 0a8h, 003h, 0c3h db 0f6h, 044h, 024h, 024h, 002h, 074h, 003h, 08bh, 040h, 001h, 0ebh, 003h, 045h, 0e2h, 09dh, 087h db 044h, 024h, 01ch, 061h, 0c2h, 004h, 000h --------РЕЗАТЬ ЗДЕСЬ------- пример вызова: Код (ASM): msg db "MessageBoxA",0 load db "LoadLibraryA",0 user db "user32.dll",0 start: mov eax,offset load xor edx,edx push KERNEL_BASE or FIND_ADDR or SEARCH_NAME call FindAddrFunc push offset user call eax xchg edx,eax ; edx = hModule mov eax,offset msg ; eax = funk name push FIND_ADDR or SEARCH_NAME ; стековый аргумент функции флаги call FindAddrFunc ret end start
RamMerLabs, > можно назначить фиксированный ординал нужной функции и искать по номеру, а не по имени. О чём вы говорите, экспорт происходит по имени всегда. Номера не используются в нт. TrashGen, > в коде этой библиотеки и всё сделают релоки Бред. У тс есть дров, он инжектит в процесс стаб(не ясно какой), далее он запускает плюсовую нагрузку. Пытается вызвать загрузочные апи и они фейлят, так как модуля нет. Толку от твоего указателя, если модуля в базах нет. --- Сообщение объединено, 18 ноя 2019 --- TrashGen, > db 00bh, 0c0h, Ему на скрипте нужно, а не нэйтив.
Как функция экспортируется? Адрес должен браться чем-то типа void* p = (void*)MyClass::MyMethod, если он не приватный, не виртуальный и не инлайновый.
ormoulu, Может проще адрес возврата взять и выровнить поинтер на границу, 64к это гранулярность для модулей ?
было есчо и FindAddrFunc64, но увы, не найдено ужэ, да ине нужно ужэ тожэ (мне, например) Indy_, а чо дров грузя библиотеку буттобы релоки не фиксит шоле от базы? ну там не то вобщемта надо короч в дллмейне кинуть куданить в разделяемую память, в пайп или есчо хз куда указатель на структуру с адресами нужных из либы функций, а адреса этих функций записать в структуру (все это заебенить в глобальных переменных той же библиотеки) в том же дллмейне. вопрос только чем передать это в процесс там способов должно быть куда больше двух-трех
Вообще не очень понятно, что именно ТС нужно и как эту функцию планируется вызывать. В процессе уже существует какая-то функциональность, существующий код пытается найти процедуру через GetModuleHandle/GetProcAddress и обламывается? Или что.
да. паходу он в процессе перехватовает GetProcAddress и в перехватчике ему нужно найти адреса из либы, гружонной дровом --- Сообщение объединено, 18 ноя 2019 --- под х32 кодес там выше могу перепилить его в сишный вид с передачей параметров в стеке, только незнаю зачем мне это нужно^^
TrashGen, > грузя библиотеку буттобы релоки не фиксит шоле от базы? Нет по описанию тс следует что есть некий стаб, который подтягивает окружение. > короч в дллмейне кинуть куданить в разделяемую память Он купил решение и не может внести изменения, в то что есть. Ему парсер экспорта нужен на плюсах, зачем усложнять. ТС лень искать в гугле, мне тоже, это его трудности.
Тогда сканить память на предмет наличия либы, или в DllMain получать адрес и сохранять куда-то в Tls, что-то в этом роде. А длл не может повторно сама себя загрузить уже традиционным способом? --- Сообщение объединено, 18 ноя 2019 --- Ну да вобщем-то, старый надежный способ. Придется чутка покопаться.
sanny , говорите короч где воще работает именно ВАШ КОД В КОТОРОМ ВСЁ ПРОИСХОДИТ в перехвате GetProcAddress, вызываемой основным модулем программы? чем вы ставите перехват? где находится код перехватчика?
ormoulu, > А длл не может повторно сама себя загрузить уже традиционным способом? Нет. Есть куча проверок в загрузчике, главная в виде ядерного сервиса NtAreMappedFilesTheSame - он проверяет два поинтера на один файл.
Indy_, но вы же не знаете КАК дров грузит либу. А то действительно было бы проще загрузить повторно найти адреса стандартным способом и найти разность баз загрузки --- Сообщение объединено, 18 ноя 2019 --- как то, наверное, так addrFunc = ((GetProcAddress(LoadLibrary("ololo.dll"),"func_name")-hModule); /где hModule-значение которое возращает дров для загруженной им ololo.dll
Наверно не совсем понятно что я имел в виду без примеров кода. Давайте сначала. Экспортные функции моего класса: Код (C): // UnrealScript intrinsics. #define DECLARE_FUNCTION(func) void func( FFrame& TheStack, RESULT_DECL ); class NEWAGE_API UNewAgeAPI : public UObject { public: DECLARE_FUNCTION(execSetScItem); } Когда я внедряю длл в процесс - он запускает цепочку своих функций которые в конечном итоге сходятся сюда: Код (C): void* UPackage::GetDllExport( const TCHAR* ExportName, UBOOL Checked ) { guard(UPackage::GetDllExport); void* Result; #if !__STATIC_LINK if( !DllHandle ) { if( Checked && !ParseParam(appCmdLine(),TEXT("nobind")) ) appErrorf( LocalizeError(TEXT("NotDll"),TEXT("Core")), GetName(), ExportName ); Result = NULL; } else #endif { #if __STATIC_LINK Result = FindNative( (TCHAR*) ExportName ); #else Result = appGetDllExport( DllHandle, ExportName ); #endif if( !Result && Checked && !ParseParam(appCmdLine(),TEXT("nobind")) ) appErrorf( LocalizeError(TEXT("NotInDll"),TEXT("Core")), ExportName, GetName() ); if( Result ) debugfSlow( NAME_DevBind, TEXT("Found %s in %s%s"), ExportName, GetName(), DLLEXT ); } return Result; unguard; } вызывается в итоге этот участок: Result = appGetDllExport( DllHandle, ExportName ); Код (C): // // Lookup the address of a DLL function. // CORE_API void* appGetDllExport( void* DllHandle, const TCHAR* ProcName ) { guard(appGetDllExport); check(DllHandle); check(ProcName); #ifdef _XBOX return NULL; #else return (void*)GetProcAddress( (HMODULE)DllHandle, TCHAR_TO_ANSI(ProcName) ); #endif unguard; } Итог: Когда я длл внедряю самым обычным способом (или даже подтянуть LoadLibrary) - все работает, Result = appGetDllExport( DllHandle, ExportName ) - результат получен функция работает. Когда я внедряю дровом - Result = appGetDllExport( DllHandle, ExportName ) - Result == NULL и соответственно error.
перед #else return (void*)GetProcAddress( (HMODULE)DllHandle, TCHAR_TO_ANSI(ProcName) ); #endif попробуйте загрузить длл еще раз с помощью LoadLibrary если загрузится, то находите смещение функции (адрес функции минус база загруженной либы) и прибавляйте его к адресу базы, которую возвращает драйвер
Функцию void* UPackage::GetDllExport( const TCHAR* ExportName, UBOOL Checked ) я хукнул у себя в длл (которую внедряю) и мог бы в Result передать адрес своей функции например, но как? --- Сообщение объединено, 18 ноя 2019 --- Меня тогда защита процесса пошлет в лес