Есть такой кусок кода на дельфях, как его правильно на асм перевести ( если быть точнее мне C-- нужен) procedure DLLEntryPoint(dwReason: DWord); begin case dwReason of DLL_PROCESS_ATTACH: begin SetGlobalHook(); SetHook(); end; DLL_PROCESS_DETACH: Unhook(); end; end; begin DllProc := @DLLEntryPoint; DLLEntryPoint(DLL_PROCESS_ATTACH); end. Особенно между begin и end интересует.
n0name Можно сделать.. Shooshpanchik Код (Text): #pragma comment(linker,"/entry:DllMain") DWORD DllMain(HINSTANCE hDllInstance, DWORD dwReason, LPVOID lpReserved){ switch(dwReason){ case DLL_PROCESS_ATTACH: SetGlobalHook(); SetHook; break; case DLL_PROCESS_DETACH: Unhook(); break; } } На асм перевести не проблема, часть между begin и end тебе не нужна (это эмуляция DllMain в делфи). DllMain - это точка входа dll, назначается компилятором и/или линкером. Как в С-- обстоит с этим, не знаю - смотри документацию и примеры.
В том то и прикол, что изначально точка входа указывает на строчку после begin, а тут она переопределяется после передачи управления на нее. Не ну подобное ведь все равно можно написать на асме то ? Надо всего то чтоб DLL правильно обработала DLL_PROCESS_ATTACH при загрузке, и DLL_PROCESS_DETACH при выгрузке
Да, с фасмом идёт пример. Код (Text): format PE GUI 4.0 DLL entry DllEntryPoint include 'win32a.inc' section '.code' code readable executable proc DllEntryPoint hinstDLL,fdwReason,lpvReserved mov eax,TRUE ret endp
На С-- это выглядит примерно так Код (Text): #jumptomain NONE //неважное поскипанно dword main ( dword hInstDLL, reason, reserv ) { switch(reason){ case DLL_PROCESS_ATTACH:{SetGlobalHook();SetHook();break;} case DLL_PROCESS_DETACH:{Unhook();break;} } EAX=1; } Загнал эту DLL под OllyDbg, при загрузке в reason оказалось 1, что и соответствует DLL_PROCESS_ATTACH. А на дельфях это выглядит как то странно.
Где в дельфях настоящая точка входа "никто не знает" в том смысле, что компилятор сам формирует входной код, куда собирает initialization всех модулей. Поэтому вышеприведенный begin..end это просто кусок кода, который вызывается из "настоящей" DllMain созданной компилятором
Просто reason в примере указан явно, DLLEntryPoint(DLL_PROCESS_ATTACH);, в других языках программирования такое не используеться, оно принимаеться по умолчанию. В дельфях main хотя как бы и есть но параметры ей передаються ограниченные и то, только те что stub насобирал ( paramstr, hInstance). Но это для приложений. Насчет точки входа в DLL, IDA четко показала что точка входа в DLL именно там, а уже в ней вызываеться initializations. Код (Text): start: push ebp mov ebp, esp add esp, 0FFFFFFC4h mov eax, offset dword_4082A4 call sub_404554// это init mov eax, offset sub_408268//DllProc := @DLLEntryPoint; mov ds:dword_40A664, eax mov eax, 1 call sub_408268//DLLEntryPoint(DLL_PROCESS_ATTACH); call sub_4035AC//это как я понял finalization lea eax, [eax+0] dd 3Ch dup(0) ends
Shooshpanchik Тебе шашечки или ехать? Сказано же было, DLLEntryPoint(DLL_PROCESS_ATTACH) - это искусственный вызов. Замена DllProc здесь для того, чтобы поймать, когда система вызовет DllMain c DLL_PROCESS_DETACH и снять хуки. В других языках (C, asm) всё проще, т.к. нет этой надстройки (DllProc) над точкой входа. Поэтому на них можно писать без извратов: пример.