Ir para conteúdo
Faça parte da equipe! (2024) ×
Conheça nossa Beta Zone! Novas áreas a caminho! ×
  • Quem está por aqui   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.

Criando seu proprio CE!!


Posts Recomendados

Criando UCE SHAK3

 

Perguntas comuns:

 

Qual a diferença quando dizemos CE e UCE?

 

CE é o que vale ao Cheat Engine como todos sabem em sua source original ela é detectada pelos sistemas anti-hacks (no nosso caso anti-cheats) os principais, GameGuard, xTrap, HackShield (o ultimo sendo realmente o mais fraco).

UCE é o que vale a Undetected Cheat Engine neste caso é utilizada a source do CE original, porém, ela é editada para não ser detectada.

 

Eu não sei nada de programação posso tentar criar um UCE?

 

Você não precisa de alto conhecimento para criar um UCE porque a pior parte (a source) já foi feita pelo Dark Byte, você caso queira passar da primeira parte e conseguir resolver seus erros dai você precisara ter em primeiro lugar vontade, em segundo conhecimento, porque caso você ainda não tenha esse conhecimento você consegue ele estudando na internet, mas vontade de verdade de seguir até o fim é muito pior.

 

 

Erros acontecem com frequência?

 

Sim erros acontecem e muito, caso você resolver um erro e aparecer outro não desista porque erros no inicio são comuns após você entender que tudo está voltado não no seu erro e sim na vontade de conseguir superalo ficará bem mais fácil.

 

PS: Não irei mostrar o que é detectado neste tópico e sim tentar fazer entender como achar o que é detectado.

 

O que iremos utilizar :

 

PassComent - Comenta os .pas

ActualSR - Troca palavras

Source Cheat Engine 5.3

Dephil 7 - Abre a source e compila (.pas, .dpr, .dfm)

Dephil 7 Part 1

Dephil 7 Part 2

Dephil 7 Part 3

Dev C++ - Abre a source (.c, .cpp, .h)

WDK/DKK - Compila a parte do drive

Decompiler - Decompila a parte em Delphi do seu projeto

 

Metas:

 

Form : ( )

Unit : ( )

Kernel Library ( )

Driver ( )

 

O que deve ser trocado antes de começar:

 

Abra o cheatengine.dpr e vá em View/Project Mananger

Clique com o botão em cima do cheatengine.exe e vá em view source e então vá em File/Salve as...

Salve com o nome que você dejesar (EX: ShaK3.dpr)

Agora abra esse novo projeto que você salvou (ShaK3.dpr) então vá em View/Project Mananger

Clique com o botão direito em cima do ShaK3.exe e vá em Options

Vá na aba Aplication

Troque Cheat Engine 5.4 (Source do CE 5.4) para ShaK3 5.4 e então clique em Load Icon e troque e o Icone do CE por outro qualquer

(Muita gente não faz isso e concerteza irá dar hack detectado em menos de 5 segundos caso não fizer isto)

 

GUI (Graphical Unit Iterface)Parte 1 (Form): Nivel Novato

 

Abra o Decompiler e selecione o seu engine (ShaK3.exe) e clique em Decompile (Ele irá criar um pasta Rescued com o seu projeto)

Abra o ShaK3.dpr da pasta Rescued e então compile-o

Abra o jogo (GunBound, GrandChase, MapleStory, de preferencia com o GameGuard)

* Hack Detectado *

Caso esteja detectado (se você usa a source original isso irá acontecer) você precisará abrir o seu projeto e deixar nele somente um form por vez e então após deixar um form (EX: MainUnit) compile-o caso de hack detectado novamente isto é que seu arquivo está detectado então você pode modificar nomes (Captions,Hints,Procedures,Uses,etc...), tamanhos (Width,Height), nome do form etc...

Faça isso até ficar undetectado (sem hack detectado) e então vá para o outro form e assim por diante até achar tudo que é detectado nos forms para poder passar para os códigos...

Pronto Form Undetectado

 

Metas:

 

Form : (X)

Unit : ( )

Kernel Library ( )

Driver ( )

 

GUI (Graphical Unit Iterface)Parte 2 (Unit): Nivel Novato/Mediano

 

Coloque o PasComment na pasta da sua source

