Модераторы: 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   Вверх
Yanis
Дата 5.6.2006, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Rouse_ @  5.6.2006,  20:28 Найти цитируемый пост)
Кстати, ты под какой системой проверял?

WinXP sp2 английская версия с руссификатором, но язык тут роли не играет. Стили оформления включены.

Цитата(Rouse_ @  5.6.2006,  20:28 Найти цитируемый пост)
Хотя может дело в том, что при отсутствии экспорта данный элемент скрывается...

Странно уже, то что этот случай не единичный и повторился именно у меня smile Я просто беру и перетаскиваю целиком окошко свойст вниз экрана и тогда уже возникает ошибка. Но если убрать всего лишь одну строчку
Код
SetBkMode(WParam, TRANSPARENT);

из модуля PropSheet, то всё работает нормально smile 


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


Опытный
**


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

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



Хм, системы у нас одинаковые, только у меня чистая без всяких русификаторов... Попробуй изменить код, как я показал... 


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


Эксперт
****


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

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



Веришь или нет так ещё хуже =) Даже не знаю, ты наверное думаешь, что у меня руки кривые но так или иначе поиграв с окошком я могу добиться критической ошибки smile
PS. С изменённым, как ты показал, кодом улучшений замечено небыло. Незнаю чем тебе помочь, видео что ли записать.... 


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


Опытный
**


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

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



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


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


Опытный
**


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

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



Разобрались мы с Yanis-ом в причинах глюка. Данная ошибка проявиться при включенной проверке на выход за пределы диапазона. Потому, кто будет в дальнейшем собирать в начале кода объявите директиву {$R-}... 


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


Эксперт
****


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

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



Итак...

Отдельно.
Rouse_
Спасибо за разборку.

В общем благодаря Rouse_'у мы вяснили суть проблемы, которая меня (странно, что меня одного) мучала. Достаточно было отключить в опциях компилятора проверку выходов за границу (Project -> Options -> закладка Compiler -> Опция Range Checking) как всё сразу заработало по задуманному варианту smile 


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


Новичок



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

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



А у меня проблема с инжектом длл в explorer.exe когда моя dll детачится сразу же после аттача
PM MAIL   Вверх
Firster
Дата 18.8.2007, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ребята, помогите пожалуйста. Нужна консультация в таком вопросе. Поставлена задача определить запуск приложения в Винде. Вариант использования таймера, пожалуйста, не предлагать. Я обходил множество форумов в поиске решения. Предлагают сделать перехват CsrClientCallServer в файле csrss.exe. Есть еще вариант внедрения во все запущенные процессы CreateProcess. Перелопал кучу кода. Голова уже забита всякой ерундой. Если кто-нибуть сталкивался с этим НАПРАВЬТЕ НА ПУТЬ истинный. Заранее ОГРОМНОЕ СПАСИБО.

PM MAIL   Вверх
ne0n
Дата 18.8.2007, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PlayBoy
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 5.8.2005
Где: Н.Новгород

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



Firster, во первых зачем поднимать старую тему, которой уже почти год(не поленился бы создать свою)...а во вторых
Цитата(Firster @  18.8.2007,  00:09 Найти цитируемый пост)
 Есть еще вариант внедрения во все запущенные процессы CreateProcess.


это че такое??? может быть перехват CreateProcess?! господи в сети полно примеров перехвата!!!
Блин пораб линки на статьи мс-рема куданибудь в шапку внести....
вот тебе чтиво:http://www.wasm.ru/article.php?article=apihook_1
PM MAIL ICQ   Вверх
Firster
Дата 18.8.2007, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасибо за помощь...
PM MAIL   Вверх
Firster
Дата 19.8.2007, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ne0n, дружище просвети меня еще раз, пожалуйста. Взял исходник у Ms-Rem. Вставил в него обработку
CreateProcess. Так вот. перехват происходит, но далее вылетает ошибка. Может подскажешь что-нить. Любые мысли по этому поводу приветствуются. Заранее спасибо.

Код

program aHookProc;

uses
  Windows, Dialogs,
  advApiHook;

var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;


