avatar_Fiesta

Защита для MU Online с Пшеница Анти-Чит, Действительно работает!

Автор Fiesta, 2010 Дек. 22, 08:38

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Fiesta

Переведено с РЗ,не много от меня,не много от транслятора

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



Читайте! README! Перед попросить что-то;)

Преимущества:

* Простая установка
* АнтиЧит в майне а не в ДЛЛ
* Неограниченное чит дампом
* Проверка player.bmd файла


Недостатки:

* AntiCheat не сканирования скрытых процессов
* AntiCheat не препятствует контрольную обхода (2 мин и обходится)
* AntiCheat не checing код / функция крючки и DLL инъекций


AntiCheat протестированы на:

* Main ENG 1.02c
* Main 1.02k KOR
* Main 1.03k JPN (сезон 4)
* Main JPN 1.03.25 (сезон 5)


Список изменений:

* 1.0.0.8: добавление main.exe убить код после обнаружения обмана (3 секунды)
* 1.0.0.8: перевод чит базы данных editboxes подписи
* Увеличился дампа базы данных (скопировал от кого-то здесь (это 400 + обмануть свалки, я не помню его ник, SRY)

Версия 1.0.0.8

Я буду продолжать этот проект, но, когда я получу больше времени. Если вам не понравится, я не забочусь. Это обучение для меня: P

AndOrXor

#1
вчера (пижу :))) 2 дня назад) написал тоге же самоге

unit Unit26;

interface

uses
Windows, Classes, SysUtils;

function AddSection(FileName: string; SectionSize: Word): Boolean;

const
LOAD_ORION: array [0 .. 50] of Byte = (
$68, $1A, $5E, $75, $00, $FF, $15, $7C,
$62, $75, $00, $85, $C0, $74, $00, $68,
$25, $5E, $75, $00, $50, $FF, $15, $78,
$62, $75, $00, $85, $C0, $74, $10, $FF,
$D0, $6A, $10, $68, $FC, $5D, $75, $00,
$68, $C0, $5D, $75, $00, $FF, $15, $50,
$63, $75, $00);

implementation

{$REGION 'ALgin, Last Raw,Virtual section functions'}

function PEAlign(Num, AlignTo: DWORD):DWORD;
begin
while (Num mod AlignTo) <> 0 do
inc(Num);
Result := Num;
end;

function Align(dwValue:DWORD; dwAlign:DWORD):DWORD;
begin
if dwAlign <> 0 then
begin
if dwValue mod dwAlign <> 0 then
begin
Result := (dwValue + dwAlign) - (dwValue mod dwAlign);
Exit;
end;
end;
Result := dwValue;
end;

function LastSectionRaw(Sections: array of TImageSectionHeader):DWORD;
var
i:    integer;
Ret:  DWORD;
begin
Ret := 0;
for i := Low(Sections) to High(Sections) do
begin
if Sections[i].SizeOfRawData + Sections[i].PointerToRawData > Ret then
Ret := Sections[i].SizeOfRawData + Sections[i].PointerToRawData;
end;
Result := Ret;
end;

function LastSectionVirtual(Sections: array of TImageSectionHeader):DWORD;
var
i:   integer;
Ret: DWORD;
begin
Ret := 0;
for i := Low(Sections) to High(Sections) do
begin
if Sections[i].Misc.VirtualSize + Sections[i].VirtualAddress > Ret then
Ret := Sections[i].Misc.VirtualSize + Sections[i].VirtualAddress;
end;
Result := Ret;
end;

{$ENDREGION}

function WriteBuffer(Buffer,Data: TBytes): TBytes;
begin
SetLength(Result, Length(Buffer) + 5);
Move(Buffer, Result, Length(Buffer));
Move(Result[Length(Buffer)], Data[0], 5);
end;

procedure Obfuscate(Head: PImageSectionHeader);
begin
Head.PointerToRawData := Head.PointerToRawData + $100;
end;