Abra-o e então irá aparecer o nome de todos os .pas que sua source contem naquela pasta

Selecione todos os .pas e marque a opção "Auto overwrite source file"

Então clique em Batch Comment (ele irá comentar toda sua source adicionando após o Begin (* e *) antes do end;)

Fixando o primeiro erro: Abra o CeFuncProc, procure por initialization (encontra-se no final da source) comente até end; (Caso você não faça isso quando o esse pas for chamado em algum local da tua source como uses ele irá inicializar as funções que ali contem e como você comentou tudo ele irá dar erro).

Abra o seu Projeto (ShaK3.dpr) deixe somente uma Unit (EX: MainUnit) e então vá retirando desta unit os comments (* *) sempre anotando o que você tirou e testando para ver se deu hack detectado

* Hack Detectado *

Caso isso aconteça verifique onde isto está acontecendo recolocando os comentarios manualmente (* *) e retirando testando no jogo após descobrir o que é detectado você deve ver como pode ser feito para arrumar (Aqui necessita um pouco de conhecimento em delphi para saber o que fazer de verdade sem estragar de mais sua source)

 

Dicas:

1° Quando for descobrir o que é detectado comece por Units que contenham forms e não somente o .pas

2° Comece por Units menores e deixe CeFuncProc, MainUnit, MemoryBrowserUnit que são provavelmente as que são detectadas que contem mais código.

3° Quando for verificar o que foi detectado no seu código primeiro comecendo descobrindo qual a procedure/functions que é detectada e então após isso descubra que parte dela é detectado e como pode ser arrumada

4° Se achar o que foi detectado dentro da procedure não utilize comentarios // {} (**) para undetectar tente realmente arrumar o código se for preciso reescrevendo o mesmo...

5° Esta provavelmente será a parte mais difícil que você encontrará para criar um UCE e também a parte que você irá desistir .

 

 

Metas:

 

Form : (X)

Unit : (X)

Kernel Library ( )

Driver ( )

 

 

Kernel Library (dbk32.dll): Nivel Novato/Mediano

 

Antes de começar isso você deve ter certeza de que seu Form/Unit estejam undetectados

Abra o DBK32.dpr e então salve esse projeto com outro nome (EX: ShaK3DLL.dpr)

Abra o DBK32Functions.pas e salve-o com outro nome (EX: ShaK3Func.pas)

 

Sub-Tuto DBK32Funtions.pas

 

1 ° Processo

Eu estava no DBK32functions.pas

Eu declarado ABC: integer

Eu declarado ABC: = 412; ABC: = ABC;

Eu modificados para todos os 512 ABC

A Memória do jogo foi bloqueada, no entanto as outras memórias tinham sido abertos

 

2 ° Processo

Modificar Codigos

 

Codigo :

 

input.processid:=handlelist.processid;

 

mude para :

 

input.processid:=handlelist[0].processid;

 

 

A memória foi aberta por completo, no entanto, ele leu errado a memória

 

Codigo :

 

 

if handlelist.processhandle=hProcess then

 

 

Mude para

 

 

//if handlelist.processhandle=hProcess then

 

 

Possível detecção:

ProcessID

 

Bem, eu acho que ele pode ajudar

 

 

Minha RPM:

 

 

function{ReadProcessMemory}RPM(hProcess:THANDLE;lpBaseAddress:pointer;lpB

uffer:p

ointer;nSize:DWORD;var NumberOfBytesRead:DWORD):BOOL; stdcall;

type TInputstruct=record

processid: dword;

startaddress: dword;

bytestoread: word;

end;

var ao: array [0..600] of byte; //give it some space

input: TInputstruct absolute ao[0];

cc:dword;

 

i: integer;

ok: boolean;

br: dword;

 

mempointer: dword;

bufpointer: dword;

bufpointer2: pointer;

toread: dword;

ABC: Integer;

begin

ABC:=412;

ABC:=ABC;

result:=false;

numberofbytesread:=0;

//find the hprocess in the handlelist, if it isn\\\'t use the normal method (I could of course use NtQueryProcessInformation but it\\\'s undocumented and I\\\'m too lazy to dig it up

 

for i:=0 to length(handlelist)-1 do

if handlelist.processhandle=hProcess then

begin

