Код (Text): #include <windows.h> DWORD GetProcAddress( HMODULE module, char* function ) { PIMAGE_DOS_HEADER dos_header = NULL; PIMAGE_NT_HEADERS nt_header = NULL; PIMAGE_EXPORT_DIRECTORY export = NULL; FARPROC* export_addr_table = NULL; char** export_name_table = NULL; WORD* export_ord_table = NULL; char* name = NULL; DWORD return_addr = 0; int i = 0; if( !module || !function ) return NULL; dos_header = static_cast<PIMAGE_DOS_HEADER>( (void*)module ); if( dos_header->e_magic == IMAGE_DOS_SIGNATURE && dos_header->e_lfanew != NULL ) { nt_header = reinterpret_cast<PIMAGE_NT_HEADERS>( (DWORD)module + dos_header->e_lfanew ); if( nt_header->Signature == IMAGE_NT_SIGNATURE && nt_header->FileHeader.Machine == IMAGE_FILE_MACHINE_I386 ) { export = reinterpret_cast<PIMAGE_EXPORT_DIRECTORY>( (DWORD)module + nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress ); export_addr_table = (FARPROC*)( (DWORD)module + export->AddressOfFunctions ); export_name_table = (char**)( (DWORD)module + export->AddressOfNames ); export_ord_table = (WORD*)( (DWORD)module + export->AddressOfNameOrdinals ); for(i = 0; i < export->NumberOfNames; ++i) { name = (char*)( (DWORD)module + export_name_table[i] ); if( !strcmp(name, function) ) { return_addr = (DWORD)module + (DWORD)export_addr_table[export_ord_table[i]]; break; } } } } return return_addr; }
sanny, отладчиком пользуетесь? Передайте хендл вашей загруженной длл в хук и посмотрите, что за адрес туда передался и что лежит по этому адресу. Если все хорошо, там должен быть PE заголовок, вот такой:
TrashGen, Can't find 'intUNewAgeAPIexecOnEventCustom' in 'NewAge.dll' --- Сообщение объединено, 18 ноя 2019 --- Thetrik, void execLogin( FFrame& TheStack, RESULT_DECL );
эта функцыя должна быть той, код которой в начале страницы. вы её хоть переименуйте, мож она из krnl32 дергается, я хз. ставьте брейкпоинт после неё, или вы воще без отладчика?
Блин, а код хука-то лежит тоже в той же загруженной либе? Или нет? Result = (void*)(UNewAgeApi::execLogin) не компилится? Какая ошибка?
TrashGen, переименовал, сути не поменяла, ошибка даже, возвращает NULL.. крч я задолбался уже 4 дня с этой хренью возится. пойду извращаться в другом месте и насиловать двигло немного по-другому --- Сообщение объединено, 18 ноя 2019 --- ormoulu, да, в той же. Error 13 error C2440: 'type cast' : cannot convert from 'void (__thiscall UNewAgeAPI::* )(FFrame &,void *const )' to 'void *'
ЗАЧЕМ НУЖЕН ХУК ФУНКЦИИ В СВОЁМ ЖЕ МОДУЛЕ? --- Сообщение объединено, 18 ноя 2019 --- result = &execLogin не? --- Сообщение объединено, 18 ноя 2019 --- или чо там? result = &intUNewAgeAPIexecOnEventCustom
Просто оберни вызов обычной функцией и возвращай его. Нельзя скастовать указатель на мкембер к обычному указателю на функцию.
ormoulu, это такая замануха ядрёная, только всё начинает проясняться, как оказываеццо, что ничего непонянтно, а потом обнаружываеццо, что решение было в #2 или #3 --- Сообщение объединено, 18 ноя 2019 --- но это решение не работает!
Ну типа такого: Код (Text): __declspec(noinline, naked) void test(char a, char b) { CSomeClass *me; __asm { mov me, ecx } return me->meth(a,b); }
typedef void (__thiscall UNewAgeAPI::* PROC_PTR)(FFrame &,void *const ); PROC_PTR ProcPtr = (&UNewAgeApi::execLogin); void* ProcPtr2 = *(void**)(&ProcPtr);
TrashGen, эта функция не в моем модуле, я хукнул ее чтобы посмотреть что происходит после первого запуска и ошибки по поиску функции. --- Сообщение объединено, 18 ноя 2019 --- ormoulu, спасибо, функцию передал.. правда из XMLUI ее теперь не вызовешь. Но это уже совсем другая история пошел копать дальше. Всем спасибо за помощь!
ну раз ты стал со мной разговаривать предельно вежливо, за что тебе большое спасибо, то не могу не поискать, вот wininet например: --- Сообщение объединено, 19 ноя 2019 --- вообще говоря, ординал у функции есть всегда, а имени может не быть: Код (Text): auto lib = GetModuleHandleA("kernel32.dll"); auto pt1 = GetProcAddress(lib, "DeleteFileW"); auto pt2 = GetProcAddress(lib, (LPCSTR)267); // на выходе pt1 = pt2 --- Сообщение объединено, 19 ноя 2019 --- не, Инде просто не шарит в формате PE и в загрузчике венды... когда он учился в институте изучения исходников WinXP, он приболел приступом аутоэрастии, и пропустил лекции на эту тему... из-за этого кстати ему не дали красный диплом в институте изучения исходников венды, и теперь он очень злой и обижен на весь мир... и особенно на тех, кто в институте изучения исходников венды не учился, но каким то удивительным образом знает про PE-формат... не обижайся на него...
Rel, Я тоже могу пройти поиском по диску и найти импорт по ординалам. Но я вот что то не помню какие то функции которые так импортятся. Довольно часто используется не штатное наименование, например стабы к криптодрайверу - systemfunctionXX". Вопрос был в том помните ли вы где хоть раз такое юзается. > исходников WinXP А у тебя наверное есть более свежие ?