Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.08.2011, 03:19   #1
Nebro
Пользователь
 
Регистрация: 04.03.2011
Сообщений: 22
По умолчанию dll inject

Пытаюсь сделать dll injector для cs1.6 (Переделать из готового исходника), но пока что ничего не выходит ^^

Сам исходник:
Код:
function EnablePrivilege(Privilege: string): Boolean;
var
  TokenHandle: THandle;
  TokenPrivileges: TTokenPrivileges;
  ReturnLength: Cardinal;
begin
  Result := False;
  if Windows.OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TokenHandle) then
  begin
    try
      LookupPrivilegeValue(nil, PChar(Privilege), TokenPrivileges.Privileges[0].Luid);
      TokenPrivileges.PrivilegeCount := 1;
      TokenPrivileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      if AdjustTokenPrivileges(TokenHandle, False, TokenPrivileges, 0, nil, ReturnLength) then
        Result := True;
    finally
      CloseHandle(TokenHandle);
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
PID:DWORD;
begin
  Edit2.Text:=inttostr(GetWindowThreadProcessId(findwindow(nil,'Counter-Strike'), @PID));
  EnablePrivilege('SeDebugPrivilege');

end;

function IsModuleLoaded(ModulePath: PAnsiChar; ProcessID: DWORD): Boolean;
var
  hSnapshot: THandle;
  ModuleEntry32: TModuleEntry32;
begin
  Result := False;
  hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessID);
  if (hSnapshot <> -1) then
  begin
    ModuleEntry32.dwSize := SizeOf(TModuleEntry32);
    if (Module32First(hSnapshot, ModuleEntry32)) then
      repeat
        if string(ModuleEntry32.szExePath) = string(ModulePath) then
        begin
          Result := True;
          Break;
        end;
      until
        not Module32Next(hSnapshot, ModuleEntry32);
    CloseHandle(hSnapshot);
  end;
end;

function InjectModule(ModulePath: PAnsiChar; ProcessID: DWORD): Boolean;
type
  TNtCreateThreadEx = function(
  ThreadHandle: PHANDLE;
  DesiredAccess: ACCESS_MASK;
  ObjectAttributes: Pointer;
  ProcessHandle: THANDLE;
  lpStartAddress: Pointer;
  lpParameter: Pointer;
  CreateSuspended: BOOL;
  dwStackSize: DWORD;
  Unknown1: Pointer;
  Unknown2: Pointer;
  Unknown3: Pointer): HRESULT; stdcall;
var
  lpStartAddress, lpParameter: Pointer;
  dwSize: Integer;
  hProcess, hThread, lpThreadId, lpExitCode, lpBytesWritten: Cardinal;
  NtCreateThreadEx: TNtCreateThreadEx;
begin
  Result := False;
  if IsModuleLoaded(ModulePath, ProcessID) = True then
    Exit;
  hProcess := 0;
  hProcess := OpenProcess(MAXIMUM_ALLOWED, False, ProcessID);
  if hProcess = 0 then
    Exit;
  dwSize := StrLen(ModulePath) + 1;
  lpParameter := VirtualAllocEx(hProcess, nil, dwSize, MEM_COMMIT, PAGE_READWRITE);
  if (lpParameter = nil) then
  begin
    if hProcess <> 0 then
      CloseHandle(hProcess);
    Exit;
  end;
  if GetOSVersion >= 60 then
    NtCreateThreadEx := GetProcAddress(GetModuleHandleW('ntdll'), 'NtCreateThreadEx');
  lpStartAddress := GetProcAddress(GetModuleHandleW('kernel32'), 'LoadLibraryA');
  if (lpStartAddress = nil) then
    Exit;
  if GetOSVersion >= 60 then
    if (@NtCreateThreadEx = nil) then
      Exit;
  lpBytesWritten := 0;
  if (WriteProcessMemory(hProcess, lpParameter, ModulePath, dwSize, lpBytesWritten) = False) then
  begin
    VirtualFreeEx(hProcess, lpParameter, 0, MEM_RELEASE);
    if hProcess <> 0 then
      CloseHandle(hProcess);
    Exit;
  end;
  hThread := 0;
  lpThreadId := 0;
  if GetOSVersion >= 60 then
    NtCreateThreadEx(@hThread, MAXIMUM_ALLOWED, nil, hProcess, lpStartAddress, lpParameter, false, 0, 0, 0, 0)
  else
    hThread := CreateRemoteThread(hProcess, nil, 0, lpStartAddress, lpParameter, 0, lpThreadId);
  if (hThread = 0) then
  begin
    VirtualFreeEx(hProcess, lpParameter, 0, MEM_RELEASE);
    CloseHandle(hProcess);
    Exit;
  end;
  GetExitCodeThread(hThread, lpExitCode);
  if hProcess <> 0 then
    CloseHandle(hProcess);
  if hThread <> 0 then
    CloseHandle(hThread);
  Result := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  InjectModule('KzH.dll',strtoint(Edit2.Text))
end;
end.
Дело в том, что вроде бы всё и идёт как надо, PID определяет, но вот саму дллку (KzH.dll) не инжектит. Хелп.

