Escogiendo
N�meros de serie ficticios (MisterE) con ap�ndice de
Suby
Cuando
crackeas programas que necesitan un Numero de
serie #, yo recomiendo siempre usar el mismo, para
que sepas, que aspecto tiene en
hexadecimal.
Suby:
Yo sugiero usar un numero de serie con caracteres
diferentes como "1234567890" (uno
que yo uso) porque si el programa no verifica
los caracteres del primero al �ltimo pero
verifica el tercero y el segundo despu�s el
�ltimo etc. puedes saber f�cilmente cu�l se
verifica.
Si usas "1122334455" y tomara el
"1" no sabes si toma el primero o el
segundo en cambio si usas "1234567890"
y toma "2" est�s seguro que
verificar� el segundo car�cter del numero de
serie. |
Llamadas (CrackZ)
| Siempre
que elijas caminar sobre una LLAMADA en una
protecci�n, verifica los contenidos de cualquier
registro que haya cambiado, puedes encontrar el
numero de serie # all�, alternativamente cuando
has agotado todas las posibilidades, has
re-rastreado tus pasos y has examinado las
funciones. |
C�mo piensa un Cracker/Programador (rudeboy)
Se
ense�a a los programadores que siempre que
tengas una tarea que va a ser hecha m�s de una
vez, debes crear una funci�n para hacer esa
tarea, y simplemente llamar a la funci�n cuando
necesitas realizar la tarea. Ahora, la mayor�a
de programas que usan una combinaci�n de
nombre/serial # verifican por lo menos dos veces
el c�digo, una vez cuando entras en el c�digo,
y otra vez cuando el programa se pone en marcha.
Debido a esto el programador llamar� normalmente
una funci�n para probar tu c�digo de reg. Y
normalmente, esta funci�n se llamar� cada vez
que el c�digo se verifica. A estas alturas
probablemente debes ver a donde voy con esto. Si
remiendas la funci�n que se llama para probar el
c�digo de reg, lo mostrar� como v�lido siempre
que el programa haga que se verifique.
Las t�cnicas empleadas aqu� no s�lo se aplican
para crackear los programas con rutinas de
c�digo de nombre/reg. No te limites pensando
"Dentro de la Caja", estas t�cnicas
tambi�n pueden usarse con muchos otros tipos de
protecciones (por ejemplo, muchas veces
una comprobaci�n de fecha y una nag screen est�n
hechas a trav�s de una funci�n) . |
Usando INT 3 (josephCo)
| En
caso de que no lo hayas o�do ya, INT 3 se puso
para los prop�sitos de "debugging".
As� si quieres romper una rutina especificada,
puedes usar esta instrucci�n. Puedes simplemente
"parchear" (el c�digo op para INT 3
es simplemente CC) una COPIA del
archivo. Intenta reemplazar un solo byte del
c�digo op con CC. Si no puedes encontrar uno,
tienes que ponerlo dentro de una instrucci�n
completa: no te olvides de "NOPear" (el
c�digo op para NOP es simplemente 90) los
bytes restantes. Entonces puedes utilizar SoftICE
para romper en INT 3. No te olvides de anotar los
datos originales, porque los necesitar�s cuando
SoftICE rompa en esta direcci�n. Cuando est�s
all� (antes de que INT 3 sea ejecutado),
teclea A y entonces introduce los comandos
anotados - si no haces esto, causar�s un Error
de Protecci�n General. Simplemente contin�a
como quieras para... |
Valores de retorno
| Cuando
una funci�n devuelve un valor para ver si un
control ha tenido �xito principalmente 1 (o a
veces 0) indicar� �xito. -1 normalmente es
usado para indicar �NO �XITO! |
SoftICE breakpoints condicionales (Rhayader)
En
mi temprana experiencia en cracking, yo pon�a
normalmente un BPX para GetDlgItemTextA y
GetWindowTextA dentro de SoftICE, siempre que
encontrara un programa que pidiese un numero de
serie. Introduciendo un c�digo ficticio, y '
esperando' a que SoftICE rompiese. La mayor�a de
las veces funcionaba. El problema es que,
despu�s de apretar F12 (P RET),
normalmente me pierdo dentro del c�digo.
Pregunt�ndome en que lugar del sangriento texto
del buffer puedo poner un BPR.
Despu�s de excavar en los docs de SoftICE,
finalmente encontr� una manera mejor de hacerlo (est�
en el Cap�tulo 7 de la Gu�a del Usuario).
En mi opini�n, debes leerlo tambi�n. Algunos de
los t�rminos podr�a ser dif�ciles de entender
si simplemente estas empezado. Pero, eh, para eso
est� El Foro , �no?
:)
Mi
objetivo aqu� es conseguir que SoftICE nos
muestre el texto del buffer para los dos APIs
Win32 arriba indicados. Usar� breakpoint
"acci�n" para hacer eso.
Echemos una mirada primero a GetWindowTextA. Es
declarado como:
int GetWindowText(HWND hWnd, LPTSTR lpString, int
nMaxCount);
GetWindowText usa un convenio de llamada stdcall.
Eso significa que ese argumento se empujar� de
derecha a izquierda. Puesto que SoftIce rompe
antes de que el c�digo pr�logo sea ejecutado,
el marco de pila EBP todav�a no est� preparado.
As� que nosotros tendremos que utilizar ESP para
el direccionar el argumento. Aqu� es c�mo la
pila parecer� cuando SoftIce rompa:
...
[ESP+0Ch] - nMaxCount
[ESP+08h] - lpString
[ESP+04h] - hwnd
[ESP+00h] - return EIP
Cuando el retorno de la funci�n, GetWindowTextA
ponga el texto recuperado para la situaci�n
apuntada por lpString (LPTSTR es un puntero
largo para un string terminado nulo).
As�, tendremos que usar el operador indirecto de
SoftICE (es el car�cter * , igual que en el
lenguaje C, ve Cap�tulo 8;). Por ejemplo, el
comando:
D *(esp+8)
significa, "muestra en la ventana de datos,
la situaci�n apuntada por el contenido de
esp+8." Ya que, esto es un funcionamiento
muy com�n, SoftICE ten�a un comando para �l:
esp->8. Bien entonces, ahora podemos poner el
breakpoint como esto:
BPX GetWindowTextA DO "D esp->8;"
Y cuando apretemos F12, volvemos al llamador y el
texto en el que nosotros entramos se sentar� muy
bien en la parte superior de la ventana de datos,
esperando a que preparemos un BPR con �l:) �Por
qu� no hacemos autom�ticamente un retorno al
llamador? Bien, en mi caso, la pantalla parpadea,
y yo lo odio.
Pero, si quieres intentar, puedes poner el
breakpoint como:
BPX GetWindowTextA DO "D esp->8;P
RET;"
Ahora, echemos una mirada a GetDlgItemTextA. Es
declarado como:
UINT GetDlgItemText(HWND hDlg, int nIDDlgItem,
LPTSTR lpString, int nMaxCount);
La �nica diferencia es nIDDlgItem que es el ID
del control para conseguir el texto. La pila se
parecer� a:
...
[ESP+10h] - nMaxCount
[ESP+0Ch] - lpString < Aqu� est�
[ESP+08h] - nIDDlgItem
[ESP+04h] - hwnd
[ESP+00h] - return EIP
Y el breakpoint para poner (realmente siento que
ya lo descubres;)
BPX GetDlgItemTextA DO "D esp->C;"
Bien, eso es todos amigos. Si no quieres
teclearlo todas las veces que quieras usarlo,
entonces tendr�s que preparar un macro para �l.
Lee el cap�tulo 11 :D Me gustar�a dec�rtelo,
pero esto ya se volvi� un correo muy laaargo.
Mira ya...
|
Tip para NUEVOS Ingenieros Inversos (CrackZ)
| Cuando
estas empezando a invertir el c�digo de un
blanco puede ser muy tentador usar una variedad
de t�cnicas intrusivas inmediatamente, yo por mi
estoy ansioso de disparar SoftICE y comenzar el
trazado. En la mayor�a casos este acercamiento
funcionar�, pero para invertir a un nivel
superior quiz�s debas emprender un an�lisis del
c�digo previamente a usar SoftICE - har�as bien
para sentir el c�digo antes de entrar en SoftICE
e intentar estudiar la protecci�n en detalle.
Usando WDasm32 f�cilmente localizar�n algunas
Referencias de String interesantes. Por un simple
trazado atr�s podr�as f�cilmente localizar un
chequeo decisivo. |
Unregistred? (CbD)
| Si
crackeas un programa y dice unregistred,
cambiaste un jmp aqu� y all� e hiciste que el
programa tomase un c�digo inv�lido como uno
real pero el programa escribi� tu c�digo al
registro o a un archivo ini cuando lo
reiniciaste, �l ley� el n�mero o clave y era
uno inv�lido, as� que debes encontrar donde el
programa busca una entrada de registro (RegQueryValueEx[A]
o un GetPrivateProfile[A]) y obliga al
programa validar cualquier clave que vea. Esto
puede ser un proceso muy dif�cil as� que estate
preparado para un infierno. Pero la mejor idea es
usar W32DASM para desmontar el blanco entonces
mira en las funciones importadas para encontrar
las funciones anteriores, entonces rastrea cada
una de ellas (ser� muchas) entonces
despu�s de que rastreas el c�digo y encuentras
la correcta probablemente ser� una cuesti�n de
cambiar un jnz a jz o algo as� de simple. Si
todav�a no puedes hacerlo busca la ayuda de un
cracker sabio. |
Relojes (Mammon)
| Los
relojes permiten rastrear una variable mientras
est�s "debuggeando" un programa; es
innecesario decir, que esto es una funci�n muy
importante para el cracking y la ingenier�a
inversa. Para abrir la ventana de reloj, teclea
ww en la l�nea de comandos de Soft-Ice;
tecleando watch seguido por un nombre de variable
(ej. watch user_id) agrega esa variable (y
su valor) a la ventana de reloj. Registros y
offsets de pila (para no mencionar valores de
memoria) pueden ser mirados us�ndolos en
lugar del nombre de la variable, como watch es:di
y watch [ebp 18]. Adem�s, puesto que muchos
registros y offsets de pila son meramente el
punto para dirigirse donde las variables reales
se guardan, puedes mirar el valor de referencia
por el registro u offset de pila tecleando un *
antes del nombre del registro/offset (eg, watch
*es:di). Buenas variables para watch son es:di,
*es:di, eax, y cualquier [esp?] o [ebp?] aquellas
referencias introducidas por un usuario. |
|