Jump to content

Fernando Mercês

Administrators
  • Posts

    1,523
  • Joined

  • Last visited

  • Days Won

    173

Everything posted by Fernando Mercês

  1. De nada. 🙂 Dá pra fazer por registro, mas eu tentei e vi que tem limite de aninhamento das opções. Acabei usando um software chamado sendto+. O Inno Setup pode escrever as chaves de registro se você escolher fazer via registro. No caso do retoolkit, eu instruo o script do Inno Setup para instalar (copiar) o sendto+ como um programa normal e criar os atalhos. 😍
  2. Oi @Gabriel Guedes! Que legal sua decisão de estudar programação. Acho essencial para qualquer área da computação. 🙂 Muito interessante o projeto de criar um instalador. Existem vários softwares que criam instaladores (Inno Setup, Nullsoft Scriptable Install System (NSIS), Setup Factory, etc), mas fazer o seu próprio é com certeza um projeto muito interessante! Vou tentar ajudar com as dúvidas: Quase nenhuma. Normalmente instalar significa copiar arquivos para determinados diretórios, criar atalhos e escrever em chaves de registro. Tudo isso é feito com funções da biblioteca padrão em linguagens como C# e C++. Sim. O Inno Setup suporta uma linguagem própria de scripting e cria um instalador baseado no que está nesses scripts. O código-fonte do retoolkit consiste destes scripts. Eu não fiz upload dos arquivos dos programas para o GitHub porque não é uma boa prática colocar arquivos que não são de texto em repositórios git, mas eu os tenho na minha máquina, no diretório d:\ret, que é de onde o script pega os arquivos do programa. Perceba que isso tá especificado aqui. 😉 Acredito que você vá aprender mais sobre um ou sobre o outro. Acredito que C# seja um pouco mais fácil e você terá que se preocupar menos com a linguagem. Por que não faz primeiro com um e depois com o outro? Assim você estuda ambas. 🙂 De cabeça não sei, mas você pode pesquisar por instaladores feitos nas duas linguagens. Adoraríamos ver o progresso do teu instalador aqui! 🙂 Um abraço e boa sorte!
  3. Oi @Samuel Araujo. Essa contagem faz sentido e é exatamente o motivo de o registrador r8 ser o r8. 🙂 Em arm por exemplo, ela é utilizada. No entanto, em amd64 os nomes originais foram mantidos acredito que porque preservam a ideia de sua função e também facilita pra quem já sabia i386. Por exemplo, rcx é o contador e por aí vai. Ninguém (?) usa a nomenclatura de r0 a r7 em amd64 mas o nasm a suporta sim: basta usar as macros definidas no pacote altreg no início do seu código. Veja: bits 64 %use altreg SYS_WRITE equ 1 STDOUT equ 1 SYS_EXIT equ 60 section .rodata msg: db `Registradores alternativos!\n` msg_len equ $ - msg section .text global _start _start: mov r0, SYS_WRITE mov r7, STDOUT lea r6, [msg] mov r2, msg_len syscall mov r0, SYS_EXIT xor r7, r7 syscall Usar o pacote altreg é como definir os novos nomes você mesmo. Algo como %define r0 rax, embora o nasm use %idefine no pacote altreg, que faz a definição ficar insensível ao caso, permitindo R0, r0, RAX, rax, rAX, etc. Mais detalhes no arquivo macros/altreg.mac. Isso é só nome e só faz sentido no código-fonte. A instrução gerada no compilado é a mesma, quer você use r0, quer você use rax. O fonte vai ficar confuso já que ninguém (?) tá acostumado com isso em amd64. Além disso, tem que decorar a ordem. Perceba que o segundo registrador é rcx, não o rbx. A ordem é A, C, D, B. Depois vem o SP, BP, SI e DI. Lembrar disso "numericamente" representa uma dificuldade adicional, mas é possível claro. Abraço.
  4. Quem manja de Apple e mora na terra da garoa, a empresa tem uma vaga aberta --> https://jobs.apple.com/en-us/details/200492305/br-specialist
  5. Este mês terminamos a turma 2023.1 do projeto Do Zero Ao Um, que busca oferece um treinamento introdutório em computação e segurança para pessoas pretas. Com apoio dos nossos mantenededores, Tempest Security Intelligence e Spod VPN, e nossos apoiadores e quem faz treinamento com a gente, nos dedicamos a 4 meses de estudo, onde demos 78 aulas, totalizando aproximadamente 240 horas de conteúdo. Mas não é o tipo de aula onde um fala e os outros ouvem não - tem muita prática, avaliações, trabalhos. É uma vivência mesmo. A turma estudou diversas matérias, dentre elas Introdução à Computação, Matemática, Windows, Inglês Instrumental, Programação, Leitura sobre temas raciais, Redes, Nuvem, Introdução a Segurança, Segurança de Redes, Segurança de Endpoints, Análise de Logs e Soft Skills, só para citar algumas. Foi uma jornada longa, mas muito bonita que trilhamos que juntos. Alunos e alunas, professores e professoras, mentores e mentoras, equipe e todos os envolvidos são responsáveis por este sucesso. Mas o momento de comemorar, do nosso lado, ainda não chegou. O ciclo se completa quando vemos as pessoas que estudaram conosco sendo contratadas. E é aí que preciso de você: Se você quiser levar para sua empresa uma pessoa comprometida, que foi até o fim do nosso treinamento, sendo aprovada nas avaliações (fazemos três), e com percentual de presença e participação alto, temos várias possibilidades para você. São elas: @allexmiranda10 de Valparaíso de Goiás/GO @aucoliveira de Caucaia/CE @Daniel Borges do Rio de Janeiro/RJ @daniellyzzz de Recife/PE @deividfrancaamaral de Maetinga/BA @g4bas de Atalaias/AL @guitere85 de Teresópolis/RJ @Heb1m de Vespasiano/MG @JEAN DUTRA SACRAMENTO de Fortaleza/CE @Jhonxxz do Rio de Janeiro/RJ @luislfpfelipe de Bauru/SP E temos mais se você quiser entrar em contato. 😉 Então, se você precisa incluir pessoas na sua cidade, capital próxima, ou tem vaga home-office já manda uma mensagem direta. É só passar o mouse sobre nome da pessoa. 🙂 No entanto, atenção: não é para envolver essas pessoas em processos seletivos que não consideram a inclusão. A disputa com quem teve mais oportunidades na vida é desigual. A gente precisa que você as envolva no programa de inclusão da sua empresa, ou da empresa de amigo (caso não tenha um programa de inclusão, não tem hora melhor para criar um já com gente para ser incluída!). 😉 Aqui na Mente Binária a gente prepara para que as pessoas sejam recebidas em futuros programas de inclusão. Não é dizer que em 4 meses formamos analistas de SOC ou profissionais de AppSec. Seria desonesto com você e com quem estudou com a gente. A verdade é que fornecemos uma base muito boa para que a pessoa seja inserida em programas futuros, seja para pessoas pretas ou não. Agora elas saíram do zero e foram para o um. Sua missão é levá-la ao dois. Posso contar contigo? 💚
  6. Oi @Ana Francisca, Você tá usando o NASM né? Ele suporta "Character Strings", ou seja, você escreve no fonte como string e ele compila como char (número). Ou seja, '3' vai gerar o número 0x33, que é o código do texto '3' na tabela ASCII. Dá uma olhada para entender mais: Se quiser o número 3 mesmo, então é só remover as aspas simples. O mesmo se aplica para os demais números. PS.: Em C isso também funciona com um caractere só. Por exemplo, char c = 'A' vai por o valor 0x41 na variável c. Valeu.
  7. Oi Ana! Parabéns pela decisão em estudar Assembly. 🙂 No teu código falta especificar o destino nas instruções MOV. Por exemplo: mov, 4 tá pedindo para mover/copiar o valor 4, mas para onde? Falta especificar um destino, entende? O que você precisa aí é saber em qual registrador você quer colocar tais valores. O nome do registrador vai antes da vírgula. Você pode ler mais sobre o assunto no nosso livro, por exemplo, ou em centenas de outros livros e artigos na internet. Outra coisa: em Assembly, você não "muda" o conteúdo de um label assim: mov nome, dword 'Jon' ; Mudar o nome Ana para Jon Linhares Para atingir o que você quer, o jeito mais simples é especificar, na seção .data, dois labels, nome1 e nome2, e aí usá-los um em cada bloco de código que imprime um nome. Por fim, a syscall que sai do programa é a SYS_EXIT. Ela recebe um argumento (você pode conferir aqui ou dando um man 2 exit). Sendo assim, você precisa fazer: mov ebx, 0 mov eax, 1 int 0x80 Isso é equivalente à uma chamada exit(0), entende? E sair com o código de retorno zero é o padrão para dizer para o SO que "deu tudo certo". 😉 Valeu!
  8. Oi @Zeka! Dá uma olhada no no nosso guia em https://menteb.in/guia na profissão "Pentester / Red Team". Acho que vai te dar uma luz! 🙂 Abraço!
  9. Então é mais um indício de que o software está ok e o problema é com a máquina mesmo. É cedo para afirmar, mas é um indício. 🙂 Já experimentou remover os dois pentes de memória e limpar seus contatos com borracha? Ao ligar o PC, é legal ver no POST (aqueles testes que rolam quando o computador liga) se a memória está sendo reconhecida em sua totalidade (8MB no seu caso). É um emulador de MS-DOS pra celular? Abraço!
  10. Eu dei uma olhada aqui e tudo parece bastante interessante. Não tenho o dispositivo com o qual este programa conversa, mas num emulador aqui ele pelo menos subiu: Aí chega a aparecer esta tela? Eu tô achando que o problema é o seguinte: a memória RAM está se esgotando e o programa não consegue nem memória para alocar uma string de erro "Out of memory" nessa função: void sub_42AEC0() { char var_4[4]; // [esp+20h] [ebp-4h] BYREF __InitExceptBlock(); string::string((string *)var_4, aOutOfMemory); xalloc::xalloc((xalloc *)&__xalloc, (const string *)var_4, 0); string::~string((TStringRef **)var_4, 2); } No caso acima, var_4 é null se o operador new falhar. Veja v5 abaixo: string *__cdecl string::string(string *this, char *s) { size_t v2; // eax TStringRef *v3; // eax TStringRef *v5; // [esp+28h] [ebp-4h] __InitExceptBlock(); v5 = (TStringRef *)operator new(0x12u); if ( v5 ) { if ( s ) v2 = strlen(s); else v2 = 0; TStringRef::TStringRef(v5, s, v2, 0, 0, 0); --*(_DWORD *)_DestructorCountPtr; v3 = v5; } else { v3 = 0; } *(_DWORD *)this = v3; ++*(_DWORD *)_DestructorCountPtr; return this; } Com var_4 sendo NULL, o fluxo entra em xalloc(NULL, 0) e dentro dela tem mais duas chamadas, onde uma chega no mov eax, [eax] problemático em 0x0042C253. Combinando então o seguinte: Você não alterou nada no sistema. O sistema rodou no meu emulador. Minha suspeita de ser um erro de alocação de memória. Meu palpite é que um pente de memória deste computador tenha queimado ou esteja com algum mau contato e ele está com metade da memória que ele deveria ter. Não sei. Você pode tentar ver quanto de memória tem livre com o comando mem /c e dizer aqui pra gente (postar uma foto da saída). Ou tentar desligar, limpar os pentes de memória e ligar novamente o PC. Só ideias por enquanto...
  11. Opa, deixa eu te pedir mais umas coisas: Uma foto do conteúdo do AUTOEXEC.BAT que mostre tudo (tá cortando um pedaço na que você mandou). Uma foto do conteúdo do INIT.BAT. É só comandar type c:\progs\sr632\v3.10\obj\init.bat Uma foto da saída do comando dir c:\ Uma cópia da pasta inteira (eu sei que você tá buscando os disquetes já, mas só pra não esquecer). Abraço!
  12. Boa! Ainda não sei. Enquanto você não acha os disquetes, consegue tirar uma foto do conteúdo do AUTOEXEC.BAT e CONFIG.SYS? Os comandos são: cd \ type autoexec.bat type config.sys Seria legal também ter a versão do DOS e uma listagem desse diretório OBJ aí: ver dir c:\progs\sr632\v3.10\obj Valeu!
  13. Olá! O programa que você executou tentou acessar um endereço de memória inválido e por isso o SO matou o processo. No caso, ele dá um dump dos opcodes das instruções me 0x42C24B e diz que o errou ocorreu na instrução em 0x42C253. Então dá pra inferir o seguinte: # rasm2 -ax86 -d e84cabffff8b450c8b008903 call 0xffffab51 mov eax, dword [ebp + 0xc] mov eax, dword [eax] mov dword [ebx], eax Colocando os endereços, ficaria: 42C24B call 0xffffab51 42C250 mov eax, dword [ebp + 0xc] 42C253 mov eax, dword [eax] 42C255 mov dword [ebx], eax Então o erro seria na instrução mov eax, dword [eax]. Como no momento que essa instrução roda EAX é 0 (tem um dump dos valores dos registradores na imagem), o programa tenta acessar o endereço de memória 0, o que bate com o erro final (The instruction referenced illegal address 00000000). A instrução anterior copia um valor para EAX a partir de EBP + C, que parece ser o segundo argumento da função dona dessa instrução. Não dá pra saber se é a main() do programa, mas você pode tentar passar um argumento pra ver se o erro muda: C:\PROGS\SR632\V3.10\OBJ>NEW.EXE 1 2 Se precisar de mais ajuda, acho que vai ter que copiar a pasta PROGS, compactá-la e enviar aqui pra gente. Assim alguém pode dar uma olhada num disassembler e tentar te ajudar com o erro. Abraço!
  14. Oi Ana, bem vinda à Mente Binária. 🙂 O nasm.us parece estar fora mesmo. No entanto, vejo algumas opções: Se você usa Linux, pode instalar pelo gerenciador de pacotes. Ex.: apt install nasm. Se você usa Windows, pode baixar do Fossies. Se usa macOS, acho pode instalar com o brew.sh: brew install nasm. Você pode estudar Assembly com o fasm alternativamente. Espero que ajude. Bons estudos aí!
  15. 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.
  16. 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!
  17. haha tá vendo? 🙂 Quem nasceu em Irajá também foi o Zeca Pagodinho e o Nei Lopes. 💚
  18. Eu já tive vários blogs, sempre escrevi muito (aliás, acho a arte da escrita é super difícil, mas também super benéfica) e ainda trabalho escrevendo. Ao atuar como pesquisador de ameças para uma empresa japonesa, no fim das contas, a minha entrega é um artigo (que chamaos de paper). E aqui na Mente Binária, também estou sempre escrevendo artigos ou material para treinamentos. Às vezes escrevo código também. Eu tive essa ideia de que os membros da equipe Mente Binária pudessem criar blogs pessoais para falar do que lhes vierem à cabeça porque antes de sermos profissionais de computação, somos pessoas e temos nossos sentimentos né? Mas também deixei livre para quem quiser fazer, no momento em que quiser fazer, caso queira fazer. Eu quero. E esse é a primeira postagem! Então se você chegou até aqui, é porque tem algum nível de interesse em conhecer mais sobre mim. Vamos lá então! Eu nasci no Rio de Janeiro e morei muitos anos em Irajá, no subúrbio do Rio. Acho que conheço todas as ruas daquele bairro e já perambulei por todas elas quando adolescente, sempre a pé, já que nunca consegui aprender a dirigir (como vocês conseguem?!). 😄 Minha vida em Irajá foi normal. Cresci escutando funk, rap, Furacão 2000, equipe Pipo's, montagens e MCs, samba e pagode. Jogava Super Nintendo e futebol na rua (mas era melhor no Super Ninendo) e tentava soltar pipa (mas algum amigo tinha que por no alto pra mim). Fiz muitas amizades lá, que mantenho até hoje, mesmo que nossas opiniões sejam divergentes e nossas vidas tenham tomados rumos diferentes. Vi um computador na minha frente pela primeira vez aos 8 anos, na mesa do diretor da escola. Segundo minha mãe, o diretor falou pra ela que eu parecia que já conhecia o bicho. Bom, eu não lembro se já conhecia, mas lembro que fiquei maravilhado ao ver que o que eu desenhava com o mouse aparecia na tela do Microsoft Paint. Eu recebendo o anel de formatura do ensino primário em 1996 da professora Jaqueline e do diretor Marcos (que me mostrou o tal do computador) Graças à minha mãe, ao meu pai e a um primo do interior de SP, ganhei meu primeiro computador com cerca de 11 anos de idade. Era um AMD K5 de 100 MHz com Windows 95. Na época, para mim, era um foguete! Quando pusemos internet discada com um U.S. Robotics 56k então, virou um portal de acesso a conteúdos do mundo todo, inclusive no mIRC, depois ICQ, depois MSN. Eu achava incrível e queria entender cada detalhe do funcionamento daquela máquina doida. Minha família teve condições de investir em mim: me deram livros, coleções, assinaram jornais que continham matérias sobre informática (lembro de ler o Piropo no jornal O GLOBO e o Gabriel Torres no jornal O DIA). Eu e meu primo Jorge na extinta Fenasoft - uma feira de informática - em São Paulo no ano 2000 Não tinha muito como correr de uma profissão ligada à computação. Fui para um estágio não remunerado no Rio de Janeiro e depois para meu primeiro emprego na área, da qual nunca mais saí. Com acesso a outras coisas, principalmente pela internet e na escola, meus gostos foram mudando... Tentei formar umas bandas de rock, mas eu acabava mesmo ajudando as que já existiam (profissão chamada de roadie) e sendo fã. Ouvi Legião Urbana, até não aguentar mais (mas ainda aguento - é só me chamar pra uma roda de viola que ainda sai um Tempo Perdido), fui muito pra Lapa, antigo Garage e o mundo do rock tomou conta de mim musicalmente! Na jornada em computação, passei por algumas empresas e escolas no Rio. Fiz curso técnico em informática, eletrônica, depois curtei Física e Ciência da Computação, mas não concluí. Casei, me tornei pai de um filho incrível, me mudei pra SP, descasei, voltei pro Rio, voltei pra SP, casei e hoje sigo em SP, feliz, com muitos desafios, mas rodeado fisica e virtualmente de pessoas que amo e me apoiam. 💚 Já tive empresa no Rio, trabalhei para empresa de SP estando no Rio e hoje, trabalho numa multinacional com sede brasileira em São Paulo. Esse é um resumo bem curto da minha vida que, como qualquer outra vida, daria um livro para explicar cada momento e ainda deixaria coisas de fora. Sou muito grato à minha mãe e minha família, que lutaram pela minha educação e investiram em tudo o que eu quis. É um privilégio que infelizmente poucos têm no Brasil. No final de 2007 criei um blog chamado Mente Binária, que veio a se tornar a instituição de ensino e pesquisa sem fins lucrativos que você conhece. Bom, pelo menos espero que conheça. Se não conhecer, é só continuar navegando neste site. Faltou explicar o nome do blog. Vem de um trecho modificado de uma resposta que o Bob Marley deu quando foi perguntando porque cantou no evento "Smile Jamaica" em 1976 dois dias depois de ter sofrido uma tentativa de assassinato, onde um atirador não identificado atirou nele, em sua esposa e em quem mais estava na casa dele no dia. A resposta de Bob foi: As pessoas que tentam fazer desse mundo um lugar pior não tiram um dia de folga. Por que eu deveria? Essa postura sempre mexeu comigo, mexe hoje e continuará mexendo. E é essa a postura que quero pra mim. Não que eu não durma, nem que não tire de férias. Do trabalho eu me desligo sim, mas de me deixar modificar para fazer este mundo melhor, não. 🕊️
  19. Você conhece o pev, nosso kit de ferramentas para análise de binários PE (usados no Windows)? Se conhece, acho que vai se identificar com essa história. Se não conhece, vai conhecê-lo muito bem agora. Nesse artigo vou passear brevemente sobre a inspiração que deu origem ao projeto, o que foi feito desde então e o que vem por aí. De modo cronolagicamente organizado, começamos por um passado de mais de uma década. Partiu embarcar nessa viagem no tempo? ⌛ Passado 💭 Lá em 2010 eu queria fazer um programa que lesse a string de versão “File version” de executáveis PE. Essa que aparece quando você vai nas Propriedades de um executável .exe no Windows: Essa informação só poderia estar no arquivo .exe, mas eu não sabia exatamente onde. Depois de muito estudo, consegui entender que essa informação fica numa estrutura chamada VS_FIXEDFILEINFO que, por sua vez, pertence a uma estrutura chamada VS_VERSIONINFO. Dava para encontrar essa estrutura por nome no binário em uma string UTF-16-LE na seção de recursos .rsrc: $ strings -tx -el putty.exe | grep VS_VERSION_INFO 15a2c6 VS_VERSION_INFO $ hd -s 0x15a2c6 -n64 putty.exe 0015a2c6 56 00 53 00 5f 00 56 00 45 00 52 00 53 00 49 00 |V.S._.V.E.R.S.I.| 0015a2d6 4f 00 4e 00 5f 00 49 00 4e 00 46 00 4f 00 00 00 |O.N._.I.N.F.O...| 0015a2e6 00 00 bd 04 ef fe 00 00 01 00 4d 00 0a 00 00 00 |..........M.....| 0015a2f6 00 00 4d 00 00 00 00 00 00 00 0b 00 00 00 00 00 |..M.............| 0015a306 Mas onde estava o 0.77.0.0 ninguém me contava... Bem, segundo a documentação, a estrutura é definida assim: typedef struct tagVS_FIXEDFILEINFO { DWORD dwSignature; DWORD dwStrucVersion; DWORD dwFileVersionMS; DWORD dwFileVersionLS; DWORD dwProductVersionMS; DWORD dwProductVersionLS; DWORD dwFileFlagsMask; DWORD dwFileFlags; DWORD dwFileOS; DWORD dwFileType; DWORD dwFileSubtype; DWORD dwFileDateMS; DWORD dwFileDateLS; } VS_FIXEDFILEINFO; Para facilitar a visualização dos campos de interesse dessa estrutura no dump hexa, coloquei comentários nela usando o rehex (parte integrante do nosso retoolkit) : De acordo a documentação, o primeiro membro, chamado dwSignature, deve conter o valor 0xfeef04bd. Considerando o ensianness em little-endian, essa assinatura tá no dump hexa em 0x15a2e8, logo após a string VS_VERSION_INFO em UTF-16-LE. A missão então era achar como o número de “File version” era gerado, no exemplo aqui, a string 0.77.0.0. Vamos em frente. Logo depois da dwSignature tem a dwStrucVersion de quatro bytes, seguida da dwFileVersionMS, que também é uma DWORD (Double WORD) de quatro bytes. Nesta última, temos os bytes 4D 00 (destacados em verde) e 00 00 (laranja). Lendo a documentação, descobri que A WORD mais significativa, tomando este número em little-endian, é o nosso primeiro zero da string "0.77.0.0", destacado em laranja. Já a WORD menos significativa é o 77 (0x4D), destacado em verde. O próximo membro é a dwFileVersionLS (amarelo e rosa), que segue a mesma lógica, formando o "0.0" final. Na época, fiz um script em Python para buscar esse número de versão e chamei de pev.py (pev vem de “PE Version”). Não tenho mais o script, mas hoje seria algo nessa linha: import sys if len(sys.argv) < 2: print("Usage: pev.py <pefile>") sys.exit(1) with open(sys.argv[1], "rb") as f: d = f.read() vinfo = "VS_VERSION_INFO".encode("utf-16-le") # Busca a string nos conteúdo do arquivo pos = d.find(vinfo) # Avança para depois da string vinfo + 4 pos += len(vinfo) + 4 sig = int.from_bytes(d[pos:pos+4], "little") if sig != 0xfeef04bd: print(f"Signature not found at {pos:#x}") sys.exit(1) pos += 8 # Avança para o dwFileVersionMS # Lê a word mais significativa major1 = int.from_bytes(d[pos+2:pos+2], "little") # Lê a word menos significativa major2 = int.from_bytes(d[pos:pos+2], "little") # Avança para o dwFileVersionLS pos += 4 # Lê a word mais significativa minor1 = int.from_bytes(d[pos+2:pos+2], "little") # Lê a word menos significativa minor2 = int.from_bytes(d[pos:pos+2], "little") print(f"{major1}.{major2}.{minor1}.{minor2}") Assim como o script da época, este script funciona: $ python pev.py putty.exe 0.77.0.0 Mas sem dúvida, pode ser melhor por vários motivos. O principal, é que ele é lento, especialmente para arquivos grandes pois ele busca a string VS_VERSION_INFO no binário inteiro. É a famosa “marretada” em programação... Era lento, não tinha jeito. Resolvi então estudar a documentação do PE e cheguei num código muito maior, mas que rodava muito mais rápido, porque eu lia todos os cabeçalhos do PE necessários para encontrar a posição no arquivo da estrutura VS_VERSION_INFO e, por consequência, da VS_FIXEDFILEINFO. O código não envolvia busca. Ao contrário, ele ia direto ao ponto. O pev 0.22 implementava esse algoritmo em aproximadamente 300 linhas de código em C. Lançado em 2010 no extinto Google Code, era assinado pelo Coding 40º, um grupo de programação que criei na faculdade com mais três amigos (@Francivan Bezerra, Thiago e Eduardo). No ano seguinte, o Coding 40º teve uma breve vida como hackerspace na Tijuca, no Rio de Janeiro, onde inclusive o @julio neves foi nos visitar. 💚 O projeto andou, mas em algum momento pensei: se eu passo por todos os cabeçalhos do PE, por que não imprimir os valores dos campos também? Isso transformaria o pev num parser de PE completo! E foi o que fizemos. Aí o projeto cresceu mais, ganhou relevância na área de segurança (era o único parser de PE livre e multiplataforma do planeta) e atraiu colaboradores do Brasil e de fora. A ponto do meu empregador na época ficar preocupado de eu estar recebendo dinheiro de outra empresa por conta do pev (como sempre, a p***a do capitalismo na nossa cola). Mas eu estava só aprendendo mesmo. Na versão 0.50 eu segui a dica do @bsdaemon de “quebrar” o pev em programas menores, onde cada um cumpriria uma função. Assim, o pev virou um kit de ferramentas. E tivemos que aprender a lidar com tanto código, depois veio o Git e o GitHub e tivemos até uma sessão presencial onde vários colaboradores do projeto se uniram para estudar Git: (Da esquerda para a direita, Álvaro Justen, Renato Augusto, Álvaro Rios, Thiago Bordini, @Felipe Esposito, Jan Seidl, Igor Rincon, @l0gan, @Gustavo Roberto, Slayer, @Fernando Mercês, Rogy e unk) Dentre as muitas pessoas que colaboraram, teve o @jweyrich que reescreveu a libpe (na qual o pev se baseia) quase toda, corrigiu muito código, adicionou recursos e levou o projeto para outro nível. Junto com várias pessoas que reportaram e corrigiram bugs, implementaram recursos e testaram o pev, lançamos várias versões até chegarmos na atual 0.8x. 🙃 Presente 🎁 Hoje com aproximamente 30.000 linhas de código, o pev está estabelecido. Está presente em vários tutorias sobre análise de malware, e forense e em praticamente todas as distribuições Linux, incluindo Debian, Kali, Ubuntu, etc. Tem builds para Windows também. Veja alguns dos lugares onde você encontra o pev: Pacote no Debian (eu fui o primeiro mantenedor, depois deixei o pacote órfão e o time do Debian assumiu! 💗): Pacote no Ubuntu: Incluso no Kali Linux por padrão: Incluso no REMnux por padrão: Incluso no Tsurugi Linux por padrão: Paper Process Injection Techniques and Detection using the Volatility Framework no vx-underground: Tem também pev no Arch Linux, Void Linux, vários tutoriais em português, inglês, chinês.. Em algum ponto eu até parei de monitorar. 😄 Neste ínterim, tive a oportunidade de aprender com programadores incírveis que puseram código no pev. Só para citar alguns: @jweyrich, @Jan Seidl, Marcelo Fleury, @fredericopissarra e muitos outros que não conseguiria nomear aqui (mas estão todos na lista de colaboradores do projeto no GitHub). Muito obrigado! 💚 Muito tempo passou e muitos projetos livres similares surgiram, sendo o principal deles a pefile, que habilitou programadores e programadoras em Python a "parsear" binários PE facilmente. O mundo mudou, minhas prioridades mudaram, as prioridades dos colaboradores do pev mudaram também. Decidi então passar o bastão para quem tivesse interesse e em 28 de janeiro de 2022 comuniquei a comunidade que o projeto precisava de uma nova pessoa para mantê-lo. Surgiram algumas perguntas, alguns e-mails, até que em dezembro do mesmo ano, uma programadora da Alemanha entrou em contato informando do seu interesse em manter o projeto. Conversa vai, conversa vem e é isso. O pev tem uma nova mantenedora! 🥳 Futuro 🔮 A nova mantenedora usa o apelido GoGoOtaku. Embora eu não a conheça, ela se mostrou bastante confiável e corrigiu vários bugs no pev já. Penso que é quase mágico o fato de alguém, bem longe de mim física e socialmente, tenha encontrado o pev e tenha tido o interesse em mantê-lo. São coisas que só o software livre, aliado a linguagens universais como C, idiomas universais como o inglês, e redes sociais como o GitHub, conseguem realizar. Acho isso muito incrível! 🙌 Em conversas com a nova mantenedora, expressei meu desejo que de o que pev voltasse a ser um programa só, mas com sub-comandos. Sugeri que usássemos o nome readpe, já que este é o programa mais usado do toolkit do pev e sugere um belo contraste com a ferramenta readelf do GNU Binutils. Ela gostou da ideia, afinal, o pev não tem mais nada a ver com “PE Version”. O mantenedor do pacote no Debian nos alertou que mudar de nome é um processo delicado, especialmente porque o pev já é bastante conhecido, mas eu insisti. Minha ideia é que o readpe tenha sub-comandos que implementam a função dos programas separados hoje. Algo nessa linha: Exibir a ajuda: readpe help Imprimir os campos e valores dos cabeçalhos do PE (funcionalidade provida pelo readpe que seria dividida em sub-comandos): readpe headers <pefile> # todos os cabeçalhos readpe headers dos <pefile> # somente o cabeçalho do DOS Exibir strings no PE (funcionalidade provida pelo pestr, que viraria um sub-comando do readpe): readpe strings <pefile> # todas as strings readpe strings ascii -s <pefile> # somente strings ASCII exibindo as seções às quais elas pertencem readpe strings unicode <pefile> # somente strings UNICODE E por aí vai. Por hora, movi o pev para um repositório “embaixo” da Mente Binária, que chamei de readpe e dei todas as permissões para a nova mantenedora nele. Ela que vai decidir sobre o futuro do projeto. Talvez ela aceite minha sugestão de transformar o pev num único programa readpe. Talvez não. A mágica disso é que agora a decisão dela, afinal, filho a gente cria pro mundo e não pra gente né? 😄 Estou muito feliz que o pev tenha encontrado uma nova mantenedora (que já lançou a versão 0.82 com várias correções de bugs!). E que ele tem ajudado pessoas interessadas em "parsear" PEs pelo mundo afora durante seus 13 anos de existência. Vou seguir acompanhando o projeto de perto e, quem sabe, até programando um pouquinho (se a nova mantenedora aceitar meus patches), mas acima de tudo, sou grato a todo mundo que contribuiu, usou e apoiou o pev durante todos esses anos. Ele continua sendo um dos poucos parsers livres de PE de linha de comando, multiplataforma, super versátil (com saídas em XML, JSON, HTML, etc), com recursos únicos (é o único livre que extrai certificados do PE, por exemplo) e claro, com raízes brasileiras. Foi o maior projeto de software livre da minha vida e eu continuo vibrando a cada commit que vejo nele. 😭
  20. Version 2023.05

    155 downloads

    Nosso kit de ferramentas para engenharia reversa utilizado em nossos treinamentos. 🙂 Mais informações:
  21. Dá um trabalho que você talvez nem imagine, mas a gente insiste. 🙂 Hoje lançamos a versão 2023.05 do retoolkit, nosso kit de ferramentas para engenharia reversa e análise de malware. Foram incluídas novas ferramentas, dentre elas: gftrace, ferramenta do @Leandro Fróes para tracing de chamadas de função da Windows API feitas por binários PE32+ compilados em Go. FakeNet-NG super útil para fazer um malware pensar que ele tá na rede, crente que tá abafando, e para manipular as respostas. de4dot GUI, porque nem sempre é necessário usar a linha de comando para desofuscar .NET. Observer, um "strace para Windows para PE32. Veja o log de mudanças completo aqui. Além disso, as ferramentas existentes foram atualizadas e novos recursos foram adicionados, dentre eles: Opção para desativar o Windows Update, graças ao Windows Update Blocker. Opção para adicionar o Python na %PATH%. Saca só o menu de ferramentas gráficas para PE (ainda tem um monte de linha de comando): O bicho tá grande... cerca 1.5 GB de pura maldade contra malwares. Usar o retoolkit é inifinitamente mais rápido que baixar todas essas ferramentas uma a uma e instalar. Muito mais rápido também que FLARE-VM e coisas do tipo. Baixou o setup, instalou, pronto: você tem um x64dbg com plugins e scripts configurados, Ghidra, Cutter, analisadores de PE, descompiladores para .NET, Java, AutoIT... enfim, dá nem para listar tudo que tem. Baixe e veja você mesmo. 🙂 Download
  22. 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
  23. Hahaha tamo aqui pra isso. Honra minha em ajudar num primeiro tópico tão foda. 🙂 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. 👌 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!
  24. 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.
×
×
  • Create New...