
Como não é difícil adivinhar, o bule de chá sou eu.
No outro dia, eu queria examinar a fonte de um utilitário, obviamente feito usando ferramentas AMS (arquivo .cdd ao lado de .exe e algumas lua * .dll). Há alguns anos, analisei detalhadamente um programa feito por meios semelhantes e a idéia de compactar .cdd, que é um arquivo zip comum com uma senha, está disponível. Bem, sem hesitar, pressionei o
AMSUnpacker e recebi um erro de descompactação. Bem, a partir deste momento a diversão começou ...
O primeiro pensamento que me ocorreu foi que o arquivo estava empacotado com algo diferente de UPX (que eu descompactei naturalmente). Bem, eu não chequei (DIE, Exeinfo PE, Nauz File Detector) e todo mundo me convence de que não, não está lotado. Bem, acho que vou comparar o .exe banal usando o Total Commander com o programa anteriormente descompactado e este, e descobriu-se que .exe é muito diferente (eu costumava comparar outros programas no AMS e a diferença era apenas em bytes simples, na verdade, em uma senha escrita em texto sem formatação apenas em .exe e na parte do recurso). Ficou claro que isso é algum tipo de modificação e apenas uma nova versão do AMS. Acreditei no último com dificuldade, sabendo (bem, a princípio pensei que sabia) que os desenvolvedores haviam batido o programa por um longo tempo, mas não começaram a verificar se era isso ou não, e dificilmente daria qualquer coisa.
Comecei a me aprofundar em mais detalhes, de alguma forma em x64dbg, com o qual eu em "Você", encontrei na versão antiga do programa um lugar onde a senha é "lida". Tendo vasculhado o mesmo x64dbg na versão "nova", descobriu-se que eles não são tão diferentes, mas há simplesmente mais funções nele do que na antiga. Encontrei um lugar semelhante onde, em vez do
push <endereço cobiçado,
onde a senha é armazenada> havia algum tipo de
mov <algo lá> e várias chamadas para algumas outras funções, e algumas linhas abaixo do código são semelhantes às da versão antiga.
(à esquerda é a versão antiga, à direita é a nova)E aqui fiquei triste, porque meu conhecimento sobre depurador claramente não é suficiente para entender tudo isso.
Houve um pensamento - para encontrar outro programa semelhante não compactável e comparar o arquivo .exe. Esse programa foi encontrado pelo mesmo autor que eu tentei descompactar. E a comparação de arquivos deu o resultado. Além de pequenas diferenças, foi encontrado um bloco inteiro de vários dados:

E a alegria que encontrei naquele lugar único onde aparentemente a senha estava contida e a decepção por claramente não ser uma senha, na forma como nas versões anteriores.
Não havia escolha a não ser entender o depurador. Todo o "problema" é que eu conheço o montador no nível de vários comandos, com uma representação muito superficial do que eles estão fazendo, e o próprio depurador está no nível de vários vídeos assistidos no youtube e com pouca experiência em usá-lo, principalmente pelo "método de puxão".
Depois de uma hora executando o depurador e um número incontável de reinicializações, encontrei um local em que os bytes desejados são lidos e, um pouco mais tarde, encontrei um pedaço de código que manipula esses bytes:

Demorou muito tempo para entender o que estava sendo feito lá.
De alguma maneira, descobri que esse é um tipo de teclado cifrado, onde há duas tabelas, uma é uma senha criptografada, onde o caractere correspondente simplesmente indica a posição no segundo bloco de notas.

Em geral, substituindo os valores da tabela inferior pelos valores correspondentes da tabela superior, obtemos uma matriz de bytes:
7B 10 DD 5A 4D 26 72 EE B2 2A 04 2B 6E F7 14 E2 F9 14 F8 9E 8A 99 28 AE B8 4B C0 D7 42 DA AD .
Para quais outras matrizes exclusivas de bytes, antes e depois da senha necessária para descriptografar, eu não entendi, mas na verdade não fui muito. Eu suspeito que existem algumas somas de verificação ...
E então cabe a você convertê-lo em uma string e descompactar o arquivo .cdd com essa senha. Um pequeno problema foi que a linha resultante não pôde ser inserida no arquivador via Ctrl + C -> Ctrl-V, porque caracteres "quebrar" na área de transferência (especialmente não mergulhar na essência). A descompactação é possível apenas programaticamente. Felizmente, existe algum conhecimento de C # (cujo nível em geral não é muito diferente do nível de conhecimento do depurador) e pouca experiência no estudo do princípio de operação do AMSUnpacker mencionado anteriormente, que também está escrito em C # e não é difícil ver o que está lá e como.
Quase no joelho, ele empilhou um utilitário para verificar a operacionalidade do algoritmo estudado anteriormente, e pronto, ele funciona.
Você pode baixá-lo
aqui .

O programa, semelhante ao AMSUnpacker mencionado anteriormente, cria a pasta extract_cdd ao lado do .exe com o conteúdo do arquivo .cdd.
Após descompactar com êxito o arquivo .cdd, aprendi que esta é a versão “nova” (do final de 2018) do AMS 8.5.3.0. E no site eles leram sobre a nova versão:
Recurso: aprimorada a segurança do arquivo de dados da versão comercial. . Bem, aparentemente não deu muito certo ...
Eu tenho uma pergunta para quem sabe, esse algoritmo para ocultar uma senha, faz parte de algum algoritmo de criptografia padrão (quero dizer, agora é aplicável em programas, e não historicamente), ou é mais provável que os desenvolvedores tenham pensado nisso?
PS: Eu sei que é mais fácil obter o código fonte dos programas lua (que usa AMS) através do lua * .dll corrigido, que navega na Internet e / ou o gancho externo da função lua_load () na mesma lua * .dll. Foi tudo o que fiz uma vez. Nessa situação, era um interesse puramente esportivo descobrir como obter uma senha para .cdd. E também entendo perfeitamente bem que é improvável que alguém precise e não tenha nenhum valor prático.
Eu provavelmente exagerei em relação ao "bule", porque há pouca experiência em programação e reverso, mas esse é apenas um pequeno hobby "para mim" e não há muito tempo ou desejo de aprofundar isso.
PPS Este é o meu primeiro artigo sobre Habré, como provavelmente o primeiro deste tipo.