O código que mencionei:
#include "box.ch"
#include "inkey.ch"
#include "fileio.ch"
#include "getexit.ch"
FUNCTION Main()
SET SCORE OFF
SET DATE FORMAT TO "dd/mm/yyyy"
cSistema := "Controle Financeiro"
cls
IF .NOT. PROTECT()
? "Erro: Sistema corrompido (STR-0001)."
? "Contactar o desenvolvedor."
QUIT
ENDIF
@ 22, 00 SAY "FINAL!"
RETURN NIL
FUNCTION PROTECT()
PRIVA nHandler, cBuffer, lRet, cTexto, p, tamanhoArquivo, cArquivo
// Digitar com atencao a linha abaixo:
cCodigo := "EXEEXEEXEEXEWWWWWWWWWWWWYYYYYYYYYYYY"
// Se primeira execucao, protege.
IF REPLICATE("EXE", 4) $ cCodigo
CLS
cArquivo := SPACE(12)
cTexto := SPACE(20)
SETCOLOR("W+/B")
@ 00,00,03,79 BOX B_SINGLE + SPACE(1)
@ 01, 02 SAY "Digite o nome do .EXE a ser protegido: " GET cArquivo VALID !EMPTY(cArquivo)
@ 02, 02 SAY "Digite a String a ser protegida : " GET cTexto VALID !EMPTY(cTexto)
READ
IF LASTKEY() == K_ESC
QUIT
ENDIF
@ 04,00,06,79 BOX B_SINGLE + SPACE(1)
@ 05, 02 SAY "Protegendo..."
cArquivo := ALLTRIM(UPPER(cArquivo))
IF .NOT. "." $ cArquivo
cArquivo += ".EXE"
ENDIF
// Abre arquivo a nivel de DOS
nHandler := FOPEN(cArquivo, 64) // era 2
IF FERROR() # 0
@ 07,00,09,79 BOX B_SINGLE + SPACE(1)
@ 08, 02 SAY "Erro na abertura do arquivo " + cArquivo
QUIT
ENDIF
tamanhoArquivo := FSEEK(nHandler, 0, FS_END) // era 2
FSEEK(nHandler, 0, 0)
// ***
cBuffer := SPACE(512)
cTexto := ALLTRIM(cTexto)
// --------------
p := ACHOU(cTexto)
IF p == 0
@ 07,00,09,79 BOX B_SINGLE + SPACE(1)
@ 08, 00 SAY "String nao encontrada em " + cArquivo
QUIT
ENDIF
bytes1 := 0
FORMULA()
IF ACHOU(REPL("EXE", 4)) == 0
RETURN .F.
ENDIF
nPosicao := AT("EXE", cBuffer)
cBuffer1 := SUBSTR(cArquivo + SPACE(12), 1, 12) + STRZERO(bytes1, 12) + STRZERO(p, 12)
cBuffer := STUFF(cBuffer, nPosicao, 36, cBuffer1)
// -----------------------------------------------------------------------------
alert("Arquivo:;[" + cArquivo + "];" + ;
"Sequencia Inicial:;[" + alltrim(cCodigo) + "];" + ;
"Valor para gravar:;[" + alltrim(cBuffer1) + "]")
// -----------------------------------------------------------------------------
FSEEK(nHandler, -512, 1)
FWRITE(nHandler, cBuffer1)
FCLOSE(nHandler)
@ 07,00,09,79 BOX B_SINGLE + SPACE(1)
@ 08, 02 SAY "Arquivo protegido"
// Se nao eh a primeira execucao, verifica protecao
ELSE
cArquivo := ALLTRIM(SUBSTR(cCodigo, 1, 12))
bytes := VAL(SUBSTR(cCodigo, 13, 12))
desloca := VAL(SUBSTR(cCodigo, 25, 12))
// -----------------------------------------------------------------------------
alert("Arquivo:;[" + cArquivo + "];" + ;
"Sequencia:;[" + alltrim(cCodigo) + "];" + ;
"Bytes GRAVADOS:;[" + alltrim(str(bytes)) + "];" + ;
"Deslocamento:;[" + alltrim(str(desloca)) + "]")
// -----------------------------------------------------------------------------
IF .NOT. PROTECT1()
RETURN .F.
ENDIF
ENDIF
// CLS
RETURN .T.
FUNCTION PROTECT1()
nHandler = FOPEN( cArquivo, 0)
IF FERROR() # 0
// CLS
@ 07,00,09,79 BOX B_SINGLE + SPACE(1)
@ 08, 02 SAY "Erro no arquivo .EXE"
QUIT
ENDIF
cBuffer := SPACE(512)
FSEEK(nHandler, desloca)
FREAD(nHandler, @cBuffer, 512)
bytes1 := 0
FORMULA()
IF bytes1 == bytes
lRet := .T.
ELSE
// CLS
@ 07,00,09,79 BOX B_SINGLE + SPACE(1)
@ 08, 02 SAY "Arquivo foi alterado"
lRet := .F.
ENDIF
FCLOSE(nHandler)
RETURN lRet
FUNCTION ACHOU(cTexto)
PRIVA q
FSEEK(nHandler, 0, 0)
FOR q := 0 TO tamanhoArquivo STEP 512
FREAD(nHandler, @cBuffer, 512)
IF AT(cTexto, cBuffer) != 0
RETURN q
ENDIF
NEXT
RETURN 0
FUNCTION FORMULA()
FOR a := 1 TO 512
bytes1 := bytes1 + ASC(SUBSTR(cBuffer, a, 1)) + a
NEXT
RETURN .T.
Segue anexo o relato com print.
Att.
Mauricio Portela