PDA

Просмотр полной версии : [Руководство] Мой первый DLL чит


mars2107
08.07.2015, 13:45
Создание DLL и альтернативный метод внедрения в процессы.
Сначала о создании:

1. Открываем Delphi и создаем новый проект.
File => New => Other... => Dynamic-link Library
[Ссылки могут видеть только зарегистрированные и активированные пользователи] [Ссылки могут видеть только зарегистрированные и активированные пользователи]

2. Переименуем наш проект.
В окне "Project Manager" ПКМ по "Project1.dll" => "Rename".
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

3. Добавим основную форму, где будем работать в дальнейшем.
В окне "Project Manager" ПКМ по "Project1.dll" => "Add New" => "VCL Form" => "Yes".
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

4. Возвращаемся к начальному коду нашей DLL.
Либо во вкладке переходим, либо в окне "Project Manager" выделяем наш "DLL Cheat" и жмем Ctrl+V

5. Добавляем Windows и Forms в uses
uses
System.SysUtils,
System.Classes,
Windows,
Forms,
Unit1 in 'Unit1.pas' {Form1};

6. Создаем основной поток, где будет стартовать наша форма
procedure MainThread; stdcall;
begin
Form1 := TForm1.Create(nil);
Form1.ShowModal;
end;

7. Запускаем этот поток, добавив выше переменную
var dwTemp: DWORD;
begin
CreateThread(nil,dwTemp,@MainThread,nil,dwTemp,dwT emp);
end.

8. Итог, полный листинг файла *.dpr
library DLL_Cheat;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

uses
System.SysUtils,
System.Classes,
Windows,
Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

var dwTemp: DWORD;

procedure MainThread; stdcall;
begin
Form1 := TForm1.Create(nil);
Form1.ShowModal;
end;

begin
CreateThread(nil,dwTemp,@MainThread,nil,dwTemp,dwT emp);
end.


Теперь, если мы заинжектим нашу либу, то сразу появится главная форма, но мы не будем инжектить. Бывает, что такое невозможно. Например процесс защищен внешне.
Нам потребуется немного знаний в обращении со сторонним софтом.

Procmon [Ссылки могут видеть только зарегистрированные и активированные пользователи]
CFF Explorer [Ссылки могут видеть только зарегистрированные и активированные пользователи]

Запускаем Procmon => Настраиваем фильтр на нашу игру => Запускам игру. => Какие DLL она подтягивает из игровой папки.

Выбираем любую, открываем ее в CFF Explorer
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Переходим в "Import Adder" => Кликаем "Add" и выбираем наш Dll Cheat =>
=> Во вкладке "Exported Functions" выбираем одну единственную функцию =>
=> Кликаем на "Import By Ordinal" => Кликаем на "Rebuild Import Table" => Сохраняем изменённую игровую DLL.
Теперь при запуске игры у нас будет стартовать наша DLL с функционалом, который вы сами опишите.

Например, спидхак для Aion:
BaseAddress:=GetModuleHandle('game.dll');
sp:=Ptr(Integer(Ptr(Integer(Ptr(BaseAddress + $00B45EA4)^) + $254)^) + $6C4);
sp^:=strtofloat(edit1.Text);

p.s. некоторые игры не стартуют из-за вшитой в них темида при запущенном прокмоне, перезагружаете ПК и ищите любой другой API Monitor, хотя думаю и Dependency Walker (depends.exe) подойдет.
p.p.s. это не единственный способ внедрения, можно почстать про приоритеты загрузки в Windows и так же закинуть системные либы в папку с игрой, так как обычно он сначала около себя их ищет. Так же можно использовать прокси длл. Так же слышал о пайпах (pipes), но мало о них знаю, буду рад почитать.