if hdevice<>INVALID_HANDLE_VALUE then

begin

cc:=IOCTL_CE_READMEMORY;

mempointer:=dword(lpBaseAddress);

bufpointer:=dword(lpbuffer);

 

ok:=true;

while ok do

begin

input.processid:=handlelist.processid;

if nSize-numberofbytesread>=ABC then

toread:=ABC

else

toread:=nSize-numberofbytesread;

 

input.bytestoread:=toread;

input.startaddress:=mempointer;

 

if deviceiocontrol(hdevice,cc,@ao[0],ABC,@ao[0],ABC,br,nil) then

begin

bufpointer2:=pointer(bufpointer);

copymemory(bufpointer2,@ao[0],toread);

//no check if it works or try except, it\\\'s up to the (retarded) user to do it right

end

else

begin

exit;

end;

 

inc(mempointer,toread);

inc(bufpointer,toread);

inc(numberofbytesread,toread);

 

if numberofbytesread=nSize then

begin

result:=true;

exit;

end;

end;

 

exit;

end else if not handlelist.validhandle then exit; //else use the normal method...

end;

 

//not found so ....

result:=windows.ReadProcessMemory(hProcess,lpBaseAddress,lpBuffer,nSize,NumberOf

BytesRead);

end;GOoD LucK

 

-----------------------------------------------------------

 

No seu ShaK3DLL.dpr irá ter uma lista de exports comente todos eles, após isso você abre o jogo e verifica se dará hack detectado caso não então retire um export e vá fazendo isso até descobrir quais funções exportadas estão sendo detectadas

* Hack Detectado *

O Principal a se fazer aqui é trocar o nome (EX: WPM -> WritePM)

Caso ainda de hack detectado (Difícilmente trocando o nome dará hack detectado) verifique a função que esse export detectado chama.

Troque DBK32.sys para o driver que você irá utilizar (EX: ShaK3Driver.sys)

Fixando Erros: Este problema é conhecido de todos desde de a Rev 839 do GameGuard na qual detectado o tamanho do Buffer de entrada no deviceiocontrol, troque-o no WPM, RPM e o primeiro fix na memória será feito...

Este segundo problema é conhecido de todos desde de a rev 1012 (se não me engane) o primeiro fix era feito somente trocando o ProcessID para xxxxx1 mas GameGuard detectou isso e outro fix foi feito novamente, agora você deve trocar o ProcessID da sua DLL para -1 e então fazer com que ele obtenha outro processid no seu driver fazendo isso mais tarde...

Pronto DLL Arrumada

 

Metas:

 

Form : (X)

Unit : (X)

Kernel Library (X)

Driver ( )

 

Driver (dbk32.sys): Nivel Novato/Mediano

 

Vá em sources.ce e troque DBK32 para o driver que você vai utilizar (Mesmo nome que você utilizou na sua dll)

Troque o nome da pasta do seu Driver de DBKKernel para outro nome (EX: ShaK3Kernel)

Troque o nome de alguns arquivos em .c/.h

Vá em DBKDrvr.c e comente todos os cases exceto o GETVERSION e o INITIALIZE

Comente os outros .c e vá descomentando e vendo se está detectado ou não mesmo passo da Unit

 

Dicas:

1° Entenda um pouco de C# para não dar BSOD

2° Não utilize a função do Process Watcher abilitada

3° Utilize o KernelUnloader para cada vez que você abrir o CE com o Driver você possa recompilar o mesmo sem ficar o driver no sistema

 

Metas:

Form : (X)

Unit : (X)

Kernel Library (X)

Driver (X)

 

Retirando Códigos Fixos UCE

 

1°depurador correções / detecção fixa

 

Pesquisar a palavra "DriverEntry" em dbkdrvr.c; agora substituir "DriverEntry" na caixa de pesquisa com o "retorno NTSTATUS;" Imprensa encontrar, até chegar ao 3 º um e adicione esse código antes que ele ...

 

Procure :

 

 

{

UNICODE_STRING y;

RtlInitUnicodeString(&y, L"KeAttachProcess");

AddressOfKeAttachProcess=MmGetSystemRoutineAddress(&y);

}

 

 

Modifica

 

ExFreePool(BufDriverString);

ExFreePool(BufProcessEventString);

