Компоненты для Delphi/C++Builder ~ Components for Delphi/C++Builder 6

Status
Not open for further replies.

Small Donkey

Member
Joined
Aug 25, 2008
Messages
36
Reaction score
124
Injector

Компонент для инжекта dll в выбранный процесс

Инжект из 64 битных процессов в 32/64 битные в Windows 64 бит, из 32 битных процессов в 32 битные в Windows 32/64 бит

Windows 2003/XP/Vista/7/8

Delphi XE2, XE3, XE4, 32/64 бит DCU

Injector
 
Last edited by a moderator:

vogel

Member
Joined
Nov 11, 2008
Messages
6
Reaction score
6
Age
35
Компонент для инжекта dll в выбранный процесс

Инжект из 64 битных процессов в 32/64 битные в Windows 64 бит, из 32 битных процессов в 32 битные в Windows 32/64 бит

Windows 2003/XP/Vista/7/8

Delphi XE2 32/64 бит DCU
Я надеюсь, что ты просто толстый троль, потому что только слабоумные могут пытаться продать общеизвестный код инжекта за 300 баксов.

Для тех, кому лень ходить по ссылкам ниже код который использую я.

Code:
const
  DllName = 'thread_splice_lib.dll';
 
function InjectLib(ProcessID: Integer): Boolean;
var
  Process: HWND;
  ThreadRtn: FARPROC;
  DllPath: AnsiString;
  RemoteDll: Pointer;
  BytesWriten: DWORD;
  Thread: DWORD;
  ThreadId: DWORD;
