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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2011, 23:12   #1
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
Вопрос Создание трейнера

есть код:
Код:
function InjectLibraryAPI(lpProcessID: Cardinal; lpDllname: String): LongBool;
var
 hProc: Cardinal;
 oAlloc: Pointer;
 cWPM: Cardinal;
 hRemThread: Cardinal;

begin
 result := false;
 SetLastError(ERROR_SUCCESS);
 hProc := OpenProcess(PROCESS_ALL_ACCESS, false, lpProcessID); // открываем процесс
 if hProc <> 0 then begin
    oAlloc := VirtualAllocEx(hProc, 0, length(lpDllname), MEM_COMMIT, PAGE_EXECUTE_READWRITE); // если существует выделяем память в процессе
 if oAlloc <> nil then begin
 if WriteProcessMemory(hProc, oAlloc, PChar(lpDllName), length(lpDllName), cWPM) = true then begin // если получилось выделить, то копируем 
туда содержимое своей DLL
    CreateRemoteThread(hProc, nil, 0, GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA'), oAlloc, 0, hRemThread); // создаем 
удаленный поток, по адресу kernel32.dll -> LoadLibraryA, чтобы подгрузить DLL средствами WinAPI, в чужом процессе
   if GetLastError = ERROR_SUCCESS then result := true;
   end;
end;
end;
CloseHandle(hProc); // закрываем Handle процесса
end;
не получается с помощью этого кода внедрить свою библиотеку в процесс..
Код:
InjectLibraryAPI(VC_Window, C:\Call10.dll);
что не так?

Последний раз редактировалось mihali4; 14.11.2011 в 17:35.
VintProg вне форума Ответить с цитированием
Старый 13.11.2011, 23:22   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

версия Делфи?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.11.2011, 23:24   #3
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

версия 7... только разница какая?
VintProg вне форума Ответить с цитированием
Старый 13.11.2011, 23:30   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

большая разница, Юникод и нет.
Код:
function InjectLibraryAPI(lpProcessID: Cardinal; lpDllname: AnsiString): LongBool;//строго Анси строки.
var
 hProc: Cardinal;
 oAlloc: Pointer;
 cWPM: Cardinal;
 hRemThread: Cardinal;
begin
 result := false;
 SetLastError(ERROR_SUCCESS);
 hProc := OpenProcess(PROCESS_ALL_ACCESS, false, lpProcessID); 
 if hProc <> 0 then begin
    oAlloc := VirtualAllocEx(hProc, 0, length(lpDllname)+1, MEM_COMMIT, PAGE_EXECUTE_READWRITE); //нуль терминал тоже нужен.
 if oAlloc <> nil then begin
 if WriteProcessMemory(hProc, oAlloc, PChar(lpDllName), length(lpDllName)+1, cWPM) = true then begin //терминал тоже пишем
    CreateRemoteThread(hProc, nil, 0, GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA'), oAlloc, 0, hRemThread);
   if GetLastError = ERROR_SUCCESS then 
    begin
     result := true;
     WaitForSingleObject(hRemThread,INFINITE);//ждем пока загрузиться
     CloseHandle(hRemThread);
    end;
   end;
end;
end;
VirtualFreeEx(hProc,oAlloc,0,MEM_RELEASE);//память в чужом процессе то освобождаем
CloseHandle(hProc); 
end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.11.2011, 23:39   #5
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

23:39
VC_Window := FindWindow(nil , 'GTA: Vice City');
не срабатывает все равно.

23:56
Код:
WriteProcessMemory(hProc, oAlloc, PChar(lpDllName), length(lpDllName)+1, cWPM)
я вот сижу и задумываюсь что-же туда запишется...

Красные жирные циферки видны ?
Это время, когда вы отправляли свои сообщения друг за другом, подряд.
У нас есть кнопка "Правка".
Читаем правила раздела. По правилам это приравнивается к флуду.
Странно, что приходится напоминать об этом форумчанину с таким стажем...

Последний раз редактировалось mihali4; 14.11.2011 в 00:28.
VintProg вне форума Ответить с цитированием
Старый 14.11.2011, 00:30   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

причем тут FindWindow? пишет что нужно хотя PAnsiChar лучше
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.11.2011, 01:29   #7
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

Все теперь получилось, вопрос другой теперь, как мне можно вызывать функции игры из программы? Допустим есть адрес функции которая дает игроку деньги, как мне ее вызвать из чужого пространства, ну и что-бы игрок получил оружие. Вот как вызвать?

Последний раз редактировалось mihali4; 14.11.2011 в 17:36.
VintProg вне форума Ответить с цитированием
Старый 14.11.2011, 16:48   #8
Larboss
Недо
Участник клуба
 
Регистрация: 11.08.2011
Сообщений: 1,394
По умолчанию

Примерно так:
Код:
library lib0;

uses
  Messages,
  Windows;

type
  TRemoteFunction = function(param1, param2: pchar): integer;
  
var
  RemoteFunction: TRemoteFunction;
  
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

    RemoteFunction := TRemoteFunction(ptr($004501A4)); / Здесь указываем адрес функции, которую собираемся вызывать

    RemoteFunction('lol','lol2'); // Вызываем

    end;

end.
С помощью программирования можно разбогатеть и изменить мир к лучшему (с) Бьерн Страуструп
Larboss вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
создание бд в с++ Alena_897 C/C++ Базы данных 7 19.11.2011 21:18
Создание внутреннего и внешнего серверов. Создание серверов автоматизации. Ann_Sh Помощь студентам 3 09.10.2011 15:53
Создание gadilla_cs Общие вопросы Delphi 12 10.12.2010 17:56
Создание трейнера для игры Человек_Борща Gamedev - cоздание игр: Unity, OpenGL, DirectX 13 12.11.2010 20:24