How to crack XChat 2.8.5e – Part I
Já há não sei quantos dias que me andam a chatear para fazer um documento a explicar como se cracka o xcrap para Windows, hoje decidi começar então com esta saga... sim vai ser uma saga á-lá-gamito porque assim da mais visitas, faz o pessoal voltar cá pra ver a continuação! Here we go...
1º passar a data uns meses pra frente!
Começa-se sempre por ver que tipo de protecção é que o nosso alvo tem. O XCrap é time trial, ou seja, passados 30 dias depois de o instalar ele mostra-nos esta janelinha, que so tem um botãozinho que abre o browser para pagarmos pelo programa, ou um botão de quit.
Depois deste passo, costumo ver sempre que ficheiros e chaves no registry é que o programa acede, só mesmo naquela de certificar. Então abro o RegMon e meto a filtrar por xchat* só pra ver se ele guarda a data de instalação do registry... E acho ali aquela key com aquele numero meio estranho "0005874772a3b7", dou double click no regmon nessa key, e depois apago-a do registry.
Corro o xcrap de novo... e aparece o mesmo dialog! Hum.... mas espera, não é bem o mesmo... Reparem bem ali no (A) no title, e no outro dialog era (B), portanto parece que há mais do que um check. Voltei ao registry tambem e ele criou la de novo uma nova key com o valor "00047047b73c29".
Apaguei de novo a key, e desta vez pus o FileMon a filtrar por xchat*, e achei o seguinte:
Parece que o gajo quando não tem aquela key no registry, vai à procura do "xchat.lic" que deve ser supostamente o ficheiro de licença para registar isto. Então já vi que desta forma não me safo, vai se ter de utilizar medidas mais drásticas!
Então eu todo chateado, vou abrir o xcrap no IDA, mas, algo se passa! O executavel ta comprimido com uma versão do UPX muita antiga que não dá para unpackar estaticamente. Segui este tutorial para unpackar o exe, e depois de fazer tudo o que la diz, fico com um xcrap.exe (está aqui para quem não conseguiu fazer este passo) unpackado. Agora sim já se pode meter mãos à obra.
Então, abro o xcrap.exe no IDA e deixo o gajo analisar o ficheiro todo. Right-click no IDA-View A -> Text View e vou para o inicio do ficheiro. Alt+T para procurar por texto no ficheiro e procuro por "expired", e venho parar aqui:
Olhando para isto, vê-se mais ou menos que isto é a função que mostra a janela a dizer que já expirou, portanto já chegamos a algum lado. Então vamos ver onde é que esta função é chamada, sobe-se um bocado, ate acharmos o inicio da função que neste caso é onde diz "sub_401000" mais exactamente no endereço 00401000. Clicka-se no "sub_401000" e carrega-se no x para se saber todos os sítios onde esta função é chamada.
Depois de olhar para todas as chamadas a esta função, a "sub_4018CD" parece me ter muitas chamadas a coisas de encriptação e tal, que provavelmente é aqui que ele ve se tem um xchat.lic valido ou algo do estilo. Então nesse call ao 40100 vejo que jumps condicionais vão parar ao loc_401D87.
00401916 cmp [ebp+74h+arg_0], 0 ; Compare Two Operands
0040191A jnz short loc_401936 ; Jump if Not Zero (ZF=0)
e se ali o ZF nao for 0 vamos parar a ...
0040191C call ds:_errno ; Indirect Call Near Procedure
00401922 xor ecx, ecx ; Logical Exclusive OR
00401924 cmp dword ptr [eax], 2 ; Compare Two Operands
00401927 setnz cl ; Set Byte if Not Zero (ZF=0)
0040192A inc ecx ; Increment by 1
0040192B mov ds:dword_45F7B8, ecx
00401931 jmp loc_401D87 ; Jump
E faz um jump para o nosso badboy (endereço 401D87), portanto vamos meter ali um breakpoint no jzn, f2 na linha e f9 para começar a fazer debug, quando ele breaka no breakpoint vai-se à janelinha dos registos do IDA e altera-se o valor do ZF e f9 de novo. Parece que não correu correu bem, o xcrap não abre, o processo ta a correr mas não há nada pra ninguém.
Vamos tentar de outra maneira, vamos ver onde esta função "sub_4018CD" é chamada.
Hum.. é chamada nos dois casos, estranho, vamos tentar na mesma, f2 no jle e f9, quando breakpointar troca-se o valor de SF e f9 de novo e faila com um Expired (F)... MEDO! Parece que existem muitas mais protecções então. Bleh.
Então não é so na "sub_4018CD" que o dialog é chamado. Deixa-se estes dois breakpoints ainda, e vamos voltar a ver os sítios onde o nosso dialogbox é chamado. Vamos agora ver a função "sub_408454".
UPX0:0040850F cmp eax, 1
UPX0:00408512 jl short loc_40851B
UPX0:00408514 cmp eax, 28E074h
UPX0:00408519 jle short loc_4084D1
UPX0:0040851B
UPX0:0040851B loc_40851B: ; CODE XREF: sub_408454+BEj
UPX0:0040851B jmp sub_401000
Então temos ali aquele jl, que salta para onde nao queremos ir, que é o jmp. E temos aquele jle que se não saltar para fora, também vamos parar ao jmp, portanto metemos breakpoint no jl e no jle. Ah, aconselharam-me a criar um xchat.lic portanto fiz um na directoria do xcrap com o seguinte conteudo.
OPENSORESISDEADOPENSORESISDEADOPENSORESISDEAD OPENSORESISDEADOPENSORESISDEADOPENSORESISDEAD OPENSORESISDEADOPENSORESISDEADOPENSORESISDEAD OPENSORESISDEADOPENSORESISDEADOPENSORESISDEAD OPENSORESISDEADOPENSORESISDEADOPENSORESISDEAD
Então agora corremos de novo, e vamos parar de novo no endereço 00401FEC, o jle do screenshot de há bocado. Troca-se o valor de SF de novo e f9. Agora paramos no jl, mas não ta a saltar portanto não se mexe. Mas no jle a seguir ele vai parar ao jmp, portanto trocamos o valor de SF e f9 de novo e.... Funciona!!
Portanto o que queremos fazer basicamente é fazer com que o jle do endereço "401FEC" não seja corrido portanto vamos substituir essa instrução no ficheiro, no IDA vai-se ao endereço, e no status ele mostra qual é o offset dessa instrução no ficheiro, é "1FEC". Num hexeditor à vossa escolha, abrimos o ficheiros e vamos ao endereço "1FEC", e troca se o "7E 0F" por "90 90", 90 é a instrução de NOP.
Next, vamos ao endereço "408512" no IDA e vemos tambem o offset no ficheiro, que é "8512", no editor vamos a esse offset e trocamos tambem o "7C 07" por "90 90".
E agora o ultimo no endereço "408519" o jle, é um jump condicional, e nos queremos que seja sempre corrido, o offset no disco é "8519", e vamos trocar o "7E" que é jle por "EB" que é jmp. Save and quit, problem_solved. Xcrap is now cracked!
O programa tem mais uns checks, por exemplo, quando se recebe um dcc, mas isso provavelmente são outros calls a esta função como estas duas que patchamos. Na próxima parte deste post talvez explique como crackar também essa parte.
Saudações Gamitianas para todos!
hot. tou todo molhado.
vou-me limpar
back. bem, agora durante a proxima semana vou fazer essa çida toda se sou capaz ao menos repetir.
e depois, com bué de fé e uma velinha acessa para mim pelo gamito vou fazer essa merda do dcc.
Ouvi dizer que gostavas de mudkips. É verdade ?
alta tesao de mijo que me deu
épa! lindo!! acho que vou fazer isto tudo..ai..sinto-me todo gamito depois de ter lido isto
só li a receita mas não vou fazer o bolo pq nem sequer uso o xcrap.exe
agora importante mesmo era fazer uma distro 'à la gamito' baseada nesta técnica hem?
warm regards :P
Epá...
Eu não acredito que exista alguém interessado em usar o XChat em linux. Só se for gente que nunca usou o mIRC!
quem nunca usou o mirc nao tem interesse no xchat em linux!?!?!?!?
Parece-me que o v se estava a referir ao Windows.