Ir para conteúdo

Fernando Mercês

Administradores
  • Postagens

    1.507
  • Registro em

  • Última visita

  • Dias Ganhos

    160

Posts postados por Fernando Mercês

  1. Oi @capgaivo!

    Se liga na linha onde você faz a conta:

    emed = (qmin + qmax) / 2;

    Nessa linha, o que está à direita do igual é avaliado primeiro. Neste caso, dois tipos int são somados (qmin e qmax). O resultado, que também é um int, é  dividido por um outro int de valor 2. Ou seja, você tem um valor int sendo dividido por outro valor int. O resultado é, naturalmente, um valor do tipo int também.

    Aí como emed é float, o int resultante é promovido para float. No caso, 25 / 2 = 12 (tudo int) e 12 promovido para float é 12.0.

    Acredito que a forma mais rápida de resolver isso seja dividindo por 2.0f ou (float)2, ao invés de 2. Então você terá uma conta à direita do igual que dividirá um int por um float e o resultado de int / float é float. 😉

    Resumindo, em geral:

    • int / int = int
    • float / int = float
    • int / float = float

    PS.: Você pode se sentir uma inclinação de dividir por 2.0, mas sem o sufixo f, o 2.0 é um literal do tipo double. Então você teria um resultado do tipo double que depois seria convertido pra float. Eu não lembro das implicações disto. Talvez outra pessoa possa ajudar mais, mas eu recomendaria fazer float com float mesmo. 🙂

    Abraço.

     

  2. Opa, consegue editar esse código-fonte pra ficar melhor de ler? Pode usar o botão "Código (<>)" do editor aqui do site quando for fazê-lo. Exempleo de como fica:

    int main(void) {
    	printf("oiee\n");
    }

    Se você remover essas linhas em branco, vai ficar muuuito melhor pra galera ajudar. 😉

    Abraço!

  3. Oi @Nitczi, bem vindo(a) ao nosso portal! 🙂

    Eu não tenho mais o sample exato que utilizei, mas anexei um aqui bem parecido.

    Importante lembrar, no entanto, que na aula 24 eu falo que não mostrei o código-fonte do binário e nem o disponibilizei para download porque deixei o exercício para quem assistir o treinamento de implementar este binário em C. É bem fácil. Você só vai chamar duas funções. Recomendo que faça o seu depois de analisar este. 😉

    Abraço e bons estudos!

     

     

     

     

     

    antidebug.zip

    • Agradecer 1
  4. Em 20/05/2023 em 19:57, Samuel Araujo disse:

    Uauu, que honra o Fernando comentando meu erro!!!

    Hahaha tamo aqui pra isso. Honra minha em ajudar num primeiro tópico tão foda. 🙂

    Em 20/05/2023 em 19:57, Samuel Araujo disse:

    Muito obrigado, agora tudo faz sentido..Agr que vc falou se n me engano vc cita em alguma aula do curso de C que o ultimo caractere é o de nova linha, acho que é a aula sobre array, n lembro...

    Desconheço hehe. No caso de uma C string (um array de chars), o último elemento é um nullbyte mesmo. Só pra deixar claro, no caso aí da SYS_read (mov rax, 0), o que acontece é que como você tá usando um terminal (o usuário digita num terminal), o padrão para encerrar a linha é o newline (0x0a). Então não é que a SYS_read pára ao encontrar o newline, é que o usuário manda um newline através de um terminal interativo. Então, quando você busca um newline pra encontrar o "fim da linha", só vai funcionar assim, quando o usuário digita. Se ele ler da entrada padrão ou encerrar a digitação com outro caractere que não seja o ENTER, seu programa não vai pegar (referência). Mas para os fins do que você está estudando agora, acho que ok. 👌 

    Em 20/05/2023 em 19:57, Samuel Araujo disse:

    Eu acompanho o mente binaria faz 2 anos já, vcs me influenciaram a aprender programação, e não só isso...Me deram um caminho para aprender pelo baixo nível...fiquei 9 mêses estudando o livro de Arquitetura e Organização de Computadores do Willian Stalins, e agr comecei a estudar a matéria de programação, capengando com erros e pesquisas, estudos..Mas é isso, continue com o projeto e muito obrigado novamente.

    Que bela história @Samuel Araujo! 9 meses estudando um livro. Poxa, muito foda mesmo. 🙂 E ficamos felizes em saber que fazermos parte da tua jornada de aprendizado. Precisamos, estamos aqui! E se quiser compartilhar programas como esse com a gente, só postar aqui no fórum. 

    Abraço!

  5. Em 20/05/2023 em 14:19, Samuel Araujo disse:
            cmp al, 0 
            je valido ; compara com nullo (fim da entrada do usuario) e salta pro fim do programa 

    Oi Samuel. Bem vindo à Mente Binária! 🙂

    O trecho que citei não tá certo. O fim da string de entrada não contém um caractere nulo (0x00) e sim um caractere de nova linha, porque o usuário pressionou ENTER, que é o 0x0a. Ou seja, se você comparar com 0x0a, 10 ou `\n` (que dá tudo no mesmo), resolve este caso. 😉

    Abraço.

  6. Opa, bem vindo!

    Só para clarificar, qual das seguintes coisas você quer?

    1. Colocar um ícone para aparecer no .exe quando este é listado no Windows Explorer.
    2. Colocar um ícone dentro da janela exibida pela MessageBox() (não é na barra de título).
    3. Criar uma janela que exiba um ícone na barra de títulos.

    São coisas diferentes. 🙂

    Ah, como você tá compilando e linkando este programa? Quais os comandos?

    Abraço!

  7. Boas vindas 🙂

    Se você pede para o usuário digitar uma frase, na verdade você fica "refém" de uma ação de input, não de output. A string, depois de lida, será armazenada num buffer (uma variável), certo? Basta que você altere lá, em tempo de execução.

    Se quiser postar o programa posso tentar ajudar mais.

    Abraço!

  8. Olá, @allanval! Talvez tenha, mas você precisa se certificar de não estar cometendo crime (checar a licença). Se for correção de bug de um software da qual a empresa/pessoa desenvolvedora faliu/sumiu, então pode ser ok, mas ainda assim, é melhor se certificar primeiro.

    Tecnicamente você vai precisar estudar engenharia reversa. Tá no lugar certo. 🙂 Aqui tem um guia.

    Abraço e boa sorte!

  9. Acho que entendo como está pensando, mas já adianto que é um método pouco efetivo. De qualquer forma, acredito que precise de um script na maioria dos debuggers. No x64dbg dá pra fazer com tracing também (Debug -> Trace over/into...):

    image.thumb.png.65b60df89bbeaae778dbafe33696efc0.png

    Explicando:

    A condição que coloquei em Command Condition é que o resultado da função dis.match(cip, "^j") seja True. Essa função vai disassembler a instrução apontada por cip (eip ou rip) e ver se esta começa com j. Quando tal condição for atendida, o que está em Command Text vai executar. Pus dois comandos: um pra colocar um breakpoint no endereço atual e outro para desabilitar esse breakpoint, de modo que a execução continue. Fazendo isso você terá um breakpoint desabilitado em cada salto. Basta reiniciar o programa, habilitar todos os BPs e rodá-lo para atingir teu objetivo.

    Repare que se usar Trace over, não vai pegar os saltos dentro das funções. Se usar Trace into pega, mas vai ser bem mais lento (tracing em geral é lento mesmo).

    Abraço.

  10. 2 horas atrás, Insurgente disse:

    Muito obrigado Fernando. Fiz o download da sua versão compilada e está funcionando. Não sei utilizar ainda, mas vou aprender mais tarde.

    Show. Por nada. 🙂

    2 horas atrás, Insurgente disse:

    Eu tive apenas que fazer o download da biblioteca "VCRUNTIME140.dll"  e colocá-la no diretório "C:\Windows\System32" do Windows 7.

    Mesmo depois de instalar as runtime libraries conforme indiquei? Estranho...

    Abraço!

  11. Opa, acho que tem uma confusão aí...

    Você não tem que compilar o make. O arquivo Makefile é lido pelo comando make, que já invoca o compilador pra você. Ou seja, é uma facilidade. Então, ao invés de você usar o compilador diretamente (com o comando gcc, por exemplo), você usa o comando make, porque quem fez o Hyperion já colocou um arquivo Makefile na pasta do projeto pra facilitar tua vida, entende?

    No entanto, o Windows não vem com o comando make nativo. Por isso, no readme.txt do projeto há a recomendação que você use o MinGW ou o Visual Studio. Dá um trabalhinho em qualquer um dos casos e reconheço que nada disso é óbvio para quem não está acostumado.

    De repente eu consigo fazer um vídeo mostrando o processo. Por hora, compilei aqui pra você, mas não testei o programa e nem sei o que ele faz. Recomendo rodar só em VM. Ah, vai precisar das runtime libraries do Visual C++ pra rodar.

    Um abraço.

    hyperion.rar

  12. Opa, interessante. Não conhecia esse Hyperion. Dei uma olhada no readme.txt e tem isso:

    The crypter is a C project and can be compiled with the corresponding makefile (tested with Mingw and Visual Studio)

    Ou seja, a compilação é pra ser feita através do Makefile (comando make) no Windows (MinGW ou Visual Studio). De fato, o projeto inclui a windows.h e é um crypter pra PE. Tenta no Windows aí. 😉

    Abraço.

  13. 6 horas atrás, donutLukke disse:

    Muito obrigado, algo tão óbvio e não consegui enxergar, muito paz para você e sua família.

    Pra você e sua família também. 🙂

    6 horas atrás, donutLukke disse:

    É que pensei na hipótese dos IDs serem identificadores que podem mudar, que podem um dia ter letras.

    Entendi. Bom, como exercício ok, mas em geral ID é numérico, até pela velocidade de comparação. 😉

    Abraço!

    • Curtir 1
  14. Opa, bem vindo à comunidade!

    Me parece que a sua função compareAluno() tenta advinhar o que é para comparar (ID, nome ou CPF) através do tamanho da string. Isso é um problema porque tanto CANOME quanto CACPF expandem para 12, fazendo com a que na hora de comparar o CPF, a comparação do if na linha 346 retorne verdadeiro e o programa compare um CPF com um nome.

    A propósito, qual o motivo de você utilizar char[] nos IDs? Se os IDs vão conter só números, podem ser do tipo int.

    Abraço.

    • Agradecer 1
    • Curtir 1
×
×
  • Criar Novo...