Как это правильно на асме сделать ?

Тема в разделе "WASM.BEGINNERS", создана пользователем Shooshpanchik, 29 сен 2006.

  1. Shooshpanchik

    Shooshpanchik Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    117
    Есть такой кусок кода на дельфях, как его правильно на асм перевести ( если быть точнее мне 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 интересует.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Это уникальная особенность Delphi %)
    В Си и асме такого нет.
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    n0name
    Можно сделать..

    Shooshpanchik
    Код (Text):
    1. #pragma comment(linker,"/entry:DllMain")
    2.  
    3. DWORD DllMain(HINSTANCE hDllInstance, DWORD dwReason, LPVOID lpReserved){
    4.   switch(dwReason){
    5.    case DLL_PROCESS_ATTACH:
    6.     SetGlobalHook();
    7.     SetHook;
    8.     break;
    9.    case DLL_PROCESS_DETACH:
    10.     Unhook();
    11.     break;
    12.  }
    13. }
    На асм перевести не проблема, часть между begin и end тебе не нужна (это эмуляция DllMain в делфи). DllMain - это точка входа dll, назначается компилятором и/или линкером. Как в С-- обстоит с этим, не знаю - смотри документацию и примеры.
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Я писАл про код между begin и end, что в Delphi так коряво объявляется DllMain.
     
  5. Shooshpanchik

    Shooshpanchik Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    117
    В том то и прикол, что изначально точка входа указывает на строчку после begin, а тут она переопределяется после передачи управления на нее. Не ну подобное ведь все равно можно написать на асме то ? Надо всего то чтоб DLL правильно обработала DLL_PROCESS_ATTACH при загрузке, и DLL_PROCESS_DETACH при выгрузке
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Да, с фасмом идёт пример.
    Код (Text):
    1. format PE GUI 4.0 DLL
    2. entry DllEntryPoint
    3.  
    4. include 'win32a.inc'
    5.  
    6. section '.code' code readable executable
    7.  
    8. proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
    9.     mov eax,TRUE
    10.     ret
    11. endp
     
  7. Shooshpanchik

    Shooshpanchik Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    117
    На С-- это выглядит примерно так
    Код (Text):
    1. #jumptomain  NONE
    2. //неважное поскипанно
    3. dword main ( dword hInstDLL, reason, reserv )
    4. {
    5. switch(reason){
    6.   case DLL_PROCESS_ATTACH:{SetGlobalHook();SetHook();break;}
    7.   case DLL_PROCESS_DETACH:{Unhook();break;}
    8. }
    9. EAX=1;
    10. }
    Загнал эту DLL под OllyDbg, при загрузке в reason оказалось 1, что и соответствует DLL_PROCESS_ATTACH. А на дельфях это выглядит как то странно.
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    И что там оказалось странного в reason?
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Где в дельфях настоящая точка входа "никто не знает" в том смысле, что компилятор сам формирует входной код, куда собирает initialization всех модулей. Поэтому вышеприведенный begin..end это просто кусок кода, который вызывается из "настоящей" DllMain созданной компилятором
     
  10. Shooshpanchik

    Shooshpanchik Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    117
    Просто reason в примере указан явно, DLLEntryPoint(DLL_PROCESS_ATTACH);, в других языках программирования такое не используеться, оно принимаеться по умолчанию. В дельфях main хотя как бы и есть но параметры ей передаються ограниченные и то, только те что stub насобирал ( paramstr, hInstance). Но это для приложений.
    Насчет точки входа в DLL, IDA четко показала что точка входа в DLL именно там, а уже в ней вызываеться initializations.
    Код (Text):
    1. start:
    2. push    ebp
    3. mov     ebp, esp
    4. add     esp, 0FFFFFFC4h
    5. mov     eax, offset dword_4082A4
    6. call    sub_404554// это init
    7. mov     eax, offset sub_408268//DllProc := @DLLEntryPoint;
    8. mov     ds:dword_40A664, eax
    9. mov     eax, 1
    10. call    sub_408268//DLLEntryPoint(DLL_PROCESS_ATTACH);
    11. call    sub_4035AC//это как я понял finalization
    12. lea     eax, [eax+0]
    13. dd 3Ch dup(0)
    14. ends
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Shooshpanchik
    Тебе шашечки или ехать? Сказано же было, DLLEntryPoint(DLL_PROCESS_ATTACH) - это искусственный вызов. Замена DllProc здесь для того, чтобы поймать, когда система вызовет DllMain c DLL_PROCESS_DETACH и снять хуки. В других языках (C, asm) всё проще, т.к. нет этой надстройки (DllProc) над точкой входа. Поэтому на них можно писать без извратов: пример.