function AddSection(FileName: string; SectionSize: Word): Boolean;
var
Fs: TStream;
ImgDosHdr: TImageDosHeader;
NtImgDosHdr: TImageNtHeaders;
Nt: TImageNtHeaders;
SectionsCount: Word;
Sections: TArray<TImageSectionHeader>;
Buffer: TBytes;
i: Integer;
x: Cardinal;
begin
Result := False;
try
Fs := TFileStream.Create(FileName,fmOpenRead);
try
SetLength(Buffer, Fs.Size);
Fs.ReadBuffer(Buffer[0],Length(Buffer));

Fs.Position := 0;
if Fs.Read(ImgDosHdr, 64) <> 64 then
Exit;
Fs.Position := ImgDosHdr._lfanew;
if Fs.Read(NtImgDosHdr, 248) <> 248 then
Exit;
finally
Fs.Free;
end;

if ImgDosHdr.e_magic = IMAGE_DOS_SIGNATURE then
if NtImgDosHdr.Signature = IMAGE_NT_SIGNATURE then
begin
SectionsCount := NtImgDosHdr.FileHeader.NumberOfSections;
SetLength(Sections, SectionsCount);
x := ImgDosHdr._lfanew + 24 + NtImgDosHdr.FileHeader.SizeOfOptionalHeader;

for i := low(Sections) to high(Sections) do
begin
Move(Buffer[x], Sections[i] ,40);
Inc(x, 40);
end;

if NtImgDosHdr.OptionalHeader.SizeOfHeaders >= (x + 40) then
begin
Inc(NtImgDosHdr.FileHeader.NumberOfSections, 1);
SetLength(Sections, NtImgDosHdr.FileHeader.NumberOfSections);

with Sections[NtImgDosHdr.FileHeader.NumberOfSections] do
begin
Name[0] :=  Ord('.');
Name[1] :=  Ord('O');
Name[2] :=  Ord('r');
Name[3] :=  Ord('i');
Name[4] :=  Ord('o');
Name[5] :=  Ord('n');
Characteristics  := $E0000060;
PointerToRawData := Align(LastSectionRaw(Sections), NtImgDosHdr.OptionalHeader.FileAlignment);
SizeOfRawData    := Align(SectionSize, NtImgDosHdr.OptionalHeader.FileAlignment);
VirtualAddress   := Align(LastSectionVirtual(Sections), NtImgDosHdr.OptionalHeader.SectionAlignment);
Misc.VirtualSize := Align(SectionSize, NtImgDosHdr.OptionalHeader.SectionAlignment);
end;
end;

NtImgDosHdr.OptionalHeader.DataDirectory[11].VirtualAddress := 0;
NtImgDosHdr.OptionalHeader.DataDirectory[11].Size := 0;
Inc(NtImgDosHdr.OptionalHeader.SizeOfImage, Sections[NtImgDosHdr.FileHeader.NumberOfSections].Misc.VirtualSize);

//      Mainam OEP -> uz jauno EP:)
NtImgDosHdr.OptionalHeader.AddressOfEntryPoint := Sections[NtImgDosHdr.FileHeader.NumberOfSections].VirtualAddress;

Move(NtImgDosHdr, Buffer[ImgDosHdr._lfanew], 248);
Move(Sections[NtImgDosHdr.FileHeader.NumberOfSections], Buffer[x], 40);

SectionSize := Align(SectionSize, NtImgDosHdr.OptionalHeader.FileAlignment);
SetLength(Buffer, Length(Buffer) + SectionSize);

Move(LOAD_ORION, Buffer[Length(Buffer) - SectionSize], 60);
end;

Fs := TFileStream.Create(Filename+'New.exe',fmCreate or fmShareExclusive);
try
Result := Fs.Write(Buffer[0],Length(Buffer)) = Length(Buffer);
finally
Fs.Free
end;
except
on E: Exception do
MessageBox(0, PWideChar(E.Message) , '', MB_ICONERROR or MB_OK);
end;
end;

end.

Credits: Gunz & Vecmātei google.com

Dzib

#2
Ещё б туда кроме проверки файла Player.bmd Item.bmd Skill.bmd
И список какойто посерёзнее)) а то там даже артмани нет

Profesor08

Проверку файлов добавить можно за нейух... Хоть на весь клиент.

Dzib