TrueZwCreateProcess :Function (lpApplicationName: LPCTSTR; // имя исполняемого модуля
                        lpCommandLine: LPCTSTR; // строка параметров запускаемой программы
                        lpProcessAttributes: PSecurityAttributes; // структура SECURITY_ATTRIBUTES процесса
                        lpThreadAttributes: PSecurityAttributes; // структура SECURITY_ATTRIBUTES потока
                        bInheritHandles: LongBool; // флаг наследования текущего процесса
                        dwCreationFlags: DWORD; // флаги способов создания процесса
                        lpEnvironment: Pointer; // указатель на блок среды
                        lpCurrentDirectory: LPCTSTR; // текущий диск и каталог
                        lpStartupInfo:PStartupInfo; // структура STARTUPINFO
                        lpProcessInformation: PProcessInformation // структура PROCESS_INFORMATION
                        ): LongBool; stdcall;

Function NewZwCreateProcess(lpApplicationName: LPCTSTR; // имя исполняемого модуля
                        lpCommandLine: LPCTSTR; // строка параметров запускаемой программы
                        lpProcessAttributes: PSecurityAttributes; // структура SECURITY_ATTRIBUTES процесса
                        lpThreadAttributes: PSecurityAttributes; // структура SECURITY_ATTRIBUTES потока
                        bInheritHandles: LongBool; // флаг наследования текущего процесса
                        dwCreationFlags: DWORD; // флаги способов создания процесса
                        lpEnvironment: Pointer; // указатель на блок среды
                        lpCurrentDirectory: LPCTSTR; // текущий диск и каталог
                        lpStartupInfo:PStartupInfo; // структура STARTUPINFO
                        lpProcessInformation: PProcessInformation // структура PROCESS_INFORMATION
                        ): LongBool; stdcall;
  begin
   ShowMessage('GetPathFromId(Info.ProcessId)');
   Result := TrueZwCreateProcess(lpApplicationName, // имя исполняемого модуля
                        lpCommandLine, // строка параметров запускаемой программы
                        lpProcessAttributes, // структура SECURITY_ATTRIBUTES процесса
                        lpThreadAttributes, // структура SECURITY_ATTRIBUTES потока
                        bInheritHandles, // флаг наследования текущего процесса
                        dwCreationFlags, // флаги способов создания процесса
                        lpEnvironment, // указатель на блок среды
                        lpCurrentDirectory, // текущий диск и каталог
                        lpStartupInfo, // структура STARTUPINFO
                        lpProcessInformation);


  end;


begin
  HookProc('ntdll.dll', 'ZwCreateProcess', @NewZwCreateProcess, @TrueZwCreateProcess);
  sleep(2000);

  ZeroMemory(@StartInfo, SizeOf(TStartupInfo));
  StartInfo.cb := SizeOf(TStartupInfo);

  CreateProcess(nil, 'notepad.exe', nil, nil, False, 0, nil, nil, StartInfo, ProcInfo);

  UnhookCode(@TrueZwCreateProcess);
  MessageBoxA(0, 'Перехват снят.', 'HookProc', 0);
end.


PM MAIL   Вверх
Firster
Дата 21.8.2007, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Если еще кто-нить столкнется с такой проблемой, посоветую перехватывать ZwCreateThread. Т.е. в вышеприведенном коде нужно заменить ZwCreateProcess на ZwCreateThread и все будет ОК. Спасибо ne0n  за напутствие. 
Цитата

ne0n позакал тропинку, а я вышел по ней на дорогу....

PM MAIL   Вверх
ne0n
Дата 21.8.2007, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PlayBoy
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 5.8.2005
Где: Н.Новгород

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



Firster,  всегда рад помоч!
PM MAIL ICQ   Вверх
Firster
Дата 25.8.2007, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Опять проблема ne0n. Не могу прилепить ДЛЛ к эксплореру. Ко всем другим процессам в системе Инжект происходит нормально. А вот к ЭКСПЛОРЕРу не хочет. Может опять на тропинку поставишь....Заранее спасибо
PM MAIL   Вверх
ne0n
Дата 25.8.2007, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PlayBoy
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 5.8.2005
Где: Н.Новгород

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