begin
  Result := False;
  // Открываем процесс
  Process := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or
    PROCESS_VM_WRITE, True, ProcessID);
  if Process = 0 then Exit;
  try
    // Выделяем в нем память под строку
    DllPath := AnsiString(ExtractFilePath(ParamStr(0)) + DLLName) + #0;
    RemoteDll := VirtualAllocEx(Process, nil, Length(DllPath),
      MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
    if RemoteDll = nil then Exit;
    try
      // Пишем путь к длл в его адресное пространство
      if not WriteProcessMemory(Process, RemoteDll, PChar(DllPath),
        Length(DllPath), BytesWriten) then Exit;
      if BytesWriten <> DWORD(Length(DllPath)) then Exit;
      // Получаем адрес функции из Kernel32.dll
      ThreadRtn := GetProcAddress(GetModuleHandle('Kernel32.dll'), 'LoadLibraryA');
      if ThreadRtn = nil then Exit;
      // Запускаем удаленный поток
      Thread := CreateRemoteThread(Process, nil, 0, ThreadRtn, RemoteDll, 0, ThreadId);
      if Thread = 0 then Exit;
      try
        // Ждем пока удаленный поток отработает...
        Result := WaitForSingleObject(Thread, INFINITE) = WAIT_OBJECT_0;
      finally
        CloseHandle(Thread);
      end;
    finally
      VirtualFreeEx(Process, RemoteDll, 0, MEM_RELEASE);
    end;
  finally
    CloseHandle(Process);
  end;
end;

Принцип данного метода был описан еще у Рихтера, поэтому на нем останавливаться не буду.
А для выгрузки необходимо реализовать следующий код:

Code:
function ResumeLib(ProcessID: Integer): Boolean;
var
  hLibHandle: THandle;
  hModuleSnap: THandle;
  ModuleEntry: TModuleEntry32;
  OpCodeData: Word;
  Process: HWND;
  BytesWriten: DWORD;
  Thread: DWORD;
  ThreadId: DWORD;
  ExitCode: DWORD;
  PLibHandle: PDWORD;
  OpCode: PWORD;
  CurrUnloadAddrOffset: DWORD;
  UnloadAddrOffset: DWORD;
begin
  Result := False;
 
  // рассчитываем оффсет адреса выгрузки библиотеки относительно адреса ее загрузки
  hLibHandle := LoadLibrary(PChar(DLLName));
  try
    UnloadAddrOffset :=
      DWORD(GetProcAddress(hLibHandle, 'SelfUnload')) - hLibHandle;
    if UnloadAddrOffset = -hLibHandle then Exit;
  finally
    FreeLibrary(hLibHandle);
  end;
 
  // Находим адрес библиотеки в чужом адресном пространстве
  hModuleSnap := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessID);
  if hModuleSnap <> INVALID_HANDLE_VALUE then
  try
    FillChar(ModuleEntry, SizeOf(TModuleEntry32), #0);
    ModuleEntry.dwSize := SizeOf(TModuleEntry32);
    if not Module32First(hModuleSnap, ModuleEntry) then Exit;
    repeat
      if AnsiUpperCase(ModuleEntry.szModule) =
        AnsiUpperCase(DLLName) then
      begin
        // Получаем адрес функции выгрузки
        CurrUnloadAddrOffset := ModuleEntry.hModule + UnloadAddrOffset;
        Break;
      end;
    until not Module32Next(hModuleSnap, ModuleEntry);
  finally
    CloseHandle(hModuleSnap);
  end;
 
  // Открываем процесс
  Process := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or
    PROCESS_VM_WRITE, True, ProcessID);
  if Process = 0 then Exit;
  try
    // Пишем опкод jmp [ebx]
    OpCode := VirtualAllocEx(Process, nil, 2,
      MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
    if OpCode = nil then Exit;
    try
      OpCodeData := $23FF;
      if not WriteProcessMemory(Process, OpCode, @OpCodeData,
        2, BytesWriten) then Exit;
 
      // Пишем адрес функции выгрузки (он будет лежать в EBX при старте потока)
      PLibHandle := VirtualAllocEx(Process, nil, 4,
        MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
      if PLibHandle = nil then Exit;
      try
        if not WriteProcessMemory(Process, PLibHandle, @CurrUnloadAddrOffset,
          4, BytesWriten) then Exit;
 
        // запускаем поток
        Thread := CreateRemoteThread(Process, nil, 0, OpCode,
          PLibHandle, 0, ThreadId);
        if Thread = 0 then Exit;
        try
          // Ждем пока удаленный поток отработает...
          if (WaitForSingleObject(Thread, INFINITE) = WAIT_OBJECT_0) then
            if GetExitCodeThread(Thread, ExitCode) then
              Result := ExitCode = 0;
        finally
          CloseHandle(Thread);
        end;
      finally
        VirtualFreeEx(Process, PLibHandle, 0, MEM_RELEASE);
      end;
    finally
      VirtualFreeEx(Process, OpCode, 0, MEM_RELEASE);
    end;
  finally
    CloseHandle(Process);
  end;
end;
 
Last edited by a moderator:

Small Donkey

Member
Joined
Aug 25, 2008
Messages
36
Reaction score
124
Я надеюсь, что ты просто толстый троль, потому что только слабоумные могут пытаться продать общеизвестный код инжекта за 300 баксов.

Все это не будет работать если вы хотите из под 64 битного процесса инжектировать в 32 битный процесс

32 бит процесс -> 32 бит процесс
64 бит процесс -> 64 бит процесс
64 бит -> 32 бит не получится

Нет юникода

В Windows 8 - 100% не будет работать UnInject

Вообще что бы выгрузить "чужую" dll нужно сначала установить счетчик Load Count = 1, в Windows 8 уже так не прокатывает

Дальше почитайте "Попробывал сделать инжект длл к другому процессу, но дллка не присоединилась. Код идентичный, что здесь. Почему не получается? Win7 x64"

Абсолютно рабочий компонент пользуйтесь DCU как хотите, в чем проблема?
 
Last edited by a moderator:

Small Donkey

Member
Joined
Aug 25, 2008
Messages
36
Reaction score
124
Code:
pThreadStart := GetProcAddress(GetModuleHandle('KERNEL32.DLL'), PAnsiChar('LoadLibraryA'));

Полный бред, вы получаете адрес функции LoadLibraryA из KERNEL32.DLL в своем процессе, нужно прочитать память процесса в который будете внедрять dll и там найти адрес функции LoadLibrary и уже тогда CreateRemoteThread

Добавлено через 16 минут
Ответьте что будет если в вашем процессе будет установлен hook на функцию LoadLibrary, так например делают антивирусы для самозащиты
 
Last edited by a moderator:

hp1361

Member
Joined
Apr 11, 2009
Messages
11
Reaction score
40
Age
42
WPTools v6.29.1 Standard Edition
download

Добавлено через 57 секунд
Jam ShellBrowser v8.1.2 Delphi Edition Full Sources
download

Добавлено через 3 минуты
Absolute Database Multi-User Edition v7.20 for D7-DXE4 FullSource
download

[dcc32 Fatal Error] WPTools6_XE3.dpk(45): F1026 File not found: 'WPTools_Reg.dcu'
 

mrtr0101

Member
Joined
Jan 12, 2010
Messages
34
Reaction score
124
Age
44
FastReport .Net 1.8.30 (.Net2 , .Net4) + crack

.Net2


.Net4

Добавлено через 1 минуту
FastReport .Net 1.8.30 (.Net2 , .Net4) + crack

.Net2


.Net4
 
Last edited by a moderator:

carmax

Member
Joined
Mar 21, 2009
Messages
5
Reaction score
39
mrtr0101
Не удается загрузить файл
Jam ShellBrowser v8.1.2 Delphi Edition Full Sources
пожалуйста, зеркала
поблагодарить
 
Status
Not open for further replies.
Top