-? =========================== - Introdução ---------- - Eu não assumimos qualquer responsabilidade do uso desta informação. Este tutorial, é de conhecimento educacional ONLY. Oi lá, neste tutorial, pretendo ensinar-lhe como fazer um keygen muito simples, de um programa chamado W3Filer 32 V1.1.3. W3Filer é um bom web downloader ... Eu acho que alguns de vocês podem conhecer o programa. I`ll assuma que você sabe: A.How usar depurador (neste caso, SoftIce). B.How de crack, geralmente (encontrar rotinas de proteção, remendando-los, etc ...). C.
How usar Disassembler (Este conhecimento pode ajudar). D.Assembly. E.How ao código em Turbo Pascal ™. Ferramentas You`ll necessidade: A.SoftIce 3.00 /01 ou mais recente. B.WD32Asm. (Não é uma obrigação). Programa C. A W3Filer V1.13 (se não for fornecido neste pacote), pode ser encontrado em www.windows95.com eu acredito. D.Turbo Pascal (qualquer versão). Bem, o suficiente, blá, blá, vamos rachar ... Run W3Filer 32.
A pops tela de cavalo, e, exige registo (Hmm, isso é um saco ;-)) Agora, nós observamos este programa tem algum tipo de número de série (Minas é 873977046 ), Vamos manter a série em mente, eu aposto que nós `ll encontrá-la novamente enquanto estamos no depurador. Bem, agora, vamos colocar o seu nome e um código de reg ... manequim definir um BP em GetDlgItemTextA, e, pressione OK. Nós pop dentro GetDlgItemTextA, Deixa para encontrar a rotina de registo ...
I `ll lhe poupar o trabalho, a rotina de registo é o seguinte:: 00404DB2 8D95A8FAFFFF lea EDX, dword ptr [ebp + FFFFFAA8]: 00404DB8 52 empurrão edx ---> A sua nome de usuário aqui. : 00404DB9 E80B550000 chamada 0040A2C9 ---> rotina de Registro. : 00404DBE 83C408 adicionar esp, 00000008 ---> Não sei exatamente o que é isso. : 00404DC1 85C0 teste eax, eax ---> identificador booleano, 0 se: 00404DC3 7D17 jge 00404DDC ---> registo falhar, 1 se OK. Bem, vamos entrar no CHAMADA 40A2C9, e ver o que está dentro dela: (Por favor, leia os meus comentários no código).
* Referenciado por uma chamada em Endereços: |: 00404DB9,: 00407F76 | : 0040A2C9 55 empurrão ebp: 0040A2CA 8BEC mov ebp, esp: 0040A2CC 81C4B0FEFFFF adicionar esp, FFFFFEB0: 0040A2D2 53 empurrar ebx: 0040A2D3 56 empurrão esi: 0040A2D4 57 empurrão edi: 0040A2D5 8B5508 mov edx, dword ptr [ebp + 08]: 0040A2D8 8DB500FFFFFF ESI lea, dword ptr [ebp + FFFFFF00]: 0040A2DE 33C0 xor eax, eax: 0040A2E0 EB16 jmp 0040A2F8 * Referenciado por um (L) Ir onditional nconditional ou © no endereço: |: 0040A2FB © | : 0040A2E2 0FBE0A MOVSx ecx, ptr byte [edx] ----> Aqui Começa a parte interessante.
: 0040A2E5 83F920 cmp ecx, 00.000.020 ----> ECX é o char atual no nome do usuário, Hmm, 20h = '' ...: 0040A2E8 740D je 0040A2F7 ----> Vamos ver,: 0040A2EA 8A0A mov cl , byte ptr [edx] ----> Geralmente, todo esse ciclo faz, está copiando o nome do usuário a partir de [EDX], a [ESI], sem espaços! (Tenha isso em mente!).
: 0040A2EC 880C06 byte mov ptr [ESI + EAX], cl: 0040A2EF 42 inc edx: 0040A2F0 40 eax inc: 0040A2F1 C6040600 byte mov ptr [ESI + EAX], 00: 0040A2F5 EB01 jmp 0040A2F8 * Referenciado por um (L) nconditional ou © onditional Ir no endereço: |: 0040A2E8 © | : 0040A2F7 42 inc edx * Referenciado por um (L) Ir onditional nconditional ou © em endereços: |: 0040A2E0 (U),: 0040A2F5 (U) | : 0040A2F8 803A00 cmp byte ptr [edx], 00: 0040A2FB 75E5 jne 0040A2E2 ----------------> Este é o loop, nós temos o que ele faz, Vamos continuar traçando o código. ..
: 0040A2FD 56 empurrão esi --------> O nome do usuário é empurrado, a fim de upcase é caracteres. * Referência Para: USER32.CharUpperA, Ord: 0000h | : 0040A2FE E80F330000 Chamada Usuário CharUpper ---> Após isso, o nosso nome está em maiúsculas. : 0040A303 56 empurrão esi -----> O nosso nome em maiúsculas aqui. * Referência Para: cw3220mt._strlen, Ord: 0000h | : 0040A304 E86F300000 Chamada 0040D378 ---> Este é o comprimento do nosso nome. : 0040A309 59 pop ecx: 0040A30A 8BC8 mov ecx, eax ---> ECX = Comprimento. : 0040A30C 83F904 cmp ecx, 00000004 ---> Comprimento> = 4 (MUST).
: 0040A30F 7D05 jge 0040A316 ---> Vamos para este endereço ...: 0040A311 83C8FF ou eax, FFFFFFFF: 0040A314 EB67 jmp 0040A37D * Referenciado por um (L) Ir onditional nconditional ou © no endereço: |: 0040A30F © | : 0040A316 33D2 xor edx, edx: 0040A318 33C0 xor eax, eax: 0040A31A 3BC8 cmp ecx, eax: 0040A31C 7E17 jle 0040A335 ---> (não é importante, apenas uma outra verificação inútil).
================================================== ================================= ============ daqui e ON, O CÓDIGO IMPORTANTE, preste atenção ================== ========================== ================================================== ======= Uma coisa antes de continuarmos, EDX = 00000000h quando entramos para as próximas instruções. * Referenciado por um (L) Ir onditional nconditional ou © no endereço: |: 0040A333 © | : 0040A31E 0FBE1C06 MOVSx EBX, byte ptr [eax + esi] ---> nome EBX, offset EAX. : 0040A322 C1E303 shl EBX, 03 -----> Hmm, shl é o caractere por 03h ...
(Lembre-se que). : 0040A325 0FBE3C06 edi MOVSx, byte ptr [eax + esi] ---> Agora nome de usuário EDI, offset EAX. : 0040A329 0FAFF8 edi IMUL, eax -----> Ele multiplica o caractere pelo deslocamento em nome do usuário! (Lembre-se disso). : 0040A32C 03DF adicionar EBX, edi -----> adiciona o resultado à EBX (Isso foi bombardeada (Ding Dong =)). : 0040A32E 03D3 adicionar EDX, ebx -----> = EDX EDX + EBX !!! - Este é o cerne desta rotina de registro !!! : 0040A330 40 eax inc -----> Aumento EAX por um (próximo caractere). : 0040A331 3BC8 cmp ecx, eax: 0040A333 7FE9 jg 0040A31E ----> Se laço ECX.
* Referenciado por um (L) Ir onditional nconditional ou © no endereço: |: 0040A31C © | : 0040A335 A120674100 eax mov, dword ptr [00416720] ---> hmmmmmm, O que tem aqui ????? : 0040A33A C1F803 sar eax, 03 ---------> ESPERAR! Por favor, digite sice '? EAX 'Será que este número em EAX parecer familiar para nós? ;-) Se você ainda don`t entender, do que, É o nosso NÚMERO DE SÉRIE! (POR FAVOR, tomar o seu tempo, e verificar por si mesmo - don`t confie em mim). OK, então agora nós sabemos, que é SHR EAX por 03 (SAR é quase idêntico ao SHR).
: 0040A33D 03D0 adicionar EDX, EAX ---------> Hmm, ele adiciona o resultado do loop, o número de série shr'd por 03h: 52 0040A33F impulso edx -------> Vamos continuar . (Neste momento, posso dizer-lhe, o número reg, está em EDX - apenas que o número reg está em HEX -> É assim que você digitá-la). * Possível StringData Ref de Dados Obj -> "lx%" | : 0040A340 685EF54000 impulso 0040F55E: 0040A345 8D95B0FEFFFF lea EDX, dword ptr [ebp + FFFFFEB0]: 0040A34B 52 empurrão edx * Referência Para: USER32.
wsprintfA, Ord: 0000h | : 0040A34C E8E5320000 Chamada 0040D636 -------> Este, faz HEX2STR (Pega o valor de EDX, e transforma-lo para uma string hex). : 0040A351 83C40C adicionar esp, 0000000C: 0040A354 8D8DB0FEFFFF lea ecx, dword ptr [ebp + FFFFFEB0] -----> tipo 'd ecx "- este é o número reg! Isso é o suficiente para nós, o resto do código, é apenas para comparar o código reg correto com o nosso. : 0040A35A 51 empurrão ecx * Referência Para: USER32.
CharLowerA, Ord: 0000h | : 0040A35B E8B8320000 Chamada 0040D618: 0040A360 8D85B0FEFFFF lea eax, dword ptr [ebp + FFFFFEB0]: 0040A366 50 empurrão eax: 0040A367 impulso FF750C [ebp + 0C] * Referência Para: cw3220mt._strcmp, Ord: 0000h | : 0040A36A E875300000 Chamada 0040D3E4: 0040A36F 83C408 adicionar esp, 00000008: 0040A372 85C0 teste eax, eax: 0040A374 7405 je 0040A37B: 0040A376 83C8FF ou eax, FFFFFFFF: 0040A379 EB02 jmp 0040A37D * Referenciado por um (L) Ir onditional nconditional ou © no endereço : |: 0040A374 © | : 0040A37B 33C0 xor eax, eax * Referenciado por um (L) Ir onditional nconditional ou © em endereços: |: 0040A314 (U),: 0040A379 (U) | : 0040A37D 5F pop edi: 0040A37E 5E pop esi: 0040A37F 5B pop EBX: 0040A380 8BE5 mov esp, ebp: 0040A382 5D pop ebp: 0040A383 C3 RET Fazendo o real Keygen ~~~~~~~~~~~~~~~ ~~~~~~~~~ Agora, depois de eu ter explicado como é que o programa calcula o código de registro, você pode escrever seu próprio chaveiro, sem olhar para o meu código, ou olhar para o meu código (em Turbo Pascal - sorry para todos os amantes C ;-) próxima vez).
É isso, aqui está a fonte da minha keygen: ------------------- ------------------- Cortar aqui -------------------------- W3FilerKeygen Programa; var Key, SerialNum, EB, ED, dígito: Longint; I, X: Byte; Nome, KeyHex: String; começar Writeln ('W3Filer32 V1.1.3 Keymaker'); writeln ('rachada por ^ ^ dor' '97 /rebeldes! '); Escreva seu nome:'); {Name} Leia o readln (Name); Escrever ("Número de série: '); readln (SerialNum); {Sim, precisamos de o número de série para o cálculo!} Key: = 0; x: = 0; Por I: = 1 para comprimento (Name) fazer começar Nome [I]: = upcase (Name [i]); Se Nome [I] '', em seguida, começar eb: = ord (Name [I]) shl 3; {EB = Nome [I] Shl 03h} Ed: = ord (Name [I]); {ED = Nome [I]} ed: = ed * (x); {ED = ED * Deslocamento} inc (x); eb: = EB + ed; {ED Adicionar a EB} Chave: Key = + EB; {Adicionar a EB CHAVE} end; fim; Chave: Key = + (SerialNum shr 3); {Adicionar SerialNum shr 03h até Key} {A partir daqui, esta é apenas HEX2STRING -> I`m bastante certeza de que é explaintory Auto, o resto - ir e aprender bases numéricas novamente! ;-)} KeyHex: = ''; dígitos de repetição: Key = mod 16; chave: = div chave 16; Se dígitos Se dígitos>
Android Atividade Lifecycle & amp; ndash; Concepts