Tanto el parche como el crack son parches. Significan cambios en el software original que se está ejecutando. Un parche cambia el binario, pero también hay parches a nivel de código fuente, que es más el caso en plataformas de código abierto como Linux.
Un crack es un tipo especial de parche que elimina alguna funcionalidad del programa, como el número de serie o la protección anticopia, algunas otras "funciones" que limitan la aplicación de ese software de una manera distinta a la que pretendía el autor o autores originales.
Un crack puede eliminar un requester o adware, puede eliminar algún spyware o desactivar el acuerdo de licencia y dejar que ese programa funcione sin esa mierda. Por lo general, un crack realmente elimina o desactiva "características" no deseadas que no son de ningún beneficio para el producto, sino una molestia incluso para el cliente que paga. Un crack a menudo elimina tanta basura, que el programa crackeado es mejor que la versión original sin crackear.
Así que un "crack" implica que algo está roto. Pero yo lo veo diferente. El software fue entregado roto por el fabricante y tú lo reparas para hacerlo utilizable para tus necesidades.
Aunque eso esté ahora prohibido por ley en Alemania, personalmente creo que es un gran error. Si has estado comprando algo, eres libre de cambiar alrededor de ese material todo lo que quieras; es tuyo. Sólo que no puedes difundirlo, copiarlo o venderlo. Eso sería una violación de la licencia (¡no un robo!).
Y, por supuesto, eso tampoco es robar, ni asesinar, ni violar, ni genocidio, ni puta piratería.
Entonces, yo estoy usando Linux. Soy un profesional del software. Tengo todas las herramientas de ingeniería inversa, que están disponibles para mi oficio, para hacer ingeniería inversa a mi propio software y al de los clientes. Y sólo por la posesión ya estoy castigado por la ley en mi país. Soy un criminal.
Porque poseo Linux. I am totally answering this with civilian disobedience.
Here how a crack works.
- #include
- #include
- #include
- #include
- int main(){
- char *pass=getpass("Password: ");
- if(strcmp(pass, "secret")){
- puts("I don't work for you.");
- exit(EXIT_FAILURE);
- }else{
- puts("Password correct!");
- }
- return 0;
- }
We are compiling that little program and run it:
- > cc -O3 -mfma4 -o crack crack.c
- > ./crack
- Password:
- I don't work for you.
The password to run this would be “secret”. I don’t know that password, because in the real program this is hidden or this is my key or something. So I go in there with Radare2, after I copied it to crack_org to keep the original. I open Radare with -A for getting some symbol names and -w to be able to overwrite:
- > cp crack crack_org
- > r2 -A -w crack
- [x] Analyze all flags starting with sym. and entry0 (aa)
- [x] Analyze len bytes of instructions for references (aar)
- [x] Analyze function calls (aac)
- [ ] [*] Use -AA or aaaa to perform additional experimental analysis.
- [x] Constructing a function name for fcn.* and sym.func.* functions (aan))
- -- vm is like a small cow in ascii
- [0x00000640]> pdf@main ;*****HERE I VIEW THE SOURCE****
- ;-- main:
- ;-- section_end..plt.got:
- ;-- section..text:
- / (fcn) sym.main 80
- | sym.main ();
- | ; DATA XREF from 0x0000065d (entry0)
- | 0x000005f0 488d3dfd0100. lea rdi, qword str.Password: ; 0x7f4 ; str.Password: ; "Password: " @
- 0x7f4 ; [13] va=0x000005f0 pa=0x000005f0 sz=498 vsz=498 rwx=--r-x .text
- | 0x000005f7 4883ec08 sub rsp, 8
- | 0x000005fb e8d8ffffff call sub.__cxa_finalize_216_5d8
- | 0x00000600 488d3df80100. lea rdi, qword str.secret ; 0x7ff ; str.secret ; "secret" @ 0x7ff
- | 0x00000607 4889c6 mov rsi, rax
- | 0x0000060a b907000000 mov ecx, 7
- | 0x0000060f f3a6 repe cmpsb byte [rsi], byte ptr [rdi] ; [0x2700000000:1]=255 ; 0
- | ,=< 0x00000611 7513 jne 0x626 ;*******INTERESTING LINE*******
- | | 0x00000613 488d3d020200. lea rdi, qword str.Password_correct_ ; 0x81c ; str.Password_correct_
- ; "Password correct!" @ 0x81c
- | | 0x0000061a e8b1ffffff call sub.__cxa_finalize_192_5d0
- | | 0x0000061f 31c0 xor eax, eax
- | | 0x00000621 4883c408 add rsp, 8
- | | 0x00000625 c3 ret
- | | ; JMP XREF from 0x00000611 (sym.main)
- | `-> 0x00000626 488d3dd90100. lea rdi, qword str.I_don_t_work_for_you. ; 0x806 ; str.I_don_t_work_f
- or_you. ; "I don't work for you." @ 0x806
- | 0x0000062d e89effffff call sub.__cxa_finalize_192_5d0
- | 0x00000632 bf01000000 mov edi, 1
- | 0x00000637 e8a4ffffff call sub.__cxa_finalize_232_5e0
- 0x0000063c 0f1f4000 nop dword [rax]
- [0x00000640]> wa jmp 0x613@0x611 ;*********HERE I OVERWRITE THE COMMAND*****
- Written 2 bytes (jmp 0x613) = wx eb00
As you can see at byte 0x611 there’s the jump, we exchange that line by writing “jmp 0x613” to the address of byte 0x611. That’s it.
Write and exit with q
Test:
- > ./crack
- Password:
- Password correct!
Wundervoll. Now the program runs without us knowing the password.
To give this to your friends, that have the crack binary only and are able to do that themselves, we simply use bsdiff and bspatch, that you should install for that.
- > bsdiff crack_org crack crack.patch
- > bspatch crack_org crack_patched crack.patch
- > chmod +x crack_patched
- > ./crack_patched
- Password:
- Password correct!
Wundervoll. To see what we have done:
- > ls crack* -l
- -rwxr-xr-x 1 hanno hanno 8504 Dez 17 12:27 crack*
- -rw-r--r-- 1 hanno hanno 264 Dez 3 17:39 crack.c
- -rw-r--r-- 1 hanno hanno 156 Dez 17 12:41 crack.patch
- -rwxr-xr-x 1 hanno hanno 8504 Dez 17 12:22 crack_org*
- -rwxr-xr-x 1 hanno hanno 8504 Dez 17 12:42 crack_patched
That’s it. You just have now to send your friends the crack.patch file, which is really small. Done.
And now I’m a criminal in Germany. Esto es una mierda.
En realidad, enviar a alguien un archivo de parche no está en contra de la ley. Poseer Linux lo es. En Alemania la palabra ignorancia se escribe con una letra grande: Ignoranz.
Pero, sí. Así es como funciona un parche y lo que es un crack.
Espero haber podido ayudar. Por favor, visitadme, si esto me lleva a la cárcel.