Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Inject Dll To Explorer 
:(
    Опции темы
Hacker
Дата 2.6.2006, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Внедряю свою ДЛЛ-ку в explorer, проблема в том что почему-то под Win2000 код не работает, я не понял, или он не туда внедряется, или проблема в перехвате функций...

Вот Injector - часть кода из EXE

Код

procedure InjectDllToExplorer;
var
  PID, hProcess: DWORD;
  DLL: PChar;
begin
  DLL := PChar(MainForm.AppPath+'Progs\InjectToExplorer.dll');
  GetWindowThreadProcessId(FindWindow('Shell_TrayWnd', nil), @Pid);
  hprocess := OpenProcess($1F0FFF, False, Pid);

  InjectDll(hProcess,DLL);

  CloseHandle(hprocess);
end;

Function InjectDll(Process: dword; ModulePath: PChar): boolean;
var
  Memory:pointer;
  Code: dword;
  BytesWritten: dword;
  ThreadId: dword;
  hThread: dword;
  hKernel32: dword;
  Inject: packed record
           PushCommand:byte;
           PushArgument:DWORD;
           CallCommand:WORD;
           CallAddr:DWORD;
           PushExitThread:byte;
           ExitThreadArg:dword;
           CallExitThread:word;
           CallExitThreadAddr:DWord;
           AddrLoadLibrary:pointer;
           AddrExitThread:pointer;
           LibraryName:array[0..MAX_PATH] of char;
          end;
begin
  Result := false;
  Memory := VirtualAllocEx(Process, nil, sizeof(Inject),
                           MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  if Memory = nil then Exit;
  Code := dword(Memory);
  Inject.PushCommand    := $68;
  inject.PushArgument   := code + $1E;
  inject.CallCommand    := $15FF;
  inject.CallAddr       := code + $16;
  inject.PushExitThread := $68;
  inject.ExitThreadArg  := 0;
  inject.CallExitThread := $15FF;
  inject.CallExitThreadAddr := code + $1A;
  hKernel32 := GetModuleHandle('kernel32.dll');
  inject.AddrLoadLibrary := GetProcAddress(hKernel32, 'LoadLibraryA');
  inject.AddrExitThread  := GetProcAddress(hKernel32, 'ExitThread');
  lstrcpy(@inject.LibraryName, ModulePath);
  WriteProcessMemory(Process, Memory, @inject, sizeof(inject), BytesWritten);
  hThread := CreateRemoteThread(Process, nil, 0, Memory, nil, 0, ThreadId);
  if hThread = 0 then Exit;
  CloseHandle(hThread);
  Result := True;
end;


А вот ДЛЛ-ка, она должна выводить мессаги, когда проводник запускает какую-нибудь прогу

Код

library Stealth;

uses
  Windows, ShellApi;


type
  //record for Code patching!!!
  TImportFunction = packed record
    JumpInstruction: Word;
    AddressOfPointerToFunction: ^Pointer;
  end;

  //record for Code patching!!!
  TImageImportEntry = record
    Characteristics: dword;
    TimeDateStamp: dword;
    MajorVersion: word;
    MinorVersion: word;
    Name: dword;
    LookupTable: dword;
  end;

var
  DefaultDll: String;

  //callback for process cloaking
  CreateProcessANextHook: function (appName, cmdLine: pchar; processAttr, threadAttr: PSecurityAttributes; inheritHandles: bool; creationFlags: dword; environment: pointer; currentDir: pchar; const startupInfo: TStartupInfo; var processInfo: TProcessInformation) : bool; stdcall;
  CreateProcessWNextHook: function (appName, cmdLine: pwidechar; processAttr, threadAttr: PSecurityAttributes; inheritHandles: bool; creationFlags: dword; environment: pointer; currentDir: pwidechar; const startupInfo: TStartupInfo; var processInfo: TProcessInformation) : bool; stdcall;
  WinExecNextHook: function (cmdLine: pchar; show: dword) : dword; stdcall;

  ShellExecuteANextHook: function (hWnd: HWND; Operation, FileName, Parameters, Directory: PChar; ShowCmd: Integer): HINST; stdcall;
  ShellExecuteWNextHook: function (hWnd: HWND; Operation, FileName, Parameters, Directory: PWideChar; ShowCmd: Integer): HINST; stdcall;
  ShellExecuteExANextHook: function (lpExecInfo: PShellExecuteInfoA):BOOL; stdcall;
  ShellExecuteExWNextHook: function (lpExecInfo: PShellExecuteInfoW):BOOL; stdcall;

function LowerCase(const S: string): string;
var
  Ch: Char;
  L: Integer;
  Source, Dest: PChar;
begin
  L := Length(S);
  SetLength(Result, L);
  Source := Pointer(S);
  Dest := Pointer(Result);
  while L <> 0 do
  begin
    Ch := Source^;
    if (Ch >= 'A') and (Ch <= 'Z') then Inc(Ch, 32);
    Dest^ := Ch;
    Inc(Source);
    Inc(Dest);
    Dec(L);
  end;
end;

function FunctionAddress(Code: Pointer): Pointer;
begin
  Result := Code;
  If TImportFunction(Code^).JumpInstruction = 9727 then Result := TImportFunction(Code^).AddressOfPointerToFunction^;
end;

function HookCode(TargetAddress, NewAddress: Pointer; var OldAddress: Pointer): integer;
var
  HookedModules: String;

  function HookModule(ImageDosHeader: PImageDosHeader; TargetAddress, NewAddress: Pointer; var OldAddress: Pointer): integer;
  var
    Address: Pointer;
    ImportCode: ^Pointer;
    BytesWritten: dword;
    ImageNTHeaders: PImageNTHeaders;
    ImageImportEntry: ^TImageImportEntry;
  begin
    Result := 0;
    OldAddress := FunctionAddress(TargetAddress);

    //check the header and see if there is one, if there isn't then exit hook routine
    If ImageDosHeader.e_magic <> IMAGE_DOS_SIGNATURE then Exit;
    //Loads the API headers into ImageNTHeaders
    ImageNTHeaders := Pointer(integer(ImageDosHeader) + ImageDosHeader._lfanew);

    //checks if there are API header? (I think)
    If ImageNTHeaders^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress = 0 then Exit;
    //Gets just the API header addresses? (I think)
    ImageImportEntry := Pointer(dword(ImageDosHeader) + ImageNTHeaders^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);

    //Loops through each API header looking for the name you specified ready to patch!
    While ImageImportEntry^.Name <> 0 do
    begin
      //If its found then go into
      If Pos(LowerCase(string(PChar(dword(ImageDosHeader) + ImageImportEntry^.Name))), HookedModules) = 0 then
      begin
        //Writes the redirection of API
        HookedModules := HookedModules + LowerCase(string(PChar(dword(ImageDosHeader) + ImageImportEntry^.Name)));
        HookModule(Pointer(GetModuleHandle(PChar(dword(ImageDosHeader) + ImageImportEntry^.Name))), TargetAddress, NewAddress, OldAddress);
      end;

      //Sets the Address of the Table?
      ImportCode := Pointer(dword(ImageDosHeader) + ImageImportEntry.LookupTable);

      While ImportCode^ <> nil do
      begin
        Address := FunctionAddress(ImportCode^);

        //checks address and writes our one!
        If Address = OldAddress then
          WriteProcessMemory(GetCurrentProcess, ImportCode, @NewAddress, SizeOf(dword), BytesWritten);

        //increment the importcode until it finds the correct address
        Inc(ImportCode);
      end;

      //keep stepping thru each API Header
      Inc(ImageImportEntry);
    end;
  end;

begin
  Result := HookModule(Pointer(GetModuleHandle(nil)), TargetAddress, NewAddress, OldAddress);
end;

function UnhookCode(NewAddress, OldAddress: Pointer): integer;
begin
  Result := HookCode(NewAddress, OldAddress, NewAddress);
end;

//hooks file opening
function CreateProcessACallbackProc(appName, cmdLine: pchar; processAttr, threadAttr: PSecurityAttributes; inheritHandles: bool; creationFlags: dword; environment: pointer; currentDir: pchar; const startupInfo: TStartupInfo; var processInfo: TProcessInformation) : bool; stdcall;
begin
  Result := CreateProcessANextHook(appName, cmdLine, processAttr, threadAttr, inheritHandles, creationFlags, environment, currentDir, startupInfo, processInfo);
  MessageBox(0,'CreateprocessA','Au...',MB_OK or MB_ICONINFORMATION);
end;

//hooks file opening
function CreateProcessWCallbackProc(appName, cmdLine: pwidechar; processAttr, threadAttr: PSecurityAttributes; inheritHandles: bool; creationFlags: dword; environment: pointer; currentDir: pwidechar; const startupInfo: TStartupInfo; var processInfo: TProcessInformation) : bool; stdcall;
begin
  Result := CreateProcessWNextHook(appName, cmdLine, processAttr, threadAttr, inheritHandles, creationFlags, environment, currentDir, startupInfo, processInfo);
  MessageBox(0,'CreateprocessW','Au...',MB_OK or MB_ICONINFORMATION);
end;

//hooks file opening
function WinExecCallbackProc(cmdLine: pchar; show: dword) : dword; stdcall;
var
  StartupInfo: TStartUpInfo;
  ProcessInfo: TProcessInformation;
begin
  FillChar(StartupInfo, Sizeof(StartupInfo), #0);
  StartupInfo.wShowWindow := Show;
  CreateProcessA(nil, cmdLine, nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, startupInfo, processInfo);

  MessageBox(0,'WinExec','Au...',MB_OK or MB_ICONINFORMATION);
end;

function ShellExecuteNextACallBack(hWnd: HWND; Operation, FileName, Parameters, Directory: PAnsiChar; ShowCmd: Integer): HINST; stdcall;
var
  StartupInfo: TStartUpInfo;
  ProcessInfo: TProcessInformation;
begin
  FillChar(StartupInfo, Sizeof(StartupInfo), #0);
  StartupInfo.wShowWindow := ShowCmd;
  CreateProcessA(nil, FileName, nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, startupInfo, processInfo);

  MessageBox(0,'ShellExecuteNextA','Au...',MB_OK or MB_ICONINFORMATION);
end;

function ShellExecuteNextWCallBack(hWnd: HWND; Operation, FileName, Parameters, Directory: PWideChar; ShowCmd: Integer): HINST; stdcall;
var
  StartupInfo: TStartUpInfo;
  ProcessInfo: TProcessInformation;
begin
  FillChar(StartupInfo, Sizeof(StartupInfo), #0);
  StartupInfo.wShowWindow := ShowCmd;
  CreateProcessA(nil, Pchar(FileName), nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, startupInfo, processInfo);

  MessageBox(0,'ShellExecuteNextW','Au...',MB_OK or MB_ICONINFORMATION);
end;

function ShellExecuteExACallBack(lpExecInfo: PShellExecuteInfoA):BOOL; stdcall;
begin
  Result := ShellExecuteExANextHook(lpExecInfo);
  MessageBox(0,'ShellExecuteExA','Au...',MB_OK or MB_ICONINFORMATION);
end;

function ShellExecuteExWCallBack(lpExecInfo: PShellExecuteInfoW):BOOL; stdcall;
begin
  Result := ShellExecuteExWNextHook(lpExecInfo);
  MessageBox(0,'ShellExecuteExW','Au...',MB_OK or MB_ICONINFORMATION);
end;

procedure HandleEvents(reason: integer);
begin
  case reason of
    DLL_PROCESS_ATTACH:
      begin
        HookCode(@CreateProcessA, @CreateProcessACallbackProc, @CreateProcessANextHook);
        HookCode(@CreateProcessW, @CreateProcessWCallbackProc, @CreateProcessWNextHook);

        HookCode(@WinExec,@WinExecCallbackProc,@WinExecNextHook);

        HookCode(@ShellExecuteA, @ShellExecuteNextACallBack, @ShellExecuteANextHook);
        HookCode(@ShellExecuteW, @ShellExecuteNextWCallBack, @ShellExecuteWNextHook);

        HookCode(@ShellExecuteExA, @ShellExecuteExACallBack, @ShellExecuteExANextHook);
        HookCode(@ShellExecuteExW, @ShellExecuteExWCallBack, @ShellExecuteExWNextHook);
      end;

    DLL_PROCESS_DETACH:
      begin
        UnhookCode(@CreateProcessANextHook, @CreateProcessA);
        UnhookCode(@CreateProcessWNextHook, @CreateProcessW);

        UnhookCode(@WinExecNextHook,@WinExec);

        UnhookCode(@ShellExecuteANextHook, @ShellExecuteA);
        UnhookCode(@ShellExecuteWNextHook, @ShellExecuteW);

        UnhookCode(@ShellExecuteExACallBack, @ShellExecuteExA);
        UnhookCode(@ShellExecuteExWCallBack, @ShellExecuteExW);
      end;
  end;
end;

function InstParamStr: String;
var
  Path: array[0..MAX_PATH - 1] of Char;
begin
  If IsLibrary then
    SetString(Result, Path, GetModuleFileName(HInstance, Path, SizeOf(Path)))
end;

begin
  DefaultDll := InstParamStr;
  //we set the dll proc address to the handle events procedure
  DllProc := @HandleEvents;
  //we call the handle address procedure!
  HandleEvents(DLL_PROCESS_ATTACH);



Код ДЛЛ-ки гдето тут на форуме взял, не могу теперь найти где...  smile 

Либо инжектится она не в експлорер, либо хуки не работают, не понимаю... под XP SP2 Prof всё летает на ура, под SP1 вроде тоже не работает... Есть ли универсальный инжект, для любой винды (ну 98 можно не учитывать  smile ) ???

p.s. Сейчас проверил - инжектится туда куда надо, значит проблема с хуками... 
PM MAIL   Вверх
Hacker
Дата 2.6.2006, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Вот кое что накопал... выходит здесь:
Код

If ImageNTHeaders^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress = 0 then Exit;


Неужели никто не в курсе???

Вот я нашёл одну вешь из-за которой это может быть:
Цитата

Если вы читали уже упоминаемую выше книгу Джеффри Рихтера, то могли заметить, что в функции ReplaceIATEntryInOneMod я сделал одно изменение. У него она работала так: в таблице импорта находился список функций того модуля, функция из которого импортировалась, и если в этом списке эта функция не находилась, то ReplaceIATEntryInOneMod больше ничего не делала (т. е. перехват не происходил). Я столкнулся с таким поведением, когда написал тестовую программу на Delphi для примера DriveType2 (этот пример описан ниже, в разделе «Глобальный перехват методом тотального локального перехвата», он перехватывает функцию GetDriveTypeA во всех приложениях с использованием описываемого метода). Тест, написанный на Visual C++, работал прекрасно – функция GetDriveTypeA перехватывалась. А вот программа на Delphi всё равно для всех перехватываемых мной дисков возвращала реальные значения. Я посмотрел таблицу импорта тестовой программы при помощи утилиты DUMPBIN и обнаружил, что компилятор Delphi не поместил все импортируемые функции из kernel32.dll в один список, а разбил их на 3 части, причём GetDriveTypeA оказалась в третьей. Поэтому функция ReplaceIATEntryInOneMod Джеффри Рихтера, просмотрев все функции из первого списка Kernel32.dll, не нашла функции GetDriveTypeA, хотя она и импортировалась модулем DriveTypeTest.exe. Я исправил эту функцию таким образом, чтобы она проверяла всю таблицу импорта и перебирала все списки с функциями из kernel32.dll (как оказалось, их может быть несколько). В описании формата РЕ-файла нигде не оговаривается, что каждый модуль, из которого импортируются функции, должен встречаться в секции импорта только один раз, и, видимо, некоторые компиляторы этим пользуются.

Взято ОТСЮДА
Вот только там всё на сях, ничерта не понял...  smile  
PM MAIL   Вверх
Rouse_
Дата 2.6.2006, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Лови демку, если не разберешся как пользоваться - зови.
Краткое описание: данная библиотека выполненна в виде расширения оболочки и реализует дополнительную закладку при открытии свойств любого исполняемого файла. В закладке отображаются все экспортируюмые и импортируемые функции выбранного объекта...

Чуток сырая, под 2000 не затачивал, нет времени, но по идее должна работать...

Коментариев пока мало... нет времени... 

Присоединённый файл ( Кол-во скачиваний: 85 )
Присоединённый файл  PropertySheet.rar 82,32 Kb


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Rouse_
Дата 2.6.2006, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Да, чуть не забыл для чего выложил демку smile

Обрати внимание на следующий код в модуле DumpUtils.pas

Код

            if Image^.Union.OriginalFirstThunk <> nil then
              Thunk := PImageThunkData32(ImageRvaToVa(ImageInfo.FileHeader,
                ImageInfo.MappedAddress, Image^.Union.Characteristics, pDummy))
            else
              Thunk := PImageThunkData32(ImageRvaToVa(ImageInfo.FileHeader,
                ImageInfo.MappedAddress, DWORD(Image^.FirstThunk), pDummy));


Дело в том что по стандарту таблица должна быть расположена во смещению Image^.Union.OriginalFirstThunk (она же Image^.Union.Characteristics) а также ее дубликат должен храниться в Image^.FirstThunk. 
НО!!! По стандарту ссылки на функции получают через Image^.FirstThunk, поэтому Борланд просто вырезала OriginalFirstThunk, для которой пишется большинство примеров (а они обычно под С++, где данная таблица заполнена), поэтому данные примеры, не обращая внимания на стандарт обращаются для перечисления к OriginalFirstThunk (что есть не верно) и на программах, написанных на Дельфи, попросту не работают... 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Hacker
Дата 3.6.2006, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Посмотрел коды... немного даже понял... спасибо!

Сегодня опять весь день мучился с этими хуками... вот что вышло:
Ставит хук, но при запуске любого процесса Explorer'ом выдаётся ошибка... то есть на место той функции что-то записывается, но что-то не то...

Вот код:
Код

//----------------------------------------------------------------------------//
procedure ReplaceIATEntryInOneMod(pfnCurrent, pfnNew:Pointer; hmodCaller:HMODULE; pszCalleeModName:PChar);
var
  ulSize:Cardinal;
  pImportDesc:PImageImportDescriptor;
  pszModName:PAnsiChar;
  pThunk:PImageThunkData;
  ppfn:Pointer;
  fFound:BOOL;
  dwDummy:DWORD;
  BytesWritten:DWORD;
  pbInFunc:PByte;
begin
  //Получим адрес секции импорта
  pImportDesc := PImageImportDescriptor(ImageDirectoryEntryToData
         (pointer(hmodCaller), TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, ulSize));
  if (pImportDesc = nil) then begin
    MessageBox(0,'Здесь её нет! :(','Блин!..',MB_OK);
    exit;  //Здесь её нет
  end;
  //Найдём нужный модуль
  while pImportDesc.Name<>0 do begin
    pszModName := Pchar(hmodCaller + pImportDesc.Name);
    if (lstrcmpiA(pszModName, pszCalleeModName) = 0) then
    begin
      //Нашли
      MessageBox(0,pszModName,'Гыгы',MB_OK);
      if (pImportDesc.Name = 0) then begin
        MessageBox(0,'Ни одна функция не импортируется! :(','Блин!..',MB_OK);
        Exit;  //Ни одна функция не импортируется
      end;
      //Получим адрес таблицы импорта
      pThunk:=PImageThunkData(dword(hmodCaller) + dword(pImportDesc^.FirstThunk));
      //Переберём все импортируемые функции
      while (pThunk^._function<>nil) do begin
        ppfn := @pThunk^._function^; //Получим адрес функции
        fFound:=(ppfn=pfnCurrent);     //Его ищем?
        {
        if (not fFound) and (dword(ppfn) > dword(sm_pvMaxAppAddr)) then
        begin
          MessageBox(0,'поищем поглубже','!..',MB_OK);
          // Если не нашли, то поищем поглубже.
          // Если мы в Win98 под отладчиком, то
          // здесь может быть push с адресом нашей функции
          MessageBox(0,'поищем поглубже1','!..',MB_OK);
          pbInFunc := pbyte(ppfn^);
          MessageBox(0,'поищем поглубже2','!..',MB_OK);
          if pbInFunc^=cPushOpCode then
          begin
            MessageBox(0,'поищем поглубже3','!..',MB_OK);
            //Да, здесь PUSH
            ppfn := pointer(dword(pbInFunc)+1);
            MessageBox(0,'поищем поглубже4','!..',MB_OK);
            //Наш адрес?
            fFound := (ppfn = pfnCurrent);
          end
        end;
        }
        if (fFound=True) then
        begin
          MessageBox(0,'Нашли!!!','Ураааааа!',MB_OK);
          //Нашли!!!
          //Разрешим запись в эту страницу
          VirtualProtect(ppfn, sizeof(ppfn), PAGE_EXECUTE_READWRITE, @dwDummy);
          //Сменим адрес на свой
          WriteProcessMemory(GetCurrentProcess, ppfn, @pfnNew,
            sizeof(pfnNew), BytesWritten);
          //Восстановим атрибуты
          VirtualProtect(ppfn, sizeof(ppfn), dwDummy , @dwDummy);
          //Готово!!!
          Exit;
        end;
        inc(pThunk);
      end;
    end;
    inc(pImportDesc);
  end; // while
  //Здесь этой функции не нашлось
end;


Устанавливаю так: 
Код

ReplaceIATEntryInOneMod(GetProcAddress(GetModuleHandle('Kernel32.dll'), 'CreateProcessW'),@CreateProcessWCallbackProc,GetModuleHandle(nil),'kernel32.dll');


Функция - перехватчик:
Код

CreateProcessWNextHook: function (appName, cmdLine: pwidechar; processAttr, threadAttr: PSecurityAttributes; inheritHandles: bool; creationFlags: dword; environment: pointer; currentDir: pwidechar; const startupInfo: TStartupInfo; var processInfo: TProcessInformation) : bool; stdcall;

//hooks file opening
function CreateProcessWCallbackProc(appName, cmdLine: pwidechar; processAttr, threadAttr: PSecurityAttributes; inheritHandles: bool; creationFlags: dword; environment: pointer; currentDir: pwidechar; const startupInfo: TStartupInfo; var processInfo: TProcessInformation) : bool; stdcall;
begin
  Result := CreateProcessWNextHook(appName, cmdLine, processAttr, threadAttr, inheritHandles, creationFlags, environment, currentDir, startupInfo, processInfo);
  MessageBox(0,'CreateprocessW','Гы...',MB_OK or MB_ICONINFORMATION);
end;


Объясните пожалуйста что я делаю не так???  smile  
PM MAIL   Вверх
Rouse_
Дата 3.6.2006, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Уважаемый Hacker, вам как в пустой колодец лить...
Только обьяснил как второй раз на грабли не наступить, так Вы опять за старое...
Приведенный код читали? Если читали, то хоть поделитесь тем что вы из него не поняли? 
Объясню... 

Это сообщение отредактировал(а) Rouse_ - 4.6.2006, 13:03


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Hacker
Дата 4.6.2006, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Интересует естественно функция GetImportTable и её переделка под запись в память процесса... Чтобы можно было параметрами ей передать указатели на TargetFunction и NewFunction и указатель на процесс в памяти...  smile  
PM MAIL   Вверх
Rouse_
Дата 4.6.2006, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Вот это твой вариант smile
Цитата(Hacker @  3.6.2006,  19:43 Найти цитируемый пост)
ppfn := @pThunk^._function^; //Получим адрес функции

А вот это мой вариант: 
  FuncAddr := PChar('0x' + IntToHex(DWORD(Thunk^.AddressOfData), 8));

Найди два различия smile

Потом, где проверка на (DWORD(Thunk^.Function_) and IMAGE_ORDINAL_FLAG) = IMAGE_ORDINAL_FLAG

В третьих обради внимание на GetDelayImportTable 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Hacker
Дата 4.6.2006, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Так? 
Код

ppfn := pThunk^._function; //Получим адрес функции

в C++ эта строка вообще была:
Код

PROC* ppfn = (PROC*) &pThunk->u1.Function; //Получим адрес функции


Цитата

Потом, где проверка на (DWORD(Thunk^.Function_) and IMAGE_ORDINAL_FLAG) = IMAGE_ORDINAL_FLAG

А вот это вообще тёмный лес  smile  , вернее не эта сама строка, а то что за ней идёт...

Вот на C++ этот код - что-то я криво перевёл...
Код

void CAPIHook::ReplaceIATEntryInOneMod(PCSTR pszCalleeModName, 
  PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller) 
{
  //Получим адрес секции импорта
  ULONG ulSize;
  PIMAGE_IMPORT_DESCRIPTOR pImportDesc = 
    (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(hmodCaller, TRUE,
    IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize);
  if (pImportDesc == NULL) 
    return;  //Здесь её нет
  //Найдём нужный модуль
  for (; pImportDesc->Name; pImportDesc++) 
  {
    PSTR pszModName = (PSTR)((PBYTE) hmodCaller + pImportDesc->Name);
    if (lstrcmpiA(pszModName, pszCalleeModName) == 0) 
    {
      //Нашли
      if (pImportDesc->Name == 0)
        return;  //Ни одна функция не импортируется
      //Получим адрес таблицы импорта
      PIMAGE_THUNK_DATA pThunk = 
        (PIMAGE_THUNK_DATA)((PBYTE) hmodCaller + pImportDesc->FirstThunk);
      //Переберём все импортируемые функции
      for (; pThunk->u1.Function; pThunk++) 
      {
        PROC* ppfn = (PROC*) &pThunk->u1.Function; //Получим адрес функции
        BOOL fFound = (*ppfn == pfnCurrent);     //Его ищем?
        if (!fFound && (*ppfn > sm_pvMaxAppAddr)) 
        {
          // Если не нашли, то поищем поглубже. 
          // Если мы в Win98 под отладчиком, то
          // здесь может быть push с адресом нашей функции
          PBYTE pbInFunc = (PBYTE) *ppfn;
          if (pbInFunc[0] == cPushOpCode) 
          {
            //Да, здесь PUSH
            ppfn = (PROC*) &pbInFunc[1];
            //Наш адрес?
            fFound = (*ppfn == pfnCurrent);
          }
        }

        if (fFound) 
        { 
          //Нашли!!!
          DWORD dwDummy;
          //Разрешим запись в эту страницу
          VirtualProtect(ppfn, sizeof(ppfn), PAGE_EXECUTE_READWRITE, &dwDummy);
          //Сменим адрес на свой
          WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew, 
            sizeof(pfnNew), NULL);
          //Восстановим атрибуты
          VirtualProtect(ppfn, sizeof(ppfn), dwDummy , &dwDummy);
          //Готово!!!
          return;
        }
      }
    }
  }
  //Здесь этой функции не нашлось
}

 
PM MAIL   Вверх
Rouse_
Дата 5.6.2006, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29





--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Hacker
Дата 5.6.2006, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Цитата(Rouse_ @  5.6.2006,  08:28 Найти цитируемый пост)
Посмотри вот тут http://forum.vingrad.ru/index.php?showtopi...st&p=721643 


Странно, но работает на всём кроме Explorer'a...  smile    (Win XP Prof SP2)
Посмотри сам...

Причём все действия нужные выполняет - заходит в эту ветку:
Код

            begin // ... ну а если не получилось - тогда вот так
              MessageBox(0,pchar('... ну а если не получилось - тогда вот так'),'Info',MB_OK or MB_ICONINFORMATION);
              if VirtualProtect(@Thunk^._function, SizeOf(DWORD),
                PAGE_EXECUTE_READWRITE, Protect) then
              begin
                MessageBox(0,pchar('доступ разрешён!'),'Info',MB_OK or MB_ICONINFORMATION);
                Thunk^._function := NewProc;
                newProtect := Protect;
                VirtualProtect(@Thunk^._function, SizeOf(DWORD),
                  newProtect, Protect);
                Result := True;
              end else
                MessageBox(0,pchar('доступ запрещён!'),'Info',MB_OK or MB_ICONINFORMATION);
            end;

пишет 'доступ разрешён!'

Накатал на дельфи подопытную прогу, на ней нормально работает... но мне то нужно именно для проводника...  smile 

PS: Можно небольшой вопросик не по теме... А как пользоваться твоей либой (PropertySheet), чёт я не допёр... а то лежит на диске такая нужная вещь, а я ей не пользуюсь  smile  
PM MAIL   Вверх
Rouse_
Дата 5.6.2006, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Цитата(Hacker @  5.6.2006,  16:05 Найти цитируемый пост)
но мне то нужно именно для проводника... 

Хм, антивирей не стоит случаем? они могут тушить такие попытки...

Цитата(Hacker @  5.6.2006,  16:05 Найти цитируемый пост)
А как пользоваться твоей либой (PropertySheet), чёт я не допёр... а то лежит на диске такая нужная вещь, а я ей не пользуюсь     

Собираешь библиотеку, потом делаешь 
Код

regsvr32  <путь к библиотеке>\PEDump.dll
после чего щелкай на любом исполняемом файле - появиться дополнительная вкладка. Проверял под ХР SP2, под 2000 не проверял, поэтому там может быть ошибка с закрытием эксплорера (хотя люди тестировали - вроде как нормально). 
Чтобы деинсталировать:
Код

regsvr32 /u  <путь к библиотеке>\PEDump.dll
 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Hacker
Дата 5.6.2006, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Цитата(Rouse_ @  5.6.2006,  15:33 Найти цитируемый пост)
Хм, антивирей не стоит случаем? они могут тушить такие попытки...


Нет, это исключено, я же своим кодом проверял, работает, а этот не хочет...


PS: Установил PEDump, полезная штука, спасибо! 
PM MAIL   Вверх
Yanis
Дата 5.6.2006, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



Цитата(Rouse_ @  5.6.2006,  16:33 Найти цитируемый пост)
Собираешь библиотеку, потом делаешь
...
после чего щелкай на любом исполняемом файле - появиться дополнительная вкладка. Проверял под ХР SP2, под 2000 не проверял, поэтому там может быть ошибка с закрытием эксплорера (хотя люди тестировали - вроде как нормально). 
Чтобы деинсталировать:

Rouse_
Привет. Извиняюсь за оффтоп, но .... . Всё таки на delphimaster ты меня так и не послушал и, как мне показалось, проигнорировал. А я говорил, что при просмотре закладки "импорта/экспорта", падает Explorer при перерисовке Label "Импорт". Если всё таки стало интересно, то напиши пожалуйста в PM и стукни в ICQ.

Добавлено @ 17:59 
Поправочка. Label "Экспорт". 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Rouse_
Дата 5.6.2006, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Цитата(Yanis @  5.6.2006,  18:51 Найти цитируемый пост)
Привет. Извиняюсь за оффтоп, но .... . Всё таки на delphimaster ты меня так и не послушал и, как мне показалось, проигнорировал. А я говорил, что при просмотре закладки "импорта/экспорта", падает Explorer при перерисовке Label "Импорт". Если всё таки стало интересно, то напиши пожалуйста в PM и стукни в ICQ.

Я не проигнорировал smile Дело в том что неначем проверить, и причина падения при банальной отрисовке также не понятна... 
Хотя может дело в том, что при отсутствии экспорта данный элемент скрывается...
Ммм, не знаю, если не в этом, то тут явно что-то глубже.
Кстати, ты под какой системой проверял?

Добавлено @ 19:30 
Цитата(Hacker @  5.6.2006,  17:07 Найти цитируемый пост)
Нет, это исключено, я же своим кодом проверял, работает, а этот не хочет...

Как появиться время, попробую поэксперементировать что там не работает у тебя...

Добавлено @ 19:43 
Yanis, проверь вот такой вариант:


Код

    WM_CTLCOLORSTATIC:
    begin
      if not IsWindowVisible(WindowFromDC(WParam)) then Exit;
      SetBkMode(WParam, TRANSPARENT);
      Result := GetStockObject(NULL_BRUSH);
      Exit;
    end;


Кстати, тут нехилая утечка памяти на GetStockObject, его вызов нужно вынести в WM_INITDIALOG и сохранить в внешней переменной, а по  WM_DESTROY разрушить через DeleteObject...

Говорю же, сыровато чуть... Нет времени дорасти до полноценной демки smile Поэтому и с сайта убрал... 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1041 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.