Firster, а ты как библиотеку инжектишь?!
PM MAIL ICQ   Вверх
Firster
Дата 25.8.2007, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Библиотеку инжекчу из ЕХЕ-файла. 
Код

 hProc:= OpenProcessEx(PIDExplorer);
 if InjectDll(hProc, 'HookLib.dll') then Memo1.Lines.Add('Ок')
                                                 else Memo1.Lines.Add('Нет');

PM MAIL   Вверх
ne0n
Дата 25.8.2007, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PlayBoy
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 5.8.2005
Где: Н.Новгород

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



hProc значение проверял...не нулевое?!

Это сообщение отредактировал(а) ne0n - 25.8.2007, 22:54
PM MAIL ICQ   Вверх
Firster
Дата 25.8.2007, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот процедура, которая при загрузке приложения по OnCreate вызывается.
Код

procedure TForm1.LoadFirstTable;
var Hdl:Cardinal;
    pe32: TProcessEntry32;
    item:TListItem;
    hProc:THandle;
begin
   ListView1.Clear;
   Hdl:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS , 0);
   if Hdl=INVALID_HANDLE_VALUE then
                                    begin
                                      showmessage('Error in call CreateToolhelp32Snapshot!!!');
                                      exit;
                                    end;
   try
      pe32.dwSize := SizeOf(TProcessEntry32);
      if Process32First(Hdl,pe32) then
      repeat
       item:=ListView1.Items.Add;
       item.Caption:=inttostr(pe32.th32ProcessID);
       item.SubItems.Add(Format('%s',[pe32.szExeFile]));

       EnableDebugPrivilege();
       hProc:= OpenProcessEx(pe32.th32ProcessID);
       if InjectDll(hProc, 'HookLib.dll') then Memo1.Lines.Add('Injecting to hProc='+inttostr(hProc)+'  '+Format('%s',[pe32.szExeFile]))
                                          else Memo1.Lines.Add('Injecting falled '+inttostr(hProc)+'  '+Format('%s',[pe32.szExeFile]));

      until not Process32Next(Hdl,pe32);
    finally CloseHandle(Hdl);
    end;
end;



Добавлено через 2 минуты и 46 секунд
Пишет, что вроде бы ИНЖЕКТ установлен нормально, но реально НЕТ. Например, если ВинКомандер запущен, то ДЛЛ отлавливает запуск из него ЕХЕшников. А ЭКСПЛОРЕР молчит....
PM MAIL   Вверх
ne0n
Дата 25.8.2007, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PlayBoy
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 5.8.2005
Где: Н.Новгород

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



попробуй InjectDllAlt...а вообще лучше внедрять через ловушки!
PM MAIL ICQ   Вверх
Firster
Дата 25.8.2007, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



зависает

Добавлено через 15 секунд
буду пробовать через ДЛЛ
PM MAIL   Вверх
ne0n
Дата 25.8.2007, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PlayBoy
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 5.8.2005
Где: Н.Новгород

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



Firster, так библеотека внедрена или нет?!
(а вообще внедряться во все подряд нельзя...система может рухнуть)


Это сообщение отредактировал(а) ne0n - 25.8.2007, 23:13
PM MAIL ICQ   Вверх
Firster
Дата 25.8.2007, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Библиотека внедряется через InjectDll(hProc, 'HookLib.dll'). В ней заложены функции перехвата АПИ функций.

Добавлено через 1 минуту и 21 секунду
и при перехвате вызова АПИ-функции она отправляет сообщение проге. Вот так я узнаю, что в системе запущен очередной процесс (программа)
PM MAIL   Вверх
Firster
Дата 26.8.2007, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



neOn, ты не поверишь, но получилось!!! Все согласно старой мудрости: "Если ничего не получается начни сначала...вернись к истокам!". И вот вернулся вначало

а вот этот код у меня заработал:
Код

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;


хуки работаю как часики....
Спасибо Hacker за исток и neOn за поддержку!
PM MAIL   Вверх
Страницы: (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.1706 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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