Jump to content

O Retorno dos Membros VIP Junte-se ao Clube

Obtenha destaque e desfrute os benefícios exclusivos para VIP.
Clique Aqui

Reporte bugs e nos ajude a melhorar!

Nos ajude a descobrir bugs! Além de melhorar a comunidade.
Reporte aqui!

Conheça a Lotérica e arrisque sua sorte!

Descubra o quão sortudo você pode ser.
Saiba mais
Notícia
  • Junte-se ao Clube de membros VIP!
  • Teste sua sorte em nossa loteria e concorra a uma fortuna de webcoins!
metal bass

[Ajuda] ERRO DLL

Recommended Posts

Oi,

 

Da uma linda neste artigo deste blog

 

[spoiler=Como lidar com erros de “access violation at address in module” em Delphi]

Todo programador Delphi algum dia já precisou lidar com um erro de Access Violation aparecendo na tela de seu sistema. Esse tipo de erro é tão comum que já até ganhou o carinhoso apelido de “AV”. Estes erros, também conhecidos por falhas de segmentação , ocorrem quando alguma parte do software tenta acessar um endereço de memória inválido, ou que já esteja em uso.

 

Os AV’s são erros que podem tirar o sono de um programador, pois apesar de serem – na maioria dos casos – simples de resolver, eles são muito difíceis de serem encontrados. Por ocorrerem apenas em tempo de execução, e às vezes aleatoriamente, a correção deste tipo de erro exige uma certa experiência do programador na linguagem.

 

Uma maneira comum de ocorrer um AV é quando tentamos acessar um método de um objeto que ainda não foi instanciado. Neste caso a solução é simples, bastando instanciar o objeto corretamente para depois acessar seu método.

 

Outra maneira, um pouco mais complicada, ocorre quando tentamos referenciar um ponteiro nulo. Traduzindo, podemos dizer que alguém tentou acessar algo que não existia mais, e assim ocorre o AV. Os AV’s são comuns de aparecer em recursões com criação dinâmica de objetos, ou quando liberamos um objeto com muitos outros vinculados a ele, por exemplo, quando fechamos um formulário. Ao tentar destruir o objeto principal, se algum dos objetivos vinculados já tiver sido destruído, o seu vínculo ao objeto principal ainda existirá. Por esse vínculo o sistema tenta destruir o objeto novamente, causando o AV. Nestes casos, é comum que os AV’s venham acompanhados de Memory Leaks, que causam um consumo exagerado de memória por parte do sistema, sem a posterior liberação da mesma.

 

Um problema grave com os AV’s, e que tira o sono de programadores, é que na maioria das vezes eles são difíceis de serem reproduzidos. E quando um programador não consegue reproduzir um erro, o trabalho para corrigí-lo é muito maior.

 

Para tentar minimizar este problema surgiram algumas ferramentas que ajudam programadores Delphi a encontrar os AV’s e corrigí-los. São as ferramentas de log de erros, como o

ou o
. As duas fazem o mesmo trabalho de analisar os dados gerados pelo software e identificar pontos onde as falhas ocorrem, dando ao programador informação relevante para que ele possa encontrar o ponto no código no qual os erros estão ocorrendo.

 

Estas ferramentas não são balas de prata que resolverão todos os casos, porém através delas o tempo gasto para encontrar e corrigir um Access Violation pode ser bem menor.

 

Uma outra abordagem mais proativa é utilizarmos processos que garantam a qualidade de nosso software, como o Desenvolvimento Orientado a Testes (TDD) e a Integração Contínua. Ao utilizar estes processos em seu dia a dia o programador passa a ter ferramentas que garantem que os problemas de Access Violation e outros serão encontrados mais rapidamente, pois os testes são rodados a todo momento e quando um erro for injetado no código, ele será detectado quase que imediatamente.

 

Fonte:

 

 

 

 

Da uma olhada nas ferramentas que ele indica e ve se lhe ajuda no seu caso.

 

Abçs!

  • Like 1

Share this post


Link to post
Share on other sites

No endereço de memória da sua DLL "0D71E0BD" uma linha de código está tentando "ler" o endereço de memória "0006C48A" que é inválido. Como se trata de um DLL creio que o endereço que não pode ser lido é do .text do processo que você injetou a DLL, normalmente esses erros ocorrem pois aquela seção da memória necessita de privilégios, read, write ou execute, ou as 3 juntas. Para contornar isso basta você chamar a função VirtualProtect apontando para o endereço e passando os privilégios.

 

Outra hipótese é que o endereço de memória não existe .-.

  • Like 1

b34c171261.png

Share this post


Link to post
Share on other sites
Oi,

 

Da uma linda neste artigo deste blog

 

[spoiler=Como lidar com erros de “access violation at address in module” em Delphi]

Todo programador Delphi algum dia já precisou lidar com um erro de Access Violation aparecendo na tela de seu sistema. Esse tipo de erro é tão comum que já até ganhou o carinhoso apelido de “AV”. Estes erros, também conhecidos por falhas de segmentação , ocorrem quando alguma parte do software tenta acessar um endereço de memória inválido, ou que já esteja em uso.

 

