Своя GetProcAddress

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

  1. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    Доброго времени суток.
    у меня такой вопрос:

    в ринг3 нахожу kernel32.dll таким образом

    Код (Text):
    1. function GetKernel : DWORD; assembler;
    2. asm
    3.   mov eax, dword ptr fs:[30h]
    4.   mov eax, dword ptr [eax+0ch]
    5.   mov esi, dword ptr [eax+1ch]
    6.   lodsd
    7.   mov eax, dword ptr [eax+08h]
    8. end;
    каким образом я могу с помощью этого найти адрес функции в ринг3 ?
    что нибудь вроде myGetProcAddress(hModule: DWORD; szProcName: PChar) : Pointer;

    благодарю за внимание.
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    перебрать таблицу экспорта?
     
  3. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Где-то на форуме Ms-Rem выкладывал исходники, ищи
     
  4. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    http://wasm.ru/article.php?article=searchapi
     
  5. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    исход ник Ms-Remа нашел.

    Существует ли подобный способ без использования АПИ?
     
  6. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    nobodyzzz

    мне нужна функция которая ищет адреса не по хешу а по имени. что нибудь не очень сложное.
     
  7. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    GeNeZiS
    Вот код yoda, оптимизированный мной.
    Код (Text):
    1. GetProcAddr proc uses esi edi ebx dwDllBase:DWORD, lpProcName:DWORD
    2.  
    3.     ; check PE Signature
    4.     mov esi, dwDllBase
    5.     cmp word ptr [esi], IMAGE_DOS_SIGNATURE
    6.     jnz not_found
    7.     add esi, [esi + 3ch]
    8.     cmp word ptr [esi], IMAGE_NT_SIGNATURE
    9.     jnz not_found
    10.    
    11.     ; get the length of the target proc name
    12.     mov edi, lpProcName
    13.     or ecx, -1
    14.     xor eax, eax
    15.     repne scasb
    16.     not ecx                                 ; ecx -> ProcName length
    17.    
    18.     assume edx: ptr IMAGE_EXPORT_DIRECTORY
    19.     ; trace the export table
    20.     mov edx, [esi + 078h]                   ; edx -> Export table
    21.     add edx, dwDllBase
    22.     mov ebx, [edx].AddressOfNames           ; ebx -> AddressOfNames array pointer
    23.     add ebx, dwDllBase
    24. ;   xor eax, eax                            ; eax -> AddressOfNames Index
    25.     .repeat
    26.         mov edi, [ebx]
    27.         add edi, dwDllBase
    28.         mov esi, lpProcName
    29.         push ecx                            ; save ProcName length
    30.         repe cmpsb
    31.         je found                            ; found smth ?
    32.         pop ecx                             ; restore ProcName length
    33.         add ebx, 4
    34.         inc eax
    35.     .until [edx].NumberOfNames == eax
    36.    
    37.     jmp not_found
    38.  
    39. found:
    40.     pop ecx
    41.  
    42.     mov ecx, dwDllBase
    43.     mov esi, ecx
    44.    
    45.     ; find the corresponding ordinal
    46.     add ecx, [edx].AddressOfNameOrdinals
    47.     lea eax, [ecx + 2*eax]
    48.     movzx eax, word ptr [eax]               ; eax -> Api Ordinal
    49.    
    50.     ; get the address of the api
    51.     lea eax, [esi + 4*eax]
    52.     add eax, [edx].AddressOfFunctions
    53.     mov eax, [eax]
    54.     add eax, esi
    55.     jmp return
    56.     assume edx: nothing
    57.  
    58. not_found:
    59.     xor eax, eax
    60.    
    61. return:
    62.     ret
    63.    
    64. GetProcAddr endp
     
  8. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    http://wasm.ru/article.php?article=vgw04
    use search =))
     
  9. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    огромная всем благодарность. особенно koderrу

    еще вопрос: assume edx: ptr IMAGE_EXPORT_DIRECTORY
    как нибудь можно это заменить аналогом, ато у меня делфа ругается на assume?
     
  10. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    В Delphi и Builder когда делаешь lea в регистр, автоматически подключается контроль типов. Типа автоматической assume получается
     
  11. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    gilg
    а можно поподробнее? очень интересно
     
  12. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    GeNeZiS
    Что-то типа этого:
    Код (Text):
    1. var
    2.   pt: TPoint;
    3. begin
    4.   asm
    5.     lea eax,pt            // неявный ASSUME eax:TPoint
    6.     mov ebx,[eax].x
    7.     sub ebx,[eax].y
    8.   end;
    9. end;
     
  13. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    2 gilg

    попытался сделать так:

    Код (Text):
    1. function myGetProcAddress(hModule: DWORD; szProcName: PChar) : Pointer; assembler;
    2. const
    3.   IMAGE_DOS_SIGNATURE = $5A4D;
    4.   IMAGE_NT_SIGNATURE  = $00004550;
    5.  
    6. var
    7.   IED : IMAGE_EXPORT_DIRECTORY;
    8.  
    9. asm
    10.         mov     esi, hModule
    11.         cmp     word ptr [esi], IMAGE_DOS_SIGNATURE
    12.         jnz     @not_found
    13.  
    14.         add     esi, dword ptr [esi + 3ch]
    15.         cmp     word ptr [esi], IMAGE_NT_SIGNATURE
    16.         jnz     @not_found
    17.  
    18.         lea     edx, IED
    19.  
    20.         mov     edx, [esi + 078h]
    21.         add     edx, hModule
    22.         mov     ebx, [edx].AddressOfNames
    23.         add     ebx, hModule
    24.  
    25. @l00p:
    26.         mov     edi, [ebx]
    27.         add     edi, hModule
    28.         mov     esi, szProcName
    29.         push    ecx
    30.         repe    cmpsb
    31.         je      @found
    32.         pop     ecx
    33.         add     ebx, 4
    34.         inc     eax
    35.         cmp     [edx].NumberOfNames, eax
    36.         jne     @l00p
    37.         jmp     @not_found
    38.  
    39. @found:
    40.         pop     ecx
    41.         mov     ecx, hModule
    42.         mov     esi, ecx
    43.         add     ecx, [edx].AddressOfNameOrdinals
    44.  
    45.         lea     eax, [ecx + 2*eax]
    46.         movzx   eax, word ptr [eax]
    47.         lea     eax, [esi + 4*eax]
    48.         add     eax, [edx].AddressOfFunctions
    49.  
    50.         mov     eax, [eax]
    51.         add     eax, esi
    52.         ret
    53.  
    54. @not_found:
    55.         xor     eax, eax
    56.         ret
    57. end;
    не получается. (((
    пишет

    Undeclared identifier: 'AddressOfNames'

    то же самое и для NumberOfNames, AddressOfNameOrdinals, AddressOfFunctions.

    просто уж не знаю что и сделать. очень нужна помощь.
     
  14. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Код (Text):
    1. lea     edx, IED
    2. mov     edx, [esi + 078h]           ; mov после lea все сбрасывает
    3. add     edx, hModule
    4. mov     ebx, [edx].AddressOfNames
    Попробуй изменить так:
    Код (Text):
    1. lea     edx, IED
    2. mov     ebx, [edx].AddressOfNames
    Если скомпилится, посмотрим дальше.

    ЗЫ: А чем не устраивает целиком на Delphi?
    Посмотри здесь: http://www.wasm.ru/forum/viewtopic.php?id=11349
    и здесь http://www.wasm.ru/forum/viewtopic.php?id=12479
    Думаю, с СИшными исходниками будет проще разобраться, как это работает, чем с асмовыми
     
  15. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1. function xGetProcAddress(hMod: HMODULE; ProcName: PChar): Pointer; stdcall;
    2. var
    3.  ExportDir: PImageExportDirectory;
    4.  i, IndInAddr: DWORD;
    5. begin
    6.  result:=nil;
    7.  ExportDir:=PImageExportDirectory(PImageNtHeaders(hMod+DWORD(PImageDosHeader(hMod).e_lfanew)).OptionalHeader.
    8.   DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress+hMod);
    9.  for i:=0 to ExportDir.NumberOfNames-1 do
    10.  begin
    11.   if ComparePCharStrings(PChar(PDWORD(DWORD(ExportDir.AddressOfNames)+hMod+i*4)^+hMod), ProcName) then
    12.    begin
    13.     IndInAddr:=PWORD(DWORD(ExportDir.AddressOfNameOrdinals)+hMod+i*2)^;
    14.     result:=Pointer(PDWORD(DWORD(ExportDir.AddressOfFunctions)+hMod+IndInAddr*4)^+hMod);
    15.     exit;
    16.    end;
    17.  end;
    18. end;
    Код писал лет 5 назад, но работать должен и сейчас =)
     
  16. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    зы:
    Вот это адрес, всем адресам Адрес!
     
  17. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Вот это круче =)
    Код (Text):
    1.  PInt(PInt(ListEntry+4)^)^:=PInt(PInt(PInt(ListEntry+4)^)^)^;
    2.  PInt(PInt(ListEntry+4)^+4)^:=PInt(PInt(PInt(ListEntry+4)^+4)^+4)^;
     
  18. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    GeNeZiS, gilg
    В дельфях это делается так
    Код (Text):
    1. //объявим тип покороче, чтобы не возиться с длинным именем
    2. type IED = IMAGE_EXPORT_DIRECTORY;
    3. asm  //равнозначные варианты
    4.   mov ebx, IED[edx].AddressOfNames
    5.   mov ebx, [edx].IED.AddressOfNames
    6.   mov ebx, [edx+IED.AddressOfNames]
     
  19. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    leo
    Наконец, пришли к истине :)

    Нашел мануал по инлайн-ассемблеру в Делфи:
    http://info.borland.com/techpubs/delphi/delphi5/oplg/assemblr.html

    ЗЫ: Странно, но про билдер на всем сайте почти что ни одного умного слова нет. Все больше про создание на нем текстового редактора
     
  20. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    доброго времени суток.

    всем огромная благодарность.
    получился такой код:

    Код (Text):
    1. function myGetProcAddress(hModule: DWORD; szProcName: PChar) : Pointer; assembler;
    2. type IED = IMAGE_EXPORT_DIRECTORY;
    3.  
    4. const
    5.   IMAGE_DOS_SIGNATURE = $5A4D;
    6.   IMAGE_NT_SIGNATURE  = $00004550;
    7.  
    8. asm
    9.     mov   esi, hModule
    10.     cmp   word ptr [esi], IMAGE_DOS_SIGNATURE
    11.     jnz   @not_found
    12.  
    13.     add   esi, dword ptr [esi + 3ch]
    14.     cmp   word ptr [esi], IMAGE_NT_SIGNATURE
    15.     jnz   @not_found
    16.  
    17.     mov   edx, [esi + 078h]
    18.     add   edx, hModule
    19.     mov   ebx, [edx].IED.AddressOfNames
    20.     add   ebx, hModule
    21.  
    22. @l00p:
    23.     mov   edi, [ebx]
    24.     add   edi, hModule
    25.     mov   esi, szProcName
    26.     push   ecx
    27.     repe   cmpsb
    28.     je    @found
    29.     pop   ecx
    30.     add   ebx, 4
    31.     inc   eax
    32.     cmp   [edx].IED.NumberOfNames, eax
    33.     jnz   @l00p
    34.  
    35.     jmp   @not_found
    36.  
    37. @found:
    38.     pop   ecx
    39.     mov   ecx, hModule
    40.     mov   esi, ecx
    41.     add   ecx, [edx].IED.AddressOfNameOrdinals
    42.  
    43.     lea   eax, [ecx + 2*eax]
    44.     movzx  eax, word ptr [eax]
    45.     lea   eax, [esi + 4*eax]
    46.     add   eax, [edx].IED.AddressOfFunctions
    47.  
    48.     mov   eax, [eax]
    49.     add   eax, esi
    50.     ret
    51.  
    52. @not_found:
    53.     xor eax, eax
    54.     ret
    55. end;
    все удачно скомпилировалось, только вылетает окно с ошибкой и программа не работает.
    что я делаю не правильно? или код не рабочий?