[C#]Proteções para seus Jogos/Programa (Anti loader)

NeeD

Membro
Registrado
Setembro 24, 2017
Mensagens
12
Pontos de reações
13
Idade
25


PROTEÇÃO PARA SEUS JOGOS/PROGRAMA - C#

Bom pessoal, com vi umas dúvidas em relação à como proteger seu jogo, e também tive um problema desses a uns dias atrás, resolvi criar este tópico para facilitar. Lembrando que tudo é burlável, nenhuma proteção vai funcionar 100%. Mas evitar e dificultar a vida dos hackers/lammers/crackers é a melhor coisa a se fazer, certo? Vamos la então.

CHECKSUM

Checksum nada mais é que um conjunto de caracteres utilizados para conferir a integridade de um arquivo.
Ele é único de cada programa. Caso queira uma explicação mais detalhada sobre checksum, clique neste link: O que é Checksum?

Encontrei na internet rapidamente, o código para fazer a verificação dos arquivos.
É um simples método (função) boolean, que você recebe como parâmetro 2 arquivos (arquivo 1 e arquivo 2)
onde ele verifica primeiramente se os 2 possuem o mesmo tamanho (lenght), caso contrario ele já retorna false.
Logo em seguida ele faz a conversão dos arquivos para capturar o conjunto de caracteres dele para fazer a comparação.
Caso os arquivos sejam iguais, ele retorna true.

Checksum usando Int64

Código:
const int BYTES_TO_READ = sizeof(Int64);

static bool FilesAreEqual(FileInfo first, FileInfo second)
{
if (first.Length != second.Length)
return false;

int iterations = (int)Math.Ceiling((double)first.Length / BYTES_TO_READ);

using (FileStream fs1 = first.OpenRead())
using (FileStream fs2 = second.OpenRead())
{
byte[] one = new byte[BYTES_TO_READ];
byte[] two = new byte[BYTES_TO_READ];

for (int i = 0; i < iterations; i++)
{
fs1.Read(one, 0, BYTES_TO_READ);
fs2.Read(two, 0, BYTES_TO_READ);

if (BitConverter.ToInt64(one,0) != BitConverter.ToInt64(two,0))
return false;
}
}

return true;
}
Algo interessante que vi também, onde vi bastante na source do gunz é comparação em MD5.
Este aqui embaixo, é usando ReadBytes e hashcodes

Código:
static bool FilesAreEqual_OneByte(FileInfo first, FileInfo second)
{
if (first.Length != second.Length)
return false;

using (FileStream fs1 = first.OpenRead())
using (FileStream fs2 = second.OpenRead())
{
for (int i = 0; i < first.Length; i++)
{
if (fs1.ReadByte() != fs2.ReadByte())
return false;
}
}

return true;
}

static bool FilesAreEqual_Hash(FileInfo first, FileInfo second)
{
byte[] firstHash = MD5.Create().ComputeHash(first.OpenRead());
byte[] secondHash = MD5.Create().ComputeHash(second.OpenRead());

for (int i=0; i<firstHash.Length; i++)
{
if (firstHash != secondHash)
return false;
}
return true;
}



Isso é uma função. Você vai adicionar ao seu código e apenas chamar essa função em uma CONDIÇÃO (if/else).
Vou passar a ideia para vocês (não é código, apenas a lógica)

PHP:
//Verificando executável presente no meu Client
File minhaExeAtual

//Verificando minha executavel original
File minhaExeOriginal

//sua classe principal (main)
...
if(checarExes(minhaExeAtual, minhaExeOriginal) == true)
beleza, sua exe não foi modificada
else
Opa. Temos alguma coisa errada!
//Aqui voce vai tratar seu erro.. fechando seu programa, etc

//fim classe principal (main)

//Declarando seu metodo de checksum
public boolean checarExes(File one, File two){
... //codigo aqui

//seu retorno, claro.. haha
}

PROCESSOS

Quem mexe com computadores, já deve ter ouvido falar de processos.. sim, são aquele nomezinhos que aparecem quando você vai finalizar uma tarefa
no Gerenciado de Tarefas.. como o "chrome.exe" do Google Chrome ou "firefox.exe" do Firefox..
Seu programa possui um conjunto de instruções, que na verdade são executadas pelo seus processos.
Uma descrição completa do que são processos, clique aqui: O que são Processos?

A proteção via processos é algo bem simples! Você precisa identificar o nome do processo primeiramente, para poder adicionar ao seu programa.
Você pode adicionar de diversas formas, no caso do exemplo vou mostrar apenas de como bloquear adicionando manualmente.
No caso do meu programa, eu fiz um List, puxando uma tabela so de processos que eu adiciono no meu banco de dados do meu servidor.
Ou seja, eu adiciono quantos processos quiser, e a List faz a checagem de todas atraves do Foreach. Assim não preciso ficar atualizando o
programa apenas para adicionar 1 ou 2 processos.. enfim, existem diversas maneiras de usar essa simples função. Pode ser bem util!

Esse método que construi, é simples, ele percorre os processos até encontrar o processo com o nome que você precisa. Porem essa função procura pelo nome
dos processos. Então não é necessario o .exe. Caso encontre o processo que você determinou que será bloqueado, ele executa o comando Kill(),
que finaliza o processo na hora! Bacana né? Vamos ao código!

Código:
private static void protecaoProcessos()
{

//Programa JoaozinhoH4ck3r.exe, no processos é Joaozinho H4ck3r

foreach (var process in Process.GetProcessesByName("Joaozinho H4ck3r"))
{
//Opa, encontramos o programa em seus processos! Vamos fechar!
Console.Write("Proteção ativada! Programa ilegal encontrado e bloqueado.");
process.Kill(); //fechando o processo do Joaozinho H4ck3r
Thread.Sleep(3000); //Aguardando 3 minutos para o usuario ver a mensagem de bloqueio
Environment.Exit(0); //Fechando o SEU programa o reinicia-lo.. ou então apenas bloquear..
}//Fim


}
Simples né? Você pode chamar este método em qualquer parte do seu programa apenas pelo protecaoProcessos();
Antes de adicionar o código ao seu programa, faça testes e faça um backup do seu código, para não ter problemas futuramente.

Qualquer dúvida sobre qualquer um desses códigos, é só comentar que estarei respondendo o mais rápido possível.
Eu não programo em C#, mas como é parecido com a linguagem que programo, posso resolver ou pelo menos tentar te guiar à sua resposta..
Qualquer erro cometido por mim ou complemento que você quer adicionar, fique a vontade para postar também..
Espero ter ajudado! Abraços

Referencias
(c# - How to compare 2 files fast using .NET? - Stack Overflow)
(c# - Calculate MD5 checksum for a file - Stack Overflow)
 

HHHSHADOW

Membro
Registrado
Janeiro 23, 2018
Mensagens
28
Pontos de reações
0
Idade
24
Peculiar!(principalmente por ser um site de cheat me deixo pasmo Haha) surpreendente, e como um bom estudante deixo as fontes, meu parabéns!
 

Membros que estão visualizando este tópico (Total: 1, membros: 0, visitantes: 1)

Topo