Os AV’s são erros que podem tirar o sono de um programador, pois apesar de serem – na maioria dos casos – simples de resolver, eles são muito difíceis de serem encontrados. Por ocorrerem apenas em tempo de execução, e às vezes aleatoriamente, a correção deste tipo de erro exige uma certa experiência do programador na linguagem.

 

Uma maneira comum de ocorrer um AV é quando tentamos acessar um método de um objeto que ainda não foi instanciado. Neste caso a solução é simples, bastando instanciar o objeto corretamente para depois acessar seu método.

 

Outra maneira, um pouco mais complicada, ocorre quando tentamos referenciar um ponteiro nulo. Traduzindo, podemos dizer que alguém tentou acessar algo que não existia mais, e assim ocorre o AV. Os AV’s são comuns de aparecer em recursões com criação dinâmica de objetos, ou quando liberamos um objeto com muitos outros vinculados a ele, por exemplo, quando fechamos um formulário. Ao tentar destruir o objeto principal, se algum dos objetivos vinculados já tiver sido destruído, o seu vínculo ao objeto principal ainda existirá. Por esse vínculo o sistema tenta destruir o objeto novamente, causando o AV. Nestes casos, é comum que os AV’s venham acompanhados de Memory Leaks, que causam um consumo exagerado de memória por parte do sistema, sem a posterior liberação da mesma.

 

Um problema grave com os AV’s, e que tira o sono de programadores, é que na maioria das vezes eles são difíceis de serem reproduzidos. E quando um programador não consegue reproduzir um erro, o trabalho para corrigí-lo é muito maior.

 

Para tentar minimizar este problema surgiram algumas ferramentas que ajudam programadores Delphi a encontrar os AV’s e corrigí-los. São as ferramentas de log de erros, como o

ou o
. As duas fazem o mesmo trabalho de analisar os dados gerados pelo software e identificar pontos onde as falhas ocorrem, dando ao programador informação relevante para que ele possa encontrar o ponto no código no qual os erros estão ocorrendo.

 

Estas ferramentas não são balas de prata que resolverão todos os casos, porém através delas o tempo gasto para encontrar e corrigir um Access Violation pode ser bem menor.

 

Uma outra abordagem mais proativa é utilizarmos processos que garantam a qualidade de nosso software, como o Desenvolvimento Orientado a Testes (TDD) e a Integração Contínua. Ao utilizar estes processos em seu dia a dia o programador passa a ter ferramentas que garantem que os problemas de Access Violation e outros serão encontrados mais rapidamente, pois os testes são rodados a todo momento e quando um erro for injetado no código, ele será detectado quase que imediatamente.

 

Fonte:

 

 

 

 

Da uma olhada nas ferramentas que ele indica e ve se lhe ajuda no seu caso.

 

Abçs!

 

Não deu nenhum erro.. Mas obrigado !

 

 

No endereço de memória da sua DLL "0D71E0BD" uma linha de código está tentando "ler" o endereço de memória "0006C48A" que é inválido. Como se trata de um DLL creio que o endereço que não pode ser lido é do .text do processo que você injetou a DLL, normalmente esses erros ocorrem pois aquela seção da memória necessita de privilégios, read, write ou execute, ou as 3 juntas. Para contornar isso basta você chamar a função VirtualProtect apontando para o endereço e passando os privilégios.

 

Outra hipótese é que o endereço de memória não existe .-.

 

Realmente pode ser a address que coloquei... vou tentar outras aqui... Obrigado !

 

 

Quando se tem apenas um pointer

fica assim ?

adrs := PDWORD(adrs)^;

adrs := adrs + $1BC;

Share this post


Link to post
Share on other sites

Quando se trabalha com endereços fixos se usa:

PDWORD($ADDR)^:=Value;

Você pode variar o tipo alterando para PSINGLE, PBYTE, etc...

 

Para se trabalhar com Ponteiros deve apontar o endereço da struct e o deslocamento.

PDWORD(PDWORD($AddrPClass)^+$Offset)^:=Value;

 

Entenda que ele vai fazer ponteiro para o AddrPClass e ler oque está dentro dele, o valor encontrado la dentro + offset vai apontar para um elemento único dentro daquela struct, que normalmente é onde fica guardado os valores por exemplo dos status do personagem.

 

O Primeiro PDWORD que citei no exemplo é para o ponteiro, logo ele vai ler como um DWORD o elemento encontrado na struct, porém se você quizer ler um elemento do tipo float por exemplo, bastaria você trocar por PSINGLE, e assim vai variando os tipos.

Você pode adicionar mais offsets adicionando + PDWORD e fazendo a soma.

 

É bom ressaltar que as offsets são sempre do tipo PDWORD, nunca se altera.

  • Like 1

b34c171261.png

Share this post


Link to post
Share on other sites

Entendi mano!!!

Obrigado a todos vocês !

Obs: Eu consegui aqui :v realmente o address era inválido

Pode fechar o tópico por favor.

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

×
×
  • Create New...