полное имя dll`ки при вызове из rundll32

Тема в разделе "WASM.ZEN", создана пользователем ovod, 18 авг 2004.

  1. ovod

    ovod New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2004
    Сообщения:
    26
    Адрес:
    г. Нелидово Тверской обл.
    Допустим кто-то выполняет функцию Call из моей dll (см. код на Дельфи ниже) rundll32 mydll.dll,Call. Каким образом определить хендл/путь моей длл, если чел ее скопировал и переименовал как ему вздумается?


    Код (Text):
    1. library mydll;
    2.  
    3. uses
    4.   windows,sysutils;
    5.  
    6. procedure Call; stdcall;
    7. begin
    8. end;
    9.  
    10. var
    11.  Buf: array[0..255] of Char;
    12.  handle:cardinal;
    13.  
    14. exports Call;
    15.  
    16. begin
    17.  //Как найти хендл(handle) длл?
    18.   GetModuleFileName(handle, Buf, SizeOf(Buf));
    19.   MessageBox(0, Buf, PChar(IntToStr(handle))), 0);
    20. end.
     
  2. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    В win32 handle PE файла = адресу загрузки (для EXE обычно 400000h).

    Поэтому на асме можно делать так:
    Код (Text):
    1. handle dd ?
    2.  
    3. mov  eax, handle   ; адрес метки (можно другой)
    4. xor  ax, ax        ; выравниваем по PAGE
    5. mov  [handle], eax ; сохраняем хэндл
     
  3. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    ovod



    НИКАКОГО ДЕЛЬФИ НА ФОРУМЕ! ПРАВИЛА ЧИТАТЬ НАДО!
     
  4. Inked Wedge

    Inked Wedge New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2004
    Сообщения:
    33
    Адрес:
    Ukraine
    volodya

    а где они лежатъ?
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
  6. Inked Wedge

    Inked Wedge New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2004
    Сообщения:
    33
    Адрес:
    Ukraine
    q_q

    Danke schoen!
     
  7. zed_0xff

    zed_0xff New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    29
    по сути вопроса. цитата из МСДН:
    Код (Text):
    1. BOOL WINAPI DllMain(
    2.   HINSTANCE hinstDLL,
    3.   DWORD fdwReason,
    4.   LPVOID lpvReserved
    5. );
    6.  


    т.е. самый первый параметр при вызове дллмайн - это есть хендл дллки, далее делаем ему GetModuleFileName и вуаля :)
     
  8. ovod

    ovod New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2004
    Сообщения:
    26
    Адрес:
    г. Нелидово Тверской обл.
    И куда его втыкать? По моему и так неплохо. Пасиб, S_T_A_S_


    Код (Text):
    1. format PE GUI 4.0 DLL
    2. entry DllEntryPoint
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. proc DllEntryPoint, hinstDLL,fdwReason,lpvReserved
    7.        mov     eax,TRUE
    8.        return
    9. endp
    10.  
    11.        buf     db   ?
    12.        handle  dd   ?
    13.  
    14. proc Dure
    15. begin:
    16.         mov      eax,begin
    17.         xor      ax,ax
    18.         mov      [handle],eax
    19.         invoke GetModuleFileName,[handle],buf,255
    20.         invoke MessageBox,HWND_DESKTOP,buf,buf,MB_OK
    21.         invoke ExitProcess,0
    22. endp
    23.  
    24. section '.idata' import data readable writeable
    25.  
    26.   library kernel,'KERNEL32.DLL',\
    27.           user,'USER32.DLL'
    28.  
    29.   import kernel,\
    30.          ExitProcess,'ExitProcess',\
    31.          GetModuleFileName,'GetModuleFileNameA'
    32.  
    33.   import user,\
    34.          MessageBox,'MessageBoxA'
    35.  
    36. section '.edata' export data readable
    37.  
    38.   export 'MYDLL.DLL',\
    39.          Dure,'Dure'
    40.  
    41. section '.reloc' fixups data discardable    




    Тока вот не пойму две вещи. Если сделать так


    Код (Text):
    1. format PE GUI 4.0 DLL
    2. entry DllEntryPoint
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. proc DllEntryPoint, hinstDLL,fdwReason,lpvReserved
    7.        mov     eax,TRUE
    8.        return
    9. endp
    10.        
    11. proc Dure
    12.  
    13.        return
    14. endp
    15.  
    16. section '.code' code readable executable    
    17.  
    18.        buf     db   ?
    19.        handle  dd   ?
    20.  
    21. begin:
    22.        mov      eax,begin
    23.        xor      ax,ax
    24.        mov      [handle],eax
    25.        invoke GetModuleFileName,[handle],buf,255
    26.        invoke MessageBox,HWND_DESKTOP,buf,buf,MB_OK
    27.        invoke ExitProcess,0
    28.  
    29. section '.idata' import data readable writeable
    30.  
    31.   library kernel,'KERNEL32.DLL',\
    32.           user,'USER32.DLL'
    33.  
    34.   import kernel,\
    35.          ExitProcess,'ExitProcess',\
    36.          GetModuleFileName,'GetModuleFileNameA'
    37.  
    38.   import user,\
    39.          MessageBox,'MessageBoxA'
    40.  
    41. section '.edata' export data readable
    42.  
    43.   export 'MYDLL.DLL',\
    44.          Dure,'Dure'
    45.  
    46. section '.reloc' fixups data discardable    




    то ничего не получается (хотя в дельфине и так и так канает, там кстати var handle:THandle; begin handle:= THandle(@handle) and $FFFF0000 )



    И второе. Если imagebase у двух файлов одинакова, что они оба по одному адресу загружается (конечно, нет, но не пойму)? VA и реальный адрес в памяти - разные вещи?
     
  9. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    ovod




    zed_0xff имел ввиду примерно так :
    Код (Text):
    1. ;========================================================
    2. format      PE GUI 4.0 DLL
    3. entry       DllEntryPoint
    4. ;========================================================
    5. include     '%fasminc%\win32a.inc'
    6. ;========================================================
    7. section     '.code' code readable writeable executable
    8. ;========================================================
    9. buf         rb      255
    10. ;========================================================
    11. proc        DllEntryPoint,hinstDLL,fdwReason,lpvReserved
    12.             invoke  GetModuleFileName,[hinstDLL],buf,255
    13.             xor     eax,eax
    14.             inc     eax
    15.             return
    16. endp
    17. ;========================================================
    18. proc        Dure
    19.             invoke  MessageBox,HWND_DESKTOP,buf,buf,MB_OK
    20.             return
    21. endp
    22. ;========================================================
    23. section     '.idata' import data readable writeable
    24. ;========================================================
    25. library     kernel,'KERNEL32.DLL',user,'USER32.DLL'
    26. import      kernel,GetModuleFileName,'GetModuleFileNameA'
    27. import      user,MessageBox,'MessageBoxA'
    28. ;========================================================
    29. section     '.edata' export data readable
    30. export      'MYDLL.DLL',Dure,'Dure'
    31. section     '.reloc' fixups data discardable
    32. ;========================================================
     
  10. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    ovod



    Тут весь смысл в том, что в eax нужно загружать адрес метки находящейся в первой секции, и обязательно что бы fixup для неё происходил.

    Во 2м случае - код в другой секции, поэтому адрес вычисляется некорректно, нужно ещё и размер секции вычесть.

    А можно взять DllEntryPoint - он в первой секции.





    >




    Вот на то и fixup, загрузчик подправляет команды обращающиеся к меткам (релоцирует) так что модуль может работать по другому адресу.



    mov eax, label <- адрес label быдет скорректирован загрузчиком.