Bom pessoal, vou postar aqui um tutorial que fiz ensinando como proteger um processo no windows utilizando uma função não documentada, claro, por uma boa razão, não deve ser usada arbitráriamente e sem controle por qualquer aplicativo, vendo que pode causar instabilidades ao sistema operacional e perda de dados. A RtlSetProcessIsCritical; Creio que seja de boa utilidade para quem quer codar rats ou ferramentas do tipo, desde que saibam que qualquer bug no programa pode levar a uma tela azul, então, usem com responsabilidade rsrs (:
Como funciona?
- Esta função define o processo como "crítico", ou seja, essencial ao funcionamento do windows, fazendo com que caso ele seja finalizado, o windows automaticamente se encerre demonstrando um erro crítico conhecido como BSOD (Blue Screen of Death). os códigos de erro podem ser:
* (0xEF) CRITICAL_PROCESS_DIED - Processo finalizado
* (0xF4) CRITICAL_OBJECT_TERMINATION - Processo encerrado de forma "anormal"
- O Windows não irá emitir nenhum tipo de aviso sobre o processo ser crítico ou não, então ele pode ser finalizado normalmente por um gerador de tarefas ou comando executado no windows como "taskkill" no console. Exceto no windows vista e 7 onde o processo não pode finalizado pelo gerenciador de tarefas, porém um usuário com privilégios administrativos pode forçar seu encerramento por outros metodos.
A Função
Então se chamarmos a função da seguinte forma: RtlSetProcessIsCritical(TRUE, NULL, FALSE); o processo será definido como crítico, e se a chamarmos desta forma: RtlSetProcessIsCritical(FALSE, NULL, FALSE); o processo voltará ao normal.
Vamos Codar
Para chamarmos a função do kernel do windows é simples:
Porém, para se chamar essa função é necessário que o processo tenha privilégios de depuração (SE_DEBUG_NAME), mas como eu gosto de usar o menor número de units possível em minhas aplicações eu vou utilizar uma outra função do kernel do windows, mas como não vem ao caso discutirmos sobre essa função em sí, vou só disponibilizar para vocês. sujiro a procura de materiais relacionados para um melhor entendimento desta função, a RtlAdjustPrivilege
chamando a função da seguinte forma: RtlAdjustPrivilege(20, True, 0, @unc); Nós estamos habilitando os privilégios de depuração, e desta forma: RtlAdjustPrivilege(20, False, 0, @unc); estamos revogando os privilégios de depuração.
Então vamos á um exemplo de código que causaria um encerramento súbito do sistema operacional.
Como funciona?
- Esta função define o processo como "crítico", ou seja, essencial ao funcionamento do windows, fazendo com que caso ele seja finalizado, o windows automaticamente se encerre demonstrando um erro crítico conhecido como BSOD (Blue Screen of Death). os códigos de erro podem ser:
* (0xEF) CRITICAL_PROCESS_DIED - Processo finalizado
* (0xF4) CRITICAL_OBJECT_TERMINATION - Processo encerrado de forma "anormal"
- O Windows não irá emitir nenhum tipo de aviso sobre o processo ser crítico ou não, então ele pode ser finalizado normalmente por um gerador de tarefas ou comando executado no windows como "taskkill" no console. Exceto no windows vista e 7 onde o processo não pode finalizado pelo gerenciador de tarefas, porém um usuário com privilégios administrativos pode forçar seu encerramento por outros metodos.
A Função
Código:
NTSTATUS RtlSetProcessIsCritical ( BOOLEAN bNew, // new setting for process BOOLEAN *pbOld, // pointer which receives old setting (can be null) BOOLEAN bNeedScb); // need system critical breaks
Vamos Codar
Para chamarmos a função do kernel do windows é simples:
Código:
function RtlSetProcessIsCritical(bNew: Boolean; pbOld: Pointer; bNeedScb: Boolean):LongInt; stdcall; external 'ntdll.dll';
Código:
function RtlAdjustPrivilege(dwPrivilegeId: DWORD; bSet: boolean; AdjType: integer; Unc: PDWORD): word; stdcall; external 'ntdll.dll';
Então vamos á um exemplo de código que causaria um encerramento súbito do sistema operacional.
Código:
program bsod; {$APPTYPE CONSOLE} uses windows; function RtlAdjustPrivilege(dwPrivilegeId: DWORD; bSet: boolean; AdjType: integer; Unc: PDWORD): word; stdcall; external 'ntdll.dll'; function RtlSetProcessIsCritical(bNew: Boolean; pbOld: Pointer; bNeedScb: Boolean):LongInt; stdcall; external 'ntdll.dll'; var unc:dword; begin write(' Blue Screen of Death'#13#10); write('-----------------PRESS ANY KEY TO BOOM ---------------'); Readln; RtlAdjustPrivilege(20, True, 0, @unc); RtlSetProcessIsCritical(True, nil, False); ExitProcess(0); end.
Comment