Инжект

Тема в разделе "WASM.BEGINNERS", создана пользователем slavanap, 27 май 2009.

  1. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    И в чем щас проблема? Функции заменяются? Или не находятся в таблице?
     
  2. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    bendme,
    не находятся.
    Точнее они находились бы, но почему-то в цикле перебирается (проверял с помощью MessageBox'ов)
    Код (Text):
    1. While pThunk.Name1 <> 0 do
    2.   Begin
    3.     ppfn := pointer(pThunk^.Name1);
    4.     [b]MessageBox(0, PChar(IntToStr(cardinal(ppfn))), PChar(IntToStr(cardinal(pfnCurrent))),0);[/b]
    5.     bFound := ppfn = pfnCurrent;
    6.     IF bFound then
    7.     Begin
    8.       WriteProcessMemory(GetCurrentProcess, ppfn, @pfnNew, sizeof(pfnNew), Temp);
    9.       Result := true;
    10.       break;
    11.     End;
    12.     Inc(pThunk, 4);
    13.   End;
    всего часть импорта главного модуля, а точнее 12 из 78 функций в kernel32.dll.
    В указатели отличаются совсем на чуть-чуть.
    Может ли это быть связано с тем, что я хукаю функции сразу во время инициализации dll-шки?

    Спасибо.
     
  3. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    А в месседжбоксах имена функций меняются?
     
  4. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    Inc(pThunk, 4);

    ------
    А че за четверка?
     
  5. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    И почему у тебя pThunk - это pimport_by_name??
     
  6. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    bendme,
    а что это должно быть? объясни, пожалуйста.
    я думал, pThunk - это указатель на массив указателей на структуры import_by_name, состоящие из двух полей (во закрутил...)). В ней поле Name1 - адрес прилинкованной функции. Не так?
     
  7. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    sizeof(pointer)
     
  8. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    Всем спасибо!!
    Разобрался.
    Оказывается, Delphi неправильно обрабатывает инструкцию inc (не знаю, что он с ней делает, но адреса получаются неправильными).

    Итак, рабочий и исправленный код:
    Код (Text):
    1. { cut from windows.inc }
    2.  
    3. Const
    4.   IMAGE_DIRECTORY_ENTRY_EXPORT       = 0;
    5.   IMAGE_DIRECTORY_ENTRY_IMPORT       = 1;
    6.   IMAGE_DIRECTORY_ENTRY_RESOURCE     = 2;
    7.   IMAGE_DIRECTORY_ENTRY_EXCEPTION    = 3;
    8.   IMAGE_DIRECTORY_ENTRY_SECURITY     = 4;
    9.   IMAGE_DIRECTORY_ENTRY_BASERELOC    = 5;
    10.   IMAGE_DIRECTORY_ENTRY_DEBUG        = 6;
    11.   IMAGE_DIRECTORY_ENTRY_COPYRIGHT    = 7;
    12.   IMAGE_DIRECTORY_ENTRY_GLOBALPTR    = 8;
    13.   IMAGE_DIRECTORY_ENTRY_TLS          = 9;
    14.   IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG  = 10;
    15.   IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT = 11;
    16.   IMAGE_DIRECTORY_ENTRY_IAT          = 12;
    17.   IMAGE_NUMBEROF_DIRECTORY_ENTRIES   = 16;
    18.  
    19. Type
    20.   IMAGE_IMPORT_DESCRIPTOR = record
    21.     OriginalFirstThunk: cardinal;
    22.     TimeDateStamp: cardinal;
    23.     ForwarderChain: cardinal;
    24.     Name: cardinal;
    25.     FirstThunk: cardinal;
    26.   End;
    27.  
    28.   IMAGE_IMPORT_BY_NAME = record
    29.     Hint: WORD;
    30.     Name: cardinal;
    31.   End;
    32.  
    33. { cut ends here }
    34.  
    35.   PIMAGE_IMPORT_DESCRIPTOR = ^IMAGE_IMPORT_DESCRIPTOR;
    36.  
    37.  
    38. Function ImageDirectoryEntryToData(Base: THandle; MappedAsImage: BOOL;
    39.   DirectoryEntry: cardinal; var Size: cardinal): PIMAGE_IMPORT_DESCRIPTOR; stdcall;
    40. Function ReplaceImportEntry(hModule: cardinal; fDLL, fName: string; pfnNew: pointer): boolean;
    41.  
    42. Implementation
    43.  
    44. Function ImageDirectoryEntryToData; external 'imagehlp.dll';
    45.  
    46. Function ReplaceImportEntry(hModule: cardinal; fDLL, fName: string; pfnNew: pointer): boolean;
    47. Var
    48.   pImport: PIMAGE_IMPORT_DESCRIPTOR;
    49.   pThunk: PCardinal;
    50.   p, pOld: pointer;
    51.   pszDLLName: PChar;
    52.   Temp: cardinal;
    53. Begin
    54.   Result := false;
    55.  
    56.   { Получение указателя на секцию импорта }
    57.   pImport := ImageDirectoryEntryToData(hModule, true, IMAGE_DIRECTORY_ENTRY_IMPORT, Temp);
    58.   IF pImport = nil then Exit;
    59.  
    60.   { Получение указателя на секцию импорта у нужной библиотеки }
    61.   pszDLLName := PChar(fDLL);
    62.   While pImport^.Name <> 0 do
    63.   Begin
    64.     p := pointer(hModule + pImport^.Name);
    65.     IF lstrcmpiA(pszDLLName, p) = 0 then Break;
    66.     pImport := pointer(cardinal(pImport)+SizeOf(IMAGE_IMPORT_DESCRIPTOR));
    67.   End;
    68.   IF pImport^.Name = 0 then Exit;
    69.  
    70.   { Получение указателя на нужную функцию и его подмена }
    71.   pThunk := pointer(hModule + pImport^.FirstThunk);
    72.   pOld := GetProcAddress(GetModuleHandle(PChar(fDLL)), PChar(fName));
    73.   While PCardinal(pThunk)^ <> 0 do
    74.   Begin
    75.     p := pointer(pThunk^);
    76.     IF p = pOld then
    77.     Begin
    78.       WriteProcessMemory(GetCurrentProcess, p, @pfnNew, 4, Temp);
    79.       Result := true;
    80.       Break;
    81.     End;
    82.     pThunk := pointer(cardinal(pThunk)+4);
    83.   End;
    84. End;