Последний раз редактировалось Nebro; 21.08.2011 в 07:43.
Nebro вне форума Ответить с цитированием
Старый 22.08.2011, 09:10   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Отладчик что говорит ?
mss вне форума Ответить с цитированием
Старый 22.08.2011, 09:41   #3
Nebro
Пользователь
 
Регистрация: 04.03.2011
Сообщений: 22
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
Отладчик что говорит ?
Он Молчит ^^
Nebro вне форума Ответить с цитированием
Старый 22.08.2011, 09:49   #4
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Так ты у него ничего не спрашиваешь - вот он и молчит)
mss вне форума Ответить с цитированием
Старый 22.08.2011, 18:03   #5
Larboss
Недо
Участник клуба
 
Регистрация: 11.08.2011
Сообщений: 1,394
По умолчанию

Делай инжектирование, используя хук. У меня тоже не получилось сделать инжект через удаленный поток, хоть и отлаживал каждую строчку кода.
С помощью программирования можно разбогатеть и изменить мир к лучшему (с) Бьерн Страуструп
Larboss вне форума Ответить с цитированием
Старый 22.08.2011, 19:13   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Nebro, доведу до сведенья, что твои длл'ки, гружоные таким образом, пойдут лесом у первого же нормального античита работающего из под ring0.
Человек_Борща вне форума Ответить с цитированием
Старый 22.08.2011, 21:21   #7
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
отлаживал каждую строчку кода
Если бы каждую, то ты бы осчастливил почтенную публику действительной причиной отказа при инжекте.
mss вне форума Ответить с цитированием
Старый 22.08.2011, 23:09   #8
Larboss
Недо
Участник клуба
 
Регистрация: 11.08.2011
Сообщений: 1,394
По умолчанию

Причина отказа мне не известна. При отладке все нормально - даже поток делал в режиме SUSPENDED, чтобы проверить....хотя где-то мелкал код ошибки 5, тобишь ACCESS_DENIED...привилегии использовал...

Держи код, методом хука.
ДЛЛ:
Код:
library lib0;

uses
  Messages,
  Windows;

function Answer(nCode: integer; wprm: WParam; lprm: LParam): LResult; stdcall;
type
  PMsg = ^TMsg;
var
  buffer: array [0 .. MAX_PATH] of Char;
  cd: TCopyDataStruct;
  msg: PMsg;
  Caller: HWND;
  AHook: HHook;
begin
  result := 0;
  msg := PMsg(lprm);
  if (msg.Message = 0) and (msg.LParam <> 0) then
  begin
    AHook := msg.LParam;
    Caller := msg.WParam;
    cd.cbData := GetModuleFileName(0, buffer, SizeOf(buffer)) + 1;
    cd.lpData := @buffer;
    cd.dwData := GetCurrentThreadID;
    SendMessage(Caller, WM_COPYDATA, 0, LParam(@cd));
    UnHookWindowsHookEx(AHook);
    PostThreadMessage(GetCurrentThreadID, 0, 0, 0);
  end;
end;

procedure QryName(tid: DWord; Caller: HWND);
var
  AHook: HHook;
begin
  AHook := SetWindowsHookEx(WH_GETMESSAGE, Answer, Hinstance, tid);
  if AHook <> 0 then
    PostThreadMessage(tid, 0, Caller, AHook);
end;

exports QryName;

begin
 MessageBox(0,'олололо, я загрузилась!!!!!','ололо',0);
end.
В модуле описание:
Код:
procedure QryName(threadID: DWord; Caller: HWND); external 'lib0.dll';
Ну а как вызвать думаю разберешься =)
С помощью программирования можно разбогатеть и изменить мир к лучшему (с) Бьерн Страуструп
Larboss вне форума Ответить с цитированием
Старый 24.08.2011, 03:19   #9
Nebro
Пользователь
 
Регистрация: 04.03.2011
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Larboss Посмотреть сообщение
Причина отказа мне не известна. При отладке все нормально - даже поток делал в режиме SUSPENDED, чтобы проверить....хотя где-то мелкал код ошибки 5, тобишь ACCESS_DENIED...привилегии использовал...

Держи код, методом хука.
ДЛЛ:
Благодарствую
Тему можно закрыть.
Nebro вне форума Ответить с цитированием
Старый 24.08.2011, 03:21   #10
Nebro
Пользователь
 
Регистрация: 04.03.2011
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Nebro, доведу до сведенья, что твои длл'ки, гружоные таким образом, пойдут лесом у первого же нормального античита работающего из под ring0.
Это не страшно)
Nebro вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить SIZEMEM у DLL(Размер dll в памяти процесса) Человек_Борща Общие вопросы Delphi 6 22.07.2011 20:54
Пытаюсь понять код user32.dll и gdi32.dll Beermonza Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 43 13.07.2010 15:09
[DLL] Загрузка и выгрузка dll в/из чужого процесса Человек_Борща Win Api 4 28.02.2010 17:47
Ошибка при выхове функций Bass.dll из другой DLL SalasAndriy Общие вопросы Delphi 7 21.10.2009 23:36