Ir para conteúdo

Como parar um While?


Gabriel de Lima

Posts Recomendados

Eu estou fazendo uns testes, eu fiz um código super simples:

#include <Windows.h>
#include <stdio.h>
void func_001(){
	if (IsDebuggerPresent() == 1){
		printf("Debugger Ativo.\n");
	}else{
		printf("Debugger nao ativo.\n");
	}
}
int main(){
	while(true){
	func_001();
	}
	return 0;
}

Ele só tem um loop em um IsDebuggerPresent, eu queria saber como faço para não acontecer o loop?

No IDA: 
      IsDebuggerPresent: http://prntscr.com/mj8sqp

      Main com o loop: http://prntscr.com/mj8t4b

no x64dbg: 

Main + Func_001: http://prntscr.com/mj90hp

quero muito saber como fazer para dar um break no while (mas ja que é uma CALL acho que não tem como.... até pq sou mt leigo)

Link para o comentário
Compartilhar em outros sites

ola @Gabriel de Lima espero que esteja tudo bem contigo :)

Olha eu não consigo de momento dar-te um código como exemplo porque estás a usar headers do windows que eu não tenho no meu sistema.

Mas o que te posso dizer é que o teu problema está na tua  lógica, tu quando defines a função func_001() , essa função tem retornar um valor para que ao chamar essa função na função main() tu possas comparar esse valor numa estrutura de decisão e se essa comparação for verdadeira então chamas o break para interromper esse ciclo de repetição, ou seja dentro do teu cico while está a faltar uma comparação entre dois valores um deles retornado fa tua função func_001().

Vou deixar este código para ver se perceber o que quero dizer e se consegues estruturar o teu raciocínio...

#include<stdio.h>

int soma(void){

    int num1 = 4, num2 = 3, soma_numeros;
    soma_numeros = num1 + num2;
    return soma_numeros;

};



int main(void){

    int x;

    int total = soma();

    while( x < 10){
         printf("%d\n", x);
         x++;

         if(x == total){
              break;
            }
     }


};

eu penso que seja essa a solução mas eu não sou especialista em C, talvez alguém tenha outro tipo de abordagem que eu desconheço.

Abraço. 

 

 

Link para o comentário
Compartilhar em outros sites

Eu não programo em C no Windows ; na verdade, eu não uso Windows, então não vou poder entrar em detalhes sobre o conteúdo de Windows.h, mas o erro aí foi claramente não estabelecer uma condição de parada no loop while. Uma vez que a condição sempre é verdadeira, ela nunca irá terminar, pois nunca se tornará falsa.

Eu escreveria esse código da seguinte forma:

 

#include <Windows.h>
#include <stdio.h>

int main(){

while(true){

if (IsDebuggerPresent() == 1) {

printf("Debugger Ativo.\n");
break;

}

else
printf("Debugger nao ativo.\n");

}

return 0;

}

Fazendo uso do break com uma comparação condicional (if), você cria uma exceção no fluxo de execução do programa, dando uma chance da condição se tornar falsa e encerrar o loop de while.

 

Note que é interessante você colocar em else uma função que permita verificar se em algum momento IsDebuggerPresent() muda de 0 para 1 e em caso negativo, faça algo para mudar esse valor, senão você verá um flood constante de "Debbuger não ativo" na tela.

Link para o comentário
Compartilhar em outros sites

Em 10/02/2019 em 21:38, Gabriel de Lima disse:

vcs não entenderam '-' eu estava falando parar loop pelo x64dbg, isto é possivel?

sim.

existem varias formas de fazer isso, vc pode dar um NOP no loop todo, mas não é totalmente seguro, pode-se  fazer um JMP antes do loop e pulando para o final do mesmo, assim ele nunca vai acontecer, etc.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...