-? =========================== - Introducción ---------- - No tomo ninguna responsabilidad del uso de esta información. Este tutorial es para conocimiento educativo SOLAMENTE. Hola, en este tutorial, tengo la intención de enseñar cómo hacer una bastante simple keygen, de un programa llamado W3Filer 32 V1.1.3. W3Filer es un muy buen programa de descarga web ... Supongo que algunos de ustedes sabrán el programa. I `ll suponer que usted sabe: A.How utilizar depurador (en este caso, SoftIce). B.How de roer, general (encontrar rutinas de protección, parches ellos, etc ...). C.
How utilizar desensamblador (Este conocimiento puede ayudar). D.Assembly. E. ¿de código en Turbo Pascal ™. Herramientas `ll necesidad: A.SoftIce 3.00 /01 o más reciente. B.WD32Asm. (No indispensable). Programa C.El W3Filer V1.13 (si no se dispone en este paquete), se puede encontrar en www.windows95.com creo. D.Turbo Pascal (cualquier versión). Bueno, basta, bla, bla, vamos cracking ... Run W3Filer 32.
A pantallas emergentes rocín, y, exige la inscripción (Hmm, esto sux ;-)) Ahora, nos damos cuenta que este programa tiene algún tipo de número de serie (el mío es 873977046 ), Vamos a mantener la serie en mente, yo apuesto a que `ll reunirse de nuevo ya que estamos en el depurador. Bueno, ahora, vamos a poner su nombre y un código de registro ficticio ... estableció un BP en GetDlgItemTextA y pulse Aceptar. Nos pop dentro GetDlgItemTextA, vamos a encontrar la rutina de registro ...
I `ll le ahorrará el trabajo, la rutina de registro es la siguiente:: 00404DB2 8D95A8FAFFFF lea edx, dword ptr [ebp + FFFFFAA8]: 00404DB8 52 empuje edx ---> Tu Nombre de usuario aquí. : 00404DB9 E80B550000 llamada 0040A2C9 ---> rutina de registro. : 00404DBE 83C408 añadir esp, 00000008 ---> No sé exactamente lo que es. : 00404DC1 85C0 eax prueba, eax ---> Identificador de Boole, 0 si: 00404DC3 7D17 JGE 00404DDC ---> registro falló, 1 si está bien. Bueno, vamos a entrar en el LLAME 40A2C9, y ver lo que hay dentro de ella: (Por favor lea mis comentarios en el código).
* Referenciado por una llamada a las direcciones: |: 00404DB9,: 00407F76 | : 0040A2C9 55 empuje ebp: 0040A2CA 8BEC mov ebp, esp: 0040A2CC 81C4B0FEFFFF añadir esp, FFFFFEB0: 0040A2D2 53 empuje ebx: 0040A2D3 56 empuje esi: 0040A2D4 57 empuje edi: 0040A2D5 8B5508 mov edx, dword ptr [ebp + 08]: 0040A2D8 8DB500FFFFFF lea esi, dword ptr [ebp + ffffff00]: 0040A2DE 33C0 xor eax, eax: 0040A2E0 EB16 jmp 0040A2F8 * Referenciado por una (U) nconditional o © Jump onditional en Dirección: |: 0040A2FB © | : 0040A2E2 0FBE0A MOVSX ecx, ptr byte [edx] ----> Aquí comienza la parte interesante.
: 0040A2E5 83F920 cmp ecx, 00000020 ----> ECX es la del carbón actual en el nombre de usuario, Hmm, 20h = '' ...: 0040A2E8 740D je 0040A2F7 ----> A ver,: 8A0A 0040A2EA cl mov , ptr byte [edx] ----> En general, todo este lazo hace, se copia el nombre de usuario de [EDX], a [ESI], sin los espacios! (¡Mantén esto en 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 una (U) nconditional o © onditional Saltar a Dirección: |: 0040A2E8 © | : 0040A2F7 42 inc edx * referenciado por una (U) nconditional o © Jump onditional en Direcciones: |: 0040A2E0 (U),: 0040A2F5 (U) | : 0040A2F8 803A00 cmp ptr byte [edx], 00: 0040A2FB 75E5 JNE 0040A2E2 ----------------> Este es el bucle, conseguimos lo que sí, vamos a continuar trazando el código. ..
: 0040A2FD 56 empuje esi --------> El nombre de usuario es empujado, con el fin de upcase es caracteres. * Referencia Para: USER32.CharUpperA, Ord: 0000h | : 0040A2FE E80F330000 Call usuario CharUpper ---> Después de esto, nuestro nombre está en mayúsculas. : 0040A303 56 empuje esi -----> Nuestro nombre en mayúsculas aquí. * Referencia Para: cw3220mt._strlen, Ord: 0000h | : 0040A304 E86F300000 Call 0040D378 ---> Esta es la longitud de nuestro nombre. : 0040A309 59 pop ecx: 0040A30A 8BC8 mov ecx, eax ---> ECX = Longitud. : 0040A30C 83F904 cmp ecx, 00000004 ---> Longitud> = 4 (MUST).
: 0040A30F 7D05 JGE 0040A316 ---> Vamos a esta dirección ...: 0040A311 83C8FF o eax, FFFFFFFF: 0040A314 EB67 jmp 0040A37D * Referenciado por una (U) nconditional o © Jump onditional en Dirección: |: 0040A30F © | : 0040A316 33d2 xor edx, edx: 0040A318 33C0 xor eax, eax: 0040A31A 3BC8 cmp ecx, eax: 0040A31C 7E17 JLE 0040A335 ---> (no es importante, sólo otra comprobación inútil).
================================================== ================================= ============ DE AQUÍ Y EN, CÓDIGO IMPORTANTE, PRESTAR ATENCIÓN ================== ========================== ================================================== ======= Una cosa antes de continuar, EDX = 00000000h al entrar a las siguientes instrucciones. * Referenciado por una (U) nconditional o © Jump onditional en Dirección: |: 0040A333 © | : 0040A31E 0FBE1C06 MOVSX ebx, ptr byte [esi + eax] ---> nombre de EBX, offset EAX. : 0040A322 C1E303 shl ebx, 03 -----> Hmm, SHL es el carbón de 03h ... (Recuerde que).
: 0040A325 0FBE3C06 edi MOVSX, ptr byte [esi + eax] ---> Ahora EDI nombre de usuario, compensado EAX. : 0040A329 0FAFF8 edi imul, eax -----> Se multiplica el carbón por el desplazamiento en el nombre de usuario! (Recuerda eso). : 0040A32C 03DF añadir ebx, edi -----> Agrega el resultado de EBX (Eso fue bombardeado (Ding Dong =)). : 0040A32E 03D3 añadir edx, ebx -----> EDX = EDX + EBX !!! - Este es el núcleo de esta rutina de registro !!! : 0040A330 40 inc eax -----> Aumentar EAX por uno (junto char). : 0040A331 3BC8 cmp ecx, eax: 0040A333 7FE9 jg 0040A31E ----> Si bucle ECX.
* Referenciado por una (U) nconditional o © Jump onditional en Dirección: |: 0040A31C © | : 0040A335 A120674100 mov eax, dword ptr [00416720] ---> HMMMMMM, ¿Qué hay aquí ????? : 0040A33A C1F803 sar eax, 03 ---------> ESPERAR! Por favor, escriba SICE '? EAX '¿Este número en EAX parece familiar a nosotros? ;-) Si todavía don `t entiende, que, es nuestro NÚMERO DE SERIE! (POR FAVOR, tómese su tiempo, y comprobar por ti mismo - don`t confía en mí). Aceptar, por lo que ahora sabemos, Que EAX de SHR por 03 (SAR es casi idéntica a SHR).
: 0040A33D 03D0 añadir edx, eax ---------> Hmm, añade el resultado del bucle, el número de serie shr'd por 03h: 0040A33F 52 empuje edx -------> Sigamos . (En este punto, te puedo decir, el número de registro, está en EDX - sólo que el número de registro está en HEX -> Así es como entrar en él). * Posible StringData Ref partir de datos Obj -> "% lx" | : 0040A340 685EF54000 empuje 0040F55E: 0040A345 8D95B0FEFFFF lea edx, dword ptr [ebp + FFFFFEB0]: 0040A34B 52 empuje edx * Referencia Para: USER32.
wsprintfA, Ord: 0000h | : 0040A34C E8E5320000 Call 0040D636 -------> Éste, hace HEX2STR (Toma el valor de EDX, y lo convierte en una cadena hexadecimal). : 0040A351 83C40C añadir esp, 0000000C: 0040A354 8D8DB0FEFFFF lea ecx, dword ptr -----> Tipo [+ FFFFFEB0 ebp] 'd ecx "- Este es el número de registro! Eso es suficiente para nosotros, el resto del código, es sólo para comparar el código reg correcta con los nuestros. : 0040A35A 51 empuje ecx * Referencia Para: USER32.
CharLowerA, Ord: 0000h | : 0040A35B E8B8320000 Call 0040D618: 0040A360 8D85B0FEFFFF lea eax, dword ptr [ebp + FFFFFEB0]: 0040A366 50 empuje eax: 0040A367 FF750C empuje [ebp + 0C] * Referencia Para: cw3220mt._strcmp, Ord: 0000h | : 0040A36A E875300000 Call 0040D3E4: 0040A36F 83C408 añadir esp, 00000008: 0040A372 85C0 eax prueba, eax: 0040A374 7405 je 0040A37B: 0040A376 83C8FF o eax, FFFFFFFF: 0040A379 EB02 jmp 0040A37D * Referenciado por una (U) nconditional o © Jump onditional en Dirección : |: 0040A374 © | : 0040A37B 33C0 xor eax, eax * Referenciado por una (U) nconditional o © Jump onditional en Direcciones: |: 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 Hacer el Keygen real ~~~~~~~~~~~~~~~ ~~~~~~~~~ Ahora, después de que yo he explicado cómo el programa calcule el código de registro, puede escribir su propia keymaker, sin mirar a mi código, o mirar en mi código (en Turbo Pascal - lo siento por todo lo que C amantes ;-) La próxima vez).
Eso es todo, aquí está la fuente de mi keygen: ------------------- ------------------- Corte aquí -------------------------- W3FilerKeygen Programa; var Key, SerialNum, EB, ED, dígito: Entero; I, X: Byte; Nombre, KeyHex: String; comenzará Writeln ('W3Filer32 V1.1.3 Keymaker'); writeln ('agrietada por ^ dolor ^' '97 /Rebeldes '!); Escribe tu nombre:'); {Leer el nombre} readln (Nombre); Escribir ("Número de serie: '); readln (SerialNum); {Sí, necesitamos el número de serie para el cálculo!} Clave: = 0; x: = 0; Porque yo: = 1 a la longitud (Nombre) empiezan Nombre [I]: = upcase (Nombre [i]); Si Nombre [I] '' luego comenzar eb: = ord (Nombre [I]) shl 3; {EB = Nombre [I] Shl 03h} Ed: = ord (Nombre [I]); {ED = Nombre [I]} ed: ed = * (x); {ED = ED * Offset} inc (x); eb: = eb + ed; {Añadir ED EB} Clave: = Tecla + EB; {Añadir EB a KEY} end; fin; Clave: = Tecla + (SerialNum shr 3); {Añadir 03h SerialNum shr a Key} {A partir de aquí, esto es sólo HEX2STRING -> `m bastante seguro de que es auto explaintory, otra cosa - ir y aprender bases numéricas de nuevo! ;-)} KeyHex: = ''; dígitos de repetición: = Clave mod 16; clave: = div clave 16; Si dígitos Si dígitos>
NET - C # - Uso UserControls como correo Templates