Membros Pro bnobre Postado Sábado as 12:58 Membros Pro Postado Sábado as 12:58 Olá a todos, Quando compilamos um executável no Delphi, ao tentarmos abrir o mesmo em um editor de texto (Notepad++ por exemplo), parte do código é exposta, como nome de componentes, propriedades do mesmo, etc. Gostaria de saber porque isso ocorre? Já que em teoria o código foi convertido para linguagem binária E em caso de informações sensíveis, como credenciais de banco, senhas, existe a possibilidade de garantir a não exposição de tais informações? Desde já agradeço a atenção
Moderadores Juliomar Marchetti Postado Sábado as 20:04 Moderadores Postado Sábado as 20:04 No caso de senhas e dados bancarios ficam no banco. nunca jamais devem ficar fixas no código fonte do seu sistema. correto? Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br
Fundadores Daniel Simoes Postado Sábado as 21:07 Fundadores Postado Sábado as 21:07 Os compiladores criam tabelas de Resources, com as Strings Os métodos também tem seus nomes alocados em tabelas internas do executavel... Voce poderia passar o executavel por um descompactador em RunTime como o UPX https://upx.github.io/ Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Membros Pro bnobre Postado Sábado as 22:31 Autor Membros Pro Postado Sábado as 22:31 Aqui é só pra dar um exemplo mais visual do que estou falando... Eu reparei uma coisa... Quando preencho PELO OBJECT INSPECTOR a propriedade do componente, por exemplo uma senha no componente de acesso ao banco de dados ou uma senha no ACBrMail ou qualquer outra propriedade de qualquer outro componente, eu consigo visualizar da maneira que disse (abrindo pelo bloco de notas). Porém se eu preencho a propriedade DIRETO no código fonte, no *.pas, a informação não aparece mais. É como se ele convertesse em binário todo o código fonte do *.pas, mas a parte que faz referências as propriedades dos componentes preenchidas no OBJECT INSPECTOR não fosse convertidas. Eu tentei achar algo a respeito na documentação da Embarcadero para entender melhor o processo, porém não achei nada. Alguém saberia explicar como isso funciona? Essa minha percepção está correta? 2 horas atrás, Juliomar Marchetti disse: No caso de senhas e dados bancarios ficam no banco. nunca jamais devem ficar fixas no código fonte do seu sistema. correto? Olá @Juliomar Marchetti, tudo bom meu amigo? Ao meu ver não exatamente, pois onde você iria salvar por exemplo a senha de acesso ao banco?!?!... No meu caso eu coloco no código fonte do executável. 1 hora atrás, Daniel Simoes disse: Os compiladores criam tabelas de Resources, com as Strings Os métodos também tem seus nomes alocados em tabelas internas do executavel... Voce poderia passar o executavel por um descompactador em RunTime como o UPX https://upx.github.io/ Olá @Daniel Simoes, tudo bom meu amigo? Me perdoe, mas o que seriam essas tabelas de Resources e a quais Métodos está se referindo? Outra questão, o que você costuma fazer para ocultar por exemplo a senha de acesso do banco de dados no executável?!?! Desde já agradeço a atenção de todos
Fundadores Daniel Simoes Postado Domingo as 03:17 Fundadores Postado Domingo as 03:17 Nao è uma boa prática salvar senha hardcoded... Isso expoem a senha e nao lhe permitira mudar a senha quando necessário As senha devem estar em um arquivo de configuração e salvas de forma criptografada Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Membros Pro bnobre Postado Domingo as 11:06 Autor Membros Pro Postado Domingo as 11:06 7 horas atrás, Daniel Simoes disse: Nao è uma boa prática salvar senha hardcoded... Isso expoem a senha e nao lhe permitira mudar a senha quando necessário As senha devem estar em um arquivo de configuração e salvas de forma criptografada Porém conteúdos criptografados precisam de uma chave para realizar a descriptografia... Onde essa chave seria salva?!?! Você teria algum exemplo ou artigo explicando esse procedimento?!?! Busquei na internet e não achei nada a respeito e pra ser sincero estou meio perdido nisso. E sobre a questão do código exposto... Saberia me dizer porque parte é exposta (a princípio as propriedades dos componentes) e outra não (a princípio o conteúdo do *.pas)? Desde já agradeço a atenção
Fundadores Daniel Simoes Postado Segunda as 01:16 Fundadores Postado Segunda as 01:16 A chave nao precisa/pode ser uma String... Pode ser uma cadeia de caracteres ASC... Exemplo: Chave = #23+#45+#155+#129+#2+#76 14 horas atrás, bnobre disse: E sobre a questão do código exposto Porque o Delphi salva todo DFM como um Resource do executável Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Membros Pro bnobre Postado Segunda as 01:23 Autor Membros Pro Postado Segunda as 01:23 2 minutos atrás, Daniel Simoes disse: A chave nao precisa/pode ser uma String... Pode ser uma cadeia de caracteres ASC... Exemplo: Chave = #23+#45+#155+#129+#2+#76 Porque o Delphi salva todo DFM como um Resource do executável Olá @Daniel Simoes, tudo bom?! Poderia me explicar o que seria esse Resource do Executável?!?!
Fundadores Daniel Simoes Postado Segunda as 01:41 Fundadores Postado Segunda as 01:41 O assunto é bastante técnico.. Diz respeito a blocos de Dados que são anexados no Executavél do Windows Veja esses links https://en.m.wikipedia.org/wiki/Resource_(Windows) https://docwiki.embarcadero.com/RADStudio/Sydney/en/Resource_file_(Delphi) Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Moderadores Juliomar Marchetti Postado Segunda as 11:59 Moderadores Postado Segunda as 11:59 Em 26/07/2025 at 19:31, bnobre disse: Ao meu ver não exatamente, pois onde você iria salvar por exemplo a senha de acesso ao banco?!?!... No meu caso eu coloco no código fonte do executável. Acho que o Daniel já falou acima, mas isso ficaria em um arquivo criptografado, ini, txt,json ou até no registro do windows. e como dito pelo Daniel creio que isso será em um .pas enão no dfm salvo a criptografia então não ficaria exposto Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br
Membros Pro bnobre Postado Segunda as 16:20 Autor Membros Pro Postado Segunda as 16:20 14 horas atrás, Daniel Simoes disse: O assunto é bastante técnico.. Diz respeito a blocos de Dados que são anexados no Executavél do Windows Veja esses links https://en.m.wikipedia.org/wiki/Resource_(Windows) https://docwiki.embarcadero.com/RADStudio/Sydney/en/Resource_file_(Delphi) Olá @Daniel Simoes... Realmente, até o momento eu nem conhecia esses termos, obrigado pela explanação e direcionamento. Mas pelo que eu vi de maneira prática é o seguinte: Se eu colocar o apontamento da senha pelo OBJECT INSPECTOR fica salvo no *.dfm e consequentemente irá aparecer pelo Bloco de Notas, porém se eu coloco direto no código, no *.pas, aí não aparece mais... Estou correto?
Fundadores Daniel Simoes Postado Segunda as 17:02 Fundadores Postado Segunda as 17:02 Isso mesmo... com uma pequena correção... No momento de compilação, todas as Strings sao alocadas em uma Tabela de Strings e anexada como Resources no .EXE Ou seja, elas também ficarão visíveis... Use os Códigos ASC, como demonstrado acima, para ocultar melhor... Também evite nomes de Variáveis ou métodos como "Senha"... Os Hackers sabendo onde elas estão podem mudar direto no Binário e atribuir um novo valor Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Membros Pro bnobre Postado Segunda as 17:15 Autor Membros Pro Postado Segunda as 17:15 5 minutos atrás, Daniel Simoes disse: Isso mesmo... com uma pequena correção... No momento de compilação, todas as Strings sao alocadas em uma Tabela de Strings e anexada como Resources no .EXE Ou seja, elas também ficarão visíveis... Use os Códigos ASC, como demonstrado acima, para ocultar melhor... Também evite nomes de Variáveis ou métodos como "Senha"... Os Hackers sabendo onde elas estão podem mudar direto no Binário e atribuir um novo valor Hummmmmm... Interessante... Na verdade nos testes que fiz aqui ao alimentar a propriedade Password do componente pelo OBJECT INSPECTOR apareceu o conteúdo no Bloco de Notas como já relatei, mas bastou colocar direto no código fonte (*.pas) que deixou de aparecer no Bloco de Notas, mesmo sendo uma propriedade String. Porém como você disse que todos os valores String vão para o Resources então creio que com outras técnicas é possível acessar o conteúdo... Estou correto?!?!? Sobre a dica das variáveis ou métodos, aí complica... Pois nos componentes onde se coloca uma senha usualmente é no campo senha, como no ACBrMail por exemplo. Sobre o Código ASCII, conforme você disse vai apenas ocultar "melhor", mas bastaria a conversão do ASCII para texto tradicional para achar o valor. O ideal mesmo era não aparecer nada, ao meu ver. Interessante como não tem muito conteúdo a respeito na internet ou eu ao menos não achei. É um assunto de extrema importância.
Fundadores Daniel Simoes Postado Segunda as 19:32 Fundadores Postado Segunda as 19:32 2 horas atrás, bnobre disse: Interessante como não tem muito conteúdo a respeito na internet ou eu ao menos não achei. É um assunto de extrema importância. por isso que os Hackers tem tanto sucesso... Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Membros Pro bnobre Postado Segunda as 19:35 Autor Membros Pro Postado Segunda as 19:35 7 horas atrás, Juliomar Marchetti disse: Acho que o Daniel já falou acima, mas isso ficaria em um arquivo criptografado, ini, txt,json ou até no registro do windows. e como dito pelo Daniel creio que isso será em um .pas enão no dfm salvo a criptografia então não ficaria exposto Essa que é a grande questão... As Strings no *.pas ficam expostas ou não????? Se não, basta simplesmente jogar os conteúdos sensíveis na mesma!!!
Fundadores Daniel Simoes Postado Segunda as 20:13 Fundadores Postado Segunda as 20:13 Delphi 7 Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Membros Pro bnobre Postado Segunda as 20:19 Autor Membros Pro Postado Segunda as 20:19 2 minutos atrás, Daniel Simoes disse: Delphi 7 Nossa... Bem que tu falou... Que incrível isso kkkkkkkkkkkkkkkk Então creio que como você falou, devemos colocar em ASCII para "disfarçar melhor", pois continuará aparecendo, mas não de forma literal como o exemplo acima. E em relação a sua dica de não usar variáveis ou métodos com a palavra senha é bacana, mas no caso dos campos dos componentes que já usam essa expressão não tem muito o que se fazer, pelo menos eu não vejo como.
Membros Pro bnobre Postado Segunda as 20:35 Autor Membros Pro Postado Segunda as 20:35 Pena que não existe uma documentação mais detalhada sobre o assunto pra termos uma discussão/noção técnica melhor de como isso funciona e a coisa não ficar tão ao "acaso". Pois como você exemplificou aí, apareceu a string usada para alimentar a propriedade do componente via *.pas, já aqui no meu caso quando alimentei a propriedade do componente via *.pas parou de aparecer o valor literal da string. Não consigo portanto achar um padrão e sem uma documentação mais rica sobre o assunto dificulta a escolha de uma técnica mais assertiva.
Moderadores Juliomar Marchetti Postado Segunda as 21:26 Moderadores Postado Segunda as 21:26 50 minutos atrás, bnobre disse: Pena que não existe uma documentação mais detalhada sobre o assunto pra termos uma discussão/noção técnica melhor de como isso funciona e a coisa não ficar tão ao "acaso". Pois como você exemplificou aí, apareceu a string usada para alimentar a propriedade do componente via *.pas, já aqui no meu caso quando alimentei a propriedade do componente via *.pas parou de aparecer o valor literal da string. Não consigo portanto achar um padrão e sem uma documentação mais rica sobre o assunto dificulta a escolha de uma técnica mais assertiva. senão me engano a gente tinha lá em 2002 , 2003 uma materia chamada compiladores na faculdade. que lembro de ter todo o material que talvez tu esteja falando. 1 Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br
Moderadores BigWings Postado Segunda as 21:36 Moderadores Postado Segunda as 21:36 59 minutos atrás, bnobre disse: Pois como você exemplificou aí, apareceu a string usada para alimentar a propriedade do componente via *.pas, já aqui no meu caso quando alimentei a propriedade do componente via *.pas parou de aparecer o valor literal da string. Se o teu Delphi é 2009 ou acima, as strings são gravadas em unicode, 2 bytes por caractere. Ainda assim é bem fácil localizar: 2 BigWingsAjude o Projeto ACBr crescer - Assine o SAC
Fundadores Daniel Simoes Postado Segunda as 22:28 Fundadores Postado Segunda as 22:28 2 horas atrás, bnobre disse: E em relação a sua dica de não usar variáveis ou métodos com a palavra senha é bacana, mas no caso dos campos dos componentes que já usam essa expressão não tem muito o que se fazer, pelo menos eu não vejo como. atribuir em RunTime, já ajuda bastante... nesse caso o "Hacker" só conseguiria acesso ao conteúdo, se tivesse ferramentas e conhecimento muito bom... Algumas senhas do ACBr, são modificadas no "Setter", para ficarem criptografadas, com uma chave temporária, mesmo em memória... é o caso da senha dos certificados.. veja: procedure TDFeSSL.SetSenha(const AValue: AnsiString); begin if (FK <> '') and (FSenha = StrCrypt(AValue, FK)) then Exit; FK := FormatDateTime('hhnnsszzz',Now); FSenha := StrCrypt(AValue, FK); // Salva Senha de forma Criptografada, para evitar "Inspect" if CertificadoLido then DescarregarCertificado; end; Usa o UPX https://upx.github.io/ ele realmente irá embaralhar todo o conteúdo do Executável (e compacta-lo)... o UPX anexa no executável, um "loader" que é um descompactador em memória... Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Membros Pro TiagoTecchio Postado Terça as 11:36 Membros Pro Postado Terça as 11:36 Bom dia, Na verdade nem o UPX salva, infelizmente... Se for utilizado um utilitário como o ProcessExplorer, dá pra ver o conteúdo em memória. Gerei um executável de teste com o DXE6 e "compactei" no UPX. Usando o ProcessExplorer, na opção "Image" tudo fica embaralhado mas usando a opção "Memory" consigo ver os strings do executável. 1 1
Membros Pro bnobre Postado Terça as 12:34 Autor Membros Pro Postado Terça as 12:34 (editado) 15 horas atrás, BigWings disse: Se o teu Delphi é 2009 ou acima, as strings são gravadas em unicode, 2 bytes por caractere. Ainda assim é bem fácil localizar: Olá @BigWings, tubo bom?O meu é o Delphi 11... Nossa, é simplesmente tão vulnerável!!!!! Olá @Daniel Simoes, Você comenta o seguinte: Citar atribuir em RunTime, já ajuda bastante... Quando eu atribui a propriedade string do componente em Runtime parou de exibir no bloco de notas, mas quando você fez no seu exemplo continuou exibindo, então não fez nenhuma diferença em RunTime ou via Object Inspector... Esse comportamento que eu não consegui entender, porque no meu caso funcionou e no seu não?!?! 1 hora atrás, TiagoTecchio disse: Bom dia, Na verdade nem o UPX salva, infelizmente... Se for utilizado um utilitário como o ProcessExplorer, dá pra ver o conteúdo em memória. Gerei um executável de teste com o DXE6 e "compactei" no UPX. Usando o ProcessExplorer, na opção "Image" tudo fica embaralhado mas usando a opção "Memory" consigo ver os strings do executável. Olá @TiagoTecchio, obrigado por essa observação. Na verdade pelo que vi até o momento das observações dos amigos não há nada que efetivamente proteja o conteúdo das strings. A técnica usada é dificultar a leitura através da criptografia e aplicar as chaves da criptografia com o uso dos valores em ASCII. Correto?!?! Editado Terça as 12:44 por bnobre
Membros Pro TiagoTecchio Postado Terça as 12:52 Membros Pro Postado Terça as 12:52 Acredito que não é a questão de ser vulnerável, mas a forma como implementamos. Já li artigos que em aplicações Java dá até pra fazer engenharia reversa dos .JAR, expondo a lógica. Por exemplo, os APKs do Android são na verdade um zip com múltiplas pastas e recursos java, que podem ser inspecionados. Não creio que o Delphi seja menos seguro por isso. 1
Membros Pro bnobre Postado Terça as 12:57 Autor Membros Pro Postado Terça as 12:57 Agora, TiagoTecchio disse: Acredito que não é a questão de ser vulnerável, mas a forma como implementamos. Já li artigos que em aplicações Java dá até pra fazer engenharia reversa dos .JAR, expondo a lógica. Por exemplo, os APKs do Android são na verdade um zip com múltiplas pastas e recursos java, que podem ser inspecionados. Não creio que o Delphi seja menos seguro por isso. Concordo meu amigo... Agora que eu sei dessa "característica", gostaria de saber a técnica usada pelos programadores em Delphi para minimizar tal situação. Pelo relato dos amigos do fórum que são programadores Delphi de longa data, creio que é focar na questão da criptografia e mascaramento da chave criptográfica usando os caracteres ASCII, porém sabendo que não é nada 100%.
Recommended Posts
Crie uma conta ou entre para comentar
Você precisar ser um membro para fazer um comentário
Criar uma conta
Crie uma nova conta em nossa comunidade. É fácil!
Crie uma nova contaEntrar
Já tem uma conta? Faça o login.
Entrar Agora