там можно добавлять кепшионс читов и мемори дампы читов, у muautoclicker (Elite) я так понял нет заголовка потому что он сидит в трее постоянно, а как узнать его мемори дамп?

SmallHabit

#5
Цитироватьтам можно добавлять кепшионс читов и мемори дампы читов, у muautoclicker (Elite) я так понял нет заголовка потому что он сидит в трее постоянно, а как узнать его мемори дамп?
нах зачем мучатся, Элита грузит дллку в мэйн, достаточно сделать проверку на лишние модули в мэйне...

buffon

Цитата: AndOrXor от 2010 Дек. 30, 12:34  вчера (пижу :))) 2 дня назад) написал тоге же самоге

unit Unit26;

interface

uses
Windows, Classes, SysUtils;

function AddSection(FileName: string; SectionSize: Word): Boolean;

const
LOAD_ORION: array [0 .. 50] of Byte = (
$68, $1A, $5E, $75, $00, $FF, $15, $7C,
$62, $75, $00, $85, $C0, $74, $00, $68,
$25, $5E, $75, $00, $50, $FF, $15, $78,
$62, $75, $00, $85, $C0, $74, $10, $FF,
$D0, $6A, $10, $68, $FC, $5D, $75, $00,
$68, $C0, $5D, $75, $00, $FF, $15, $50,
$63, $75, $00);

implementation

{$REGION 'ALgin, Last Raw,Virtual section functions'}

function PEAlign(Num, AlignTo: DWORD):DWORD;
begin
while (Num mod AlignTo) <> 0 do
inc(Num);
Result := Num;
end;

function Align(dwValue:DWORD; dwAlign:DWORD):DWORD;
begin
if dwAlign <> 0 then
begin
if dwValue mod dwAlign <> 0 then
begin
Result := (dwValue + dwAlign) - (dwValue mod dwAlign);
Exit;
end;
end;
Result := dwValue;
end;

function LastSectionRaw(Sections: array of TImageSectionHeader):DWORD;
var
i:    integer;
Ret:  DWORD;
begin
Ret := 0;
for i := Low(Sections) to High(Sections) do
begin
if Sections[i].SizeOfRawData + Sections[i].PointerToRawData > Ret then
Ret := Sections[i].SizeOfRawData + Sections[i].PointerToRawData;
end;
Result := Ret;
end;

function LastSectionVirtual(Sections: array of TImageSectionHeader):DWORD;
var
i:   integer;
Ret: DWORD;
begin
Ret := 0;
for i := Low(Sections) to High(Sections) do
begin
if Sections[i].Misc.VirtualSize + Sections[i].VirtualAddress > Ret then
Ret := Sections[i].Misc.VirtualSize + Sections[i].VirtualAddress;
end;
Result := Ret;
end;

{$ENDREGION}

function WriteBuffer(Buffer,Data: TBytes): TBytes;
begin
SetLength(Result, Length(Buffer) + 5);
Move(Buffer, Result, Length(Buffer));
Move(Result[Length(Buffer)], Data[0], 5);
end;

procedure Obfuscate(Head: PImageSectionHeader);
begin
Head.PointerToRawData := Head.PointerToRawData + $100;
end;

function AddSection(FileName: string; SectionSize: Word): Boolean;
var
Fs: TStream;
ImgDosHdr: TImageDosHeader;
NtImgDosHdr: TImageNtHeaders;
Nt: TImageNtHeaders;
SectionsCount: Word;
Sections: TArray<TImageSectionHeader>;
Buffer: TBytes;
i: Integer;
x: Cardinal;
begin
Result := False;
try
Fs := TFileStream.Create(FileName,fmOpenRead);
try
SetLength(Buffer, Fs.Size);
Fs.ReadBuffer(Buffer[0],Length(Buffer));

Fs.Position := 0;
if Fs.Read(ImgDosHdr, 64) <> 64 then
Exit;
Fs.Position := ImgDosHdr._lfanew;
if Fs.Read(NtImgDosHdr, 248) <> 248 then
Exit;
finally
Fs.Free;
end;