ExFreePool(BufThreadEventString);

 

ZwClose(reg);

{

UNICODE_STRING y;

RtlInitUnicodeString(&y, L"KeAttachProcess");

AddressOfKeAttachProcess=MmGetSystemRoutineAddress(&y);

}

return ntStatus;

 

 

Procura :

 

 

if (*processid==0xdeadbeef)

{

*(PULONG)Irp->AssociatedIrp.SystemBuffer=(ULONG)&AddressOfKeAttachProcess;

ntStatus=STATUS_SUCCESS;

break;

}

 

 

Modifica :

 

 

{

UINT_PTR *processid;

PEPROCESS selectedprocess;

processid=Irp->AssociatedIrp.SystemBuffer;

 

if (*processid==0xdeadbeef)

{

*(PULONG)Irp->AssociatedIrp.SystemBuffer=(ULONG)&AddressOfKeAttachProcess;

ntStatus=STATUS_SUCCESS;

break;

}

if (PsLookupProcessByProcessId((PVOID)(*processid),&selectedprocess)==STATUS_SUCCESS)

*(PULONG)Irp->AssociatedIrp.SystemBuffer=(ULONG)selectedprocess;

else

*(PULONG)Irp->AssociatedIrp.SystemBuffer=0;

 

ObDereferenceObject(selectedprocess);

 

ntStatus= STATUS_SUCCESS;

break;

}

 

 

Abrir Source.ce e jumper.c acrescentar à lista.

 

Depois de fazer isso, abra o seu principal CE Mainunit.pas na pasta ... Adicione a palavra "disassembler" na lista de utilizações.

 

Agora procure a linha

 

 

procedure TMainform.FormCreate(Sender: TObject);

 

 

Cole em baixo :

 

 

procedure fixmemaccess;

var KeAttachProcessAddress,x: dword;

s: string;

sl: tstringlist;

 

KiAttachProcessAddress: dword;

a,b: boolean;

i: integer;

DriversKeAttachProcessAddressAddress: dword;

oldprocesshandle: dword;

begin

oldprocesshandle:=processhandle;

try

loaddbk32;

UseDBKReadWriteMemory;

//query is needed too to scan, but thats up to the user

 

processhandle:=newkernelhandler.OpenProcess(PROCESS_ALL_ACCESS,false,GetCurrentP

rocessID);

 

//I don't even have to adjust the jxx instructions since all of them point to when it fails, so thats ok

KeAttachProcessAddress:=dword(GetKProcAddress('KeAttachProcess'));

KiAttachProcessAddress:=0;

 

sl:=tstringlist.Create;

x:=KeAttachProcessAddress;

 

a:=symhandler.showmodules;

b:=symhandler.showsymbols;

 

symhandler.showmodules:=false;

symhandler.showsymbols:=false;

 

sl.Add('Kalloc(mymem,4096)');

sl.add('Kalloc(mymem2,4096)');

sl.add('');

sl.add('mymem2:');

 

sl.add('');

sl.add('mymem:');

 

s:='';

while (x<KeAttachProcessAddress+$200) and (s<>'ret 0004') do

begin

s:=disassemble(x);

s:=copy(s,pos('-',s)+2,length(s));

s:=copy(s,pos('-',s)+2,length(s));

 

if pos('call 8',s)>0 then

begin

KiAttachProcessAddress:=strtoint('$'+copy(s,pos(' ',s)+1,length(s)));

s:='call mymem2';

end;

 

sl.Add(s);

end;

 

//now generate the jumper for KiAttachProcess

if KiAttachProcessAddress=0 then raise exception.Create('No KiAttachProcess call found');

x:=KiAttachProcessAddress;

i:=4;

 

while (x<KiAttachProcessAddressxxxxx5) do

begin

s:=disassemble(x);

s:=copy(s,pos('-',s)+2,length(s));

s:=copy(s,pos('-',s)+2,length(s));

 

sl.Insert(i,s);

inc(i);

end;

sl.Insert(i,'jmp '+inttohex(x,8));

 

DriversKeAttachProcessAddressAddress:=getpeprocess($deadbeef);

if DriversKeAttachProcessAddressAddress=0 then raise exception.Create('OMG YOU LOSER!');

 

