/** Mauricio Portela Pires -------------------------------------------------------------------------------- Objetivo: Evitar que terceiros extraiam o binario comprimido com UPX. (ou pelo menos, dificultar!) Modifica a assinatura do UPX, trocando por qualquer outra sequencia. -------------------------------------------------------------------------------- Procedimento: 1) compilar um arquivo com o hbmk2: hbmk2 teste.prg 2) comprimir o arquivo binario gerado: upx -9 teste.exe 3) verificar se arquivo foi comprimido: upx -l teste.exe 4) usar o codigo para trocar a string (assinatura) do UPX: patcher teste.exe 5) teste se o arquivo pode ser extraido: upx -d teste.exe -------------------------------------------------------------------------------- Compilar: hbmk2 patcher.prg -lhbct **/ #include "fileio.ch" FUNCTION Main(cFile) LOCAL cBakFile, hFile, cBuffer, cHashOri, cHashMod LOCAL cOldSign := "UPX!" LOCAL cNewSign := "C0CA" // Nova string (mesmo tamanho da 'cOldSign' (4)) IF EMPTY(cFile) ? "Uso correto: patcher.exe " ? "Exemplo: patcher.exe arquivo[.exe]" RETURN Nil ENDIF cFile := ALLTRIM(cFile) IF !(LOWER(RIGHT(cFile, 4)) == ".exe") cFile += ".exe" ENDIF IF !FILE(cFile) ? "Erro: O arquivo '" + cFile + "' nao foi encontrado!" RETURN Nil ENDIF hFile := FOpen(cFile, FO_READ) IF (FError() != 0) ? "Erro ao abrir o arquivo para validacao. Codigo:", FError() RETURN Nil ENDIF cBuffer := Space(2) FRead(hFile, @cBuffer, 2) FClose(hFile) IF !(cBuffer == "MZ") ? "Erro: O arquivo nao e um executavel Windows valido." RETURN Nil ENDIF cHashOri := hb_MD5File(cFile) cBakFile := cFile + ".bak" ? "Criando backup: " + cBakFile + "..." IF FILE(cBakFile) FErase(cBakFile) ENDIF IF (FileCopy(cFile, cBakFile) == 0) ? "Erro ao criar o arquivo de backup!" RETURN Nil ENDIF hFile := FOpen(cFile, FO_READWRITE) IF (FError() != 0) ? "Erro ao abrir o arquivo para modificacao. Codigo:", FError() RETURN Nil ENDIF ? "Processando alteracoes no binario..." cBuffer := Space(FSeek(hFile, 0, FS_END)) FSeek(hFile, 0, FS_SET) FRead(hFile, @cBuffer, Len(cBuffer)) IF cOldSign $ cBuffer cBuffer := StrTran(cBuffer, cOldSign, cNewSign) FSeek(hFile, 0, FS_SET) FWrite(hFile, cBuffer) FWrite(hFile, "", 0) FClose(hFile) ? "Sucesso! O arquivo '" + cFile + "' foi modificado com exito." cHashMod := hb_MD5File(cFile) ? "" ? "INTEGRIDADE (MD5)" ? "....Backup (Original) :", cHashOri ? "....Binario Protegido :", cHashMod ? "" ? "Os hashes sao diferentes? " + iif(cHashOri != cHashMod, ; "SIM (Modificado com sucesso)", ; "NAO (Falha)") ? "" ELSE FClose(hFile) ? "Aviso: A assinatura 'UPX!' nao foi encontrada neste binario." ENDIF RETURN Nil