if ImgDosHdr.e_magic = IMAGE_DOS_SIGNATURE then
if NtImgDosHdr.Signature = IMAGE_NT_SIGNATURE then
begin
SectionsCount := NtImgDosHdr.FileHeader.NumberOfSections;
SetLength(Sections, SectionsCount);
x := ImgDosHdr._lfanew + 24 + NtImgDosHdr.FileHeader.SizeOfOptionalHeader;

for i := low(Sections) to high(Sections) do
begin
Move(Buffer[x], Sections[i] ,40);
Inc(x, 40);
end;

if NtImgDosHdr.OptionalHeader.SizeOfHeaders >= (x + 40) then
begin
Inc(NtImgDosHdr.FileHeader.NumberOfSections, 1);
SetLength(Sections, NtImgDosHdr.FileHeader.NumberOfSections);

with Sections[NtImgDosHdr.FileHeader.NumberOfSections] do
begin
Name[0] :=  Ord('.');
Name[1] :=  Ord('O');
Name[2] :=  Ord('r');
Name[3] :=  Ord('i');
Name[4] :=  Ord('o');
Name[5] :=  Ord('n');
Characteristics  := $E0000060;
PointerToRawData := Align(LastSectionRaw(Sections), NtImgDosHdr.OptionalHeader.FileAlignment);
SizeOfRawData    := Align(SectionSize, NtImgDosHdr.OptionalHeader.FileAlignment);
VirtualAddress   := Align(LastSectionVirtual(Sections), NtImgDosHdr.OptionalHeader.SectionAlignment);
Misc.VirtualSize := Align(SectionSize, NtImgDosHdr.OptionalHeader.SectionAlignment);
end;
end;

NtImgDosHdr.OptionalHeader.DataDirectory[11].VirtualAddress := 0;
NtImgDosHdr.OptionalHeader.DataDirectory[11].Size := 0;
Inc(NtImgDosHdr.OptionalHeader.SizeOfImage, Sections[NtImgDosHdr.FileHeader.NumberOfSections].Misc.VirtualSize);

//      Mainam OEP -> uz jauno EP:)
NtImgDosHdr.OptionalHeader.AddressOfEntryPoint := Sections[NtImgDosHdr.FileHeader.NumberOfSections].VirtualAddress;

Move(NtImgDosHdr, Buffer[ImgDosHdr._lfanew], 248);
Move(Sections[NtImgDosHdr.FileHeader.NumberOfSections], Buffer[x], 40);

SectionSize := Align(SectionSize, NtImgDosHdr.OptionalHeader.FileAlignment);
SetLength(Buffer, Length(Buffer) + SectionSize);

Move(LOAD_ORION, Buffer[Length(Buffer) - SectionSize], 60);
end;

Fs := TFileStream.Create(Filename+'New.exe',fmCreate or fmShareExclusive);
try
Result := Fs.Write(Buffer[0],Length(Buffer)) = Length(Buffer);
finally
Fs.Free
end;
except
on E: Exception do
MessageBox(0, PWideChar(E.Message) , '', MB_ICONERROR or MB_OK);
end;
end;

end.

Credits: Gunz & Vecmātei google.com
выкладывать исходники на этом форуме бесполезно ибо 60% даже не знаю на чем они написаны

Dzib

Цитироватьнах зачем мучатся, Элита грузит дллку в мэйн, достаточно сделать проверку на лишние модули в мэйне...
SmallHabit а у тебя есть свой античит? если да то сколько бы он стоил?

siegklas

как добовлять в базу новые  читы?

Tomka

может ктонебут унпакнут фсн.дллки и вшыт етто ах щ маин вместе с фсн.длл ? былбы очен благодарен  https://www.gamefront.com/files/20212391/main_overmu_1.04j.7z

buffon

как это:
Цитировать--------------------
Admin of OverMu
Site: www.overmu.pl
Skype: s4estliff4ik
и не имеет анпакнутого мейна своего сервера?

Tomka

Цитата: buffon от 2011 Апр. 11, 17:38  как это:

и не имеет анпакнутого мейна своего сервера?
так ёст .. :) могбы выручет ?

rudik

на 97 версию он не идёт? майн повисает каждый раз

Похожие темы (5)