sl.Add('');

sl.Add(inttohex(DriversKeAttachProcessAddressAddress,8)+':');

sl.add('dd mymem');

 

symhandler.showmodules:=a;

symhandler.showsymbols:=b;

 

if not autoassemble(sl,false) then raise exception.create('Auto assembler error.');

 

finally

processhandle:=oldprocesshandle;

end;

end;

 

 

Isso é tudo para o Registo Correções ...

(Mas se não encontrar um bypass int1 não podemos usar registos anyway.)

PARA NOS UNDETECTING REV 878:

 

Código que é a rev 833 detectados em mainunit.pas:

 

 

if err>0 then

begin

if res=-1 then

begin

 

end;

 

ok:=res=mryes;

 

if (res=mryes) or (res=mrno) then

res:=-1; //reset

end

else

ok:=true;

 

end else ok:=true;

 

 

Modifica :

 

 

QUOTE

if err>IQ then

begin

if res=X then

begin

res:=messagedlg('The record with description '''+memrec.Description+''' has as interpretable address '''+memrec.interpretableaddress+'''. The recalculation will change it to '+symhandler.getNameFromAddress(memrec.Addressxxxxxcalculate,true,true)+'. Do you want to edit it to the new address?',mtconfirmation,[mbyes,mbno,mbNoToAll,mbYesToAll,mbCancel],0);

if res=mrcancel then exit;

end;

 

ok:=res=mryes;

 

if (res=mryes) or (res=mrno) then

res:=X; //reset

end

else

ok:=true;

 

 

Procura :

 

 

var newaddress:dword;

calculate: Integer;

i,j,err: Integer;

selectedi: Integer;

X: Integer;

IQ: Integer;

 

firstispointer,dontdopointers: boolean;

re: string;

ok: boolean;

 

res: integer;

 

 

Coloca no begin :

 

 

begin

res:=-1;

X:=-1;

X:=X;

IQ:=0;

IQ:=IQ;

 

//first find out how many where selected.(from here on i didnt touch)

i:=0;

selectedi:=0;

while (i<numberofrecords) and (selectedi<2) do

begin

 

 

Codigo detected no disassembler.pas:

 

 

function disassemble(var offset: dword; var description: string): string; overload;

var memory: TMemory;

actualread: dword;

startoffset: dword;

tempresult: string;

tempst: string;

wordptr: ^word;

dwordptr: ^dword;

dwordptr2: ^dword;

singleptr: ^single;

doubleptr: ^double;

extenedptr: ^extended;

int64ptr: ^int64;

i,j: integer;

 

prefix: TPrefix;

prefix2: TPrefix;

isprefix: boolean;

 

last: dword;

foundit: boolean;

begin

result:=inttohex(offset, 8 ) + ' - ';

 

 

Modifica

 

 

function disassemble(var offset: dword; var description: string): string; overload;

var memory: TMemory;

actualread: dword;

startoffset: dword;

tempresult: string;

tempst: string;

wordptr: ^word;

dwordptr: ^dword;

dwordptr2: ^dword;

singleptr: ^single;

doubleptr: ^double;

extenedptr: ^extended;

int64ptr: ^int64;

i,j: integer;

 

prefix: TPrefix;

prefix2: TPrefix;

isprefix: boolean;

 

last: dword;

foundit: boolean;

 

//just added this few lines to increment the bytes

A:string;

B:string;

C:string;

D:string;

E:string;

F:string;

G:string;

H:string;

K:string;

L:string;

M:string;

//just added this few lines to increment the bytes

begin

 

//just added this few lines to increment the bytes

A:='a';

B:='b';

C:='c';

D:='d';

E:='e';

F:='f';

G:='g';

H:='h';

K:='k';

L:='l';

M:='m';

//just added this few lines to increment the bytes

 

result:=inttohex(offset, 8 ) + ' - ';

 

 

Pronto Codigos que estava Detectados fixo foram retirado e agora e so bypassea!

 

 

--------------------

Link para o comentário
Compartilhar em outros sites

Este tópico está impedido de receber novos posts.
 Compartilhar

×
×
  • Criar Novo...

Informação Importante

Nós fazemos uso de cookies no seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies , caso contrário, vamos supor que você está bem para continuar.