Protegendo aplicação Harbour com ASProtect

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

NiKnight
Usuário Nível 1
Usuário Nível 1
Mensagens: 1
Registrado em: 27 Dez 2014 19:05
Localização: London/UK

Protegendo aplicação Harbour com ASProtect

Mensagem por NiKnight »

Olá a todos,

Estou finalizando a migração de uma aplicação de Clipper para Harbour. Utilizo o xEdit com Harbour 3.0 e BCC 5.8.2 e como a aplicação é bem simples (5 tabelas com DBEdit) até agora sem problemas na conversão.
Com a possibilidade de gerar uma aplicação Win32 resolvi tentar proteger a aplicação utilizando o ASProtect32 SKE que já utilizo nos projetos em Delphi com sucesso. O ASProtect32 possui uma lib para BCC e consegui fazer o link declarando as funções com HB_FUNC. Até agora tudo OK.
O problema começa quando necessito fazer um include de código dentro do Harbour usando um __emit__ ( ou DB ) para que o ASProtect32 processe o exe e identifique as chamadas de início e fim de criptografia do código. Como é um código em C, preciso fazer que o Harbour insira um código __asm dentro de uma procedure, por exemplo:

Procedure Teste()
__asm db 0x01, 0x02, 0x03 //Inicio Criptografia
Alert("Descriptografado")
__asm db 0x91, 0x92, 0x93 //Fim Criptografia
Return

Apenas quem tiver a chave de descriptografia irá executar o Alert. Tanto Delphi, C++, PureBasic possuem comandos para isso, mas o Harbour não.

---------------------------------------------------------------------
Tentativa 1) - begindump/enddump mesclado
---------------------------------------------------------------------

Procedure Teste()
#pragma begindump
__asm db 0x01, 0x02, 0x03 //Inicio Criptografia
#pragma enddump
Alert("Descriptografado")
#pragma begindump
__asm db 0x91, 0x92, 0x93 //Fim Criptografia
#pragma enddump
Return

Utlizando o prama begindump/enddump consigo inserir a chamada __asm, mas parece o conteúdo do begindump/enddump é compilado numa área diferente pois o código __asm não é inserido exatamente na posição indicada. O Alert é executado mesmo sem a chave.

---------------------------------------------------------------------
Tentativa 2) - hb_inline
---------------------------------------------------------------------

Procedure Teste()
hb_inline();
{
__asm db 0x01, 0x02, 0x03 //Inicio Criptografia
}
Alert("Descriptografado")
hb_inline();
{
__asm db 0x91, 0x92, 0x93 //Fim Criptografia
}
Return

Utlizando o hb_inline parece que o código é inserido na posição exata, a aplicação compila, mas a execução gera uma exceção C000005 no segundo hb_inline. Mesmo assim o Alert é executado mesmo sem a chave.

---------------------------------------------------------------------
Tentativa 3) - begindump/enddump apenas
---------------------------------------------------------------------

#pragma begindump
#include "hbapi.h"
#include "Windows.h"
HB_FUNC( FINDWINDOW )
{
__asm db 0x01, 0x02, 0x03 //Inicio Criptografia
hb_retnl( (LONG)FindWindow( NULL, hb_parc(1) ) ) ;
__asm db 0x91, 0x92, 0x93 //Fim Criptografia
}
#pragma enddump

Nesse caso quando chamo a função FINDWINDOW no Harbour o código Win32 não é executado pois está protegido e somente com a chave irá executar. É exatamente esse comportamente que gostaria que funcionasse no código Harbour, a fim de que uma procedure só execute com a chave.

Alguma idéia em como conseguir esse comportamento no Harbour?

Obrigado pela atenção,
--
Responder