Bueno, tras instalar el programa,
se nos crean 3 diferentes accesos al programa en question,
estos son :
Solid
Edge Chapa -> smetal.exe
Solid Edge Conjunto -> assembl.exe
Solid Edge Pieza -> part.exe
Solid Edge Plano -> draft
Cada uno de estos accesos corresponde
a un ejecutable distinto como he indicado, por lo que seguramente
cada uno deberá ser modificado para que funcione 'correctamente'.
Probaremos primero con Solid Edge chapa haciendo click sobre
este, veremos que el programa nos muestra un mensaje en
el que nos comunica el fin de nuestro periodo de evaluación
(esto es cierto si la fecha de nuestro sistema supera el
1 de Enero de 1998 ya que el periodo de evaluación empieza
el 1 de diciembre de 1998 y dura 30 dias, si no te dice
que ha caducado modifica la fecha para que el programa te
diga que a caducado).
El mensaje dice algo asi...
The
evaluation period for this software has expired bla bla
bla ....
Haz click en Aceptar y el programa
finalizará. Bien, ya tenemos algo por donde comenzar un
MessageBox, adivinas lo que haremos ahora ? No, pues mal
eso es que no sigues mis tutoriales. Pero como soy buena
persona te dire que es lo que haremos:
- Activar el Soft-Ice (Ctrl+D)
y poner un breakpoint en las siguientes funciones:
bpx
Messagebox
bpx MessageboxA
bpx MessageBoxEx
Con esto intentaremos parar
la ejecución del programa antes de que muestre el cuadro
de dialogo que nos molesta tanto. Una vez establecidos los
bpx ejecutamos de nuevo el programa Solid Edge Chapa. Boom
!! el breakpoint MessageBoxEx a surtido efecto, estamos
de nuevo en el Soft-Ice, dentro de la función MessageboxEx
de la DLL user32 por lo que pulsaremos F12 y esto hará que
se muestre el cuadro de dialogo, se activará el S-Ice de
nuevo y volveremos a pulsar F12 para que se se continue
ejecutando código hasta que el programa vuelva a la linea
de código desde donde fue llamada la función que muestra
el cuadro de dialogo. Soft-Ice aparecerá de nuevo y mostrará
algo así:
*
Reference To: USER32.MessageBoxExA, Ord:0196h |
:00404BB1 |
8B3514A84000 |
mov
esi, dword ptr [0040A814] |
//
ESI apunta a la función MessageboxA |
:00404BB7 |
57 |
push
edi |
:00404BB8 |
53 |
push
ebx |
:00404BB9 |
55 |
push
ebp |
:00404BBA |
50 |
push
eax |
:00404BBB |
6A00 |
push
00000000 |
:00404BBD |
FFD6 |
call
esi |
//
Esta es la llamada a MessageBoxA |
:00404BBF |
8B4C2410 |
mov
ecx, dword ptr [esp+10] |
//
ESTAMOS AQUI!!! |
:00404BC3 |
85C9 |
test
ecx, ecx |
:00404BC5 |
7420 |
je
00404BE7 |
:00404BC7 |
83F802 |
cmp
eax, 00000002 |
:00404BCA |
7413 |
je
00404BDF |
:00404BCC |
F6C310 |
test
bl, 10 |
:00404BCF |
750E |
jne
00404BDF |
:00404BD1 |
8B4C2458 |
mov
ecx, dword ptr [esp+58] |
:00404BD5 |
57 |
push
edi |
:00404BD6 |
53 |
push
ebx |
:00404BD7 |
55 |
push
ebp |
:00404BD8 |
51 |
push
ecx |
:00404BD9 |
6A00 |
push
00000000 |
:00404BDB |
FFD6 |
call
esi |
//
esto es otra llamada a MessageboxA |
:00404BDD |
EB08 |
jmp
00404BE7 |
//
que no es ejecutada |
Bueno la linea 404BBD realiza
la llamada a la función MessageBoxA, los push anteriores
son los parametros de creación del MessageBox. Llegados
a este punto nos queda pensar lo siguiente:
- Usar el W32Dasm y desensamblar
el código del programa y ver que hay antes de estas lineas
para comprobar si hay algun salto que nos envie a estas
lineas y modificarlo.
- Continuar la ejecución
de esta rutina con F12 con la intencion de ir a la linea
donde se llama a a esta rutina para comprobar si el lugar
donde estamos no es exactamente lo que buscamos ya que
podria tratarse de una rutina que muestra los diferentes
cuadros de dialogo según la fecha.
Lo lógico aquí es la opción
B ya que como estamos dentro del Soft-Ice no nos cuesta
nada hacer esta comprobacíon y así asegurarnos. Pues adelante,
pulsamos F12 y se nos mostrará algo así:
:00403246 |
51 |
push
ecx |
:00403247 |
52 |
push
edx |
:00403248 |
56 |
push
esi |
:00403249 |
50 |
push
eax |
:0040324A |
53 |
push
ebx |
:0040324B |
E830120000 |
call
00404480 |
//
Venimos de aquí... |
:00403250 |
83C41C |
add
esp, 0000001C |
//
ESTAMOS AQUI!!! Restaura la pila |
:00403253 |
83F802 |
cmp
eax, 00000002 |
//
comprueba valor de retorno (mmmmmm...) |
:00403256 |
89442420 |
mov
dword ptr [esp+20], eax |
//
guarda dicho valor |
:0040325A |
0F85EE020000 |
jne
0040354E |
//
salta si el valor no es 2 |
:00403260 |
B933000000 |
mov
ecx, 00000033 |
:00403265 |
8DBC240C040000 |
lea
edi, dword ptr [esp+0000040C] |
:0040326C |
F3 |
repz
|
:0040326D |
A5 |
movsd
|
Examina este código antes de
hacer nada. Que te parece? no es sospechoso el cmp eax,00000002
(linea 403253) Pues si bastante, normalmente las funciones
retornan con un valor en EAX que es usado por el programa
para comprobar ciertas condiciones :) . Y esto nos hace
pensar que si despues de volver de esta función (404480)
no volvemos con un 2 en EAX, el programa probablemente no
continuará su ejecución. Otra cosa que lo hace más sospechoso
aún es la linea 40325a en la que EAX es guardado, ¿ Para
que guardar un valor de retorno de una función? Pues probablemente
para hacer algún test más adelante. Bueno esto es teoria,
ahora la practica, vamos a modificar EAX para que valga
2 ya que como puedes comprobar vale 3. Para hacer esto teclearemos
> r
eax
> modificar el 3 por un 2
> pulsar ENTER y luego ESC
Sólo queda seguir adelante
pulsando g y ENTER, comprobaras sorprendido que el programa
funcionara hasta que nos diga que no hay el CD-ROM original
dentro de la unidad, pero por lo menos ya sabemos como evitar
que el programa caduque.
- Vamos a modificar el ejecutable
para que nos deje entrar aunque haya caducado antes de entrar
con la rutina de detección del CD original.Pensemos la mejor
manera, necesitamos eliminar el mensaje y que el programa
continue su ejecución normal. Para ello necesitamos eliminar
la llamada de la linea 40324B y hacer que EAX valga 2 siempre.
Parece dificil pero no lo es, en vez de llenar con NOP los
bytes que ocupa la función, que son exactamente 6 bytes
lo llenaremos con la instrucción MOV EAX,2 que ocupa exactamente
6 bytes. Con esto matamos dos pajaros de un tiro:
Eliminamos la llamada y conseguimos que EAX valga 2. La
codificación para MOV EAX,2 es B802000000. Adicionalmente
podemos rellenar con NOPs el salto posterior y asi nos aseguramos
del todo, esto significa cambiar los bytes 0F85EE020000
por 909090909090. Para modificar el ejecutable lo desensamblaremos
con el W32Dasm si no los has echo ya hazlo. Iremos a las
correspondientes lineas (40324B y 40325A) y apuntaremos
los offset que el W32Dasm nos dice en la barra de estado
inferior, saldremos del W32Dasm y abriremos nuestro fichero
con el editor hexadecimal que uses normalmente y una abierto
iremos a los correspondientes offsets y cambiaremos los
bytes que marca por los nuevos.Creo que seras capaz de hacerlo
tu solo asi que no me enrollo más.
Nota:
Para
nuestra suerte y regocijo el resto de ejecutables usan el
mismo esquema para la comprobación de la fecha, por lo que
no tendremos ni que trazarlos con el S-Ice, simplemente
busca las cadenas 0F85EE020000 (salto) y E830120000 (llamada)
y modificalas como en el caso anterior. Una vez más la vagueza
de los programadores de "elite" se pone de manifiesto
:)
- Ahora puedes ejecutar el
programa y veras que funciona hasta que aparece el cuadro
de dialogo que nos indica que no tenemos el CD original
en la unidad (si tienes los bpx activos, comprobaras que
antes del cuadro estos se activan en un MessageBoxA que
pertenece al cuadro de dialogo en cuestion). Si no tienes
activos los bpx activalos y vuelve a intentarlo... Ya?.
Ok. estamos justo en el la función MessageboxA de la DLL
User32, haremos lo mismo que antes ir a la linea que sigue
a la que llama a esta función, por lo que pulsaremos F12.
Y veremos algo así:
:04B51318 |
E8A5020000 |
Call
04B515C2 |
:04B5131D |
8D4DB0 |
lea
ecx, dword ptr [ebp-50] |
:04B51320 |
8BF0 |
mov
esi, eax |
*
Reference To: JUTIL.??BGUserText@@QBEPBDXZ, Ord:0016h
|
:04B51322 |
E89B020000 |
Call
04B515C2 |
:04B51327 |
6A40 |
push
00000040 |
:04B51329 |
56 |
push
esi |
:04B5132A |
50 |
push
eax |
:04B5132B |
6A00 |
push
00000000 |
*
Reference To: USER32.MessageBoxA, Ord:0195h |
:04B5132D |
FF15BC41B504 |
Call
dword ptr [04B541BC] |
:04B51333 |
8D4DD0 |
lea
ecx, dword ptr [ebp-30] |
//
ESTAMOS AQUI!!! |
:04B51336 |
C645FC03 |
mov
[ebp-04], 03 |
*
Reference To: JUTIL.??1GUserText@@QAE@XZ, Ord:000Ah
|
:04B5133A |
E877020000 |
Call
04B515B6 |
:04B5133F |
8D4DB0 |
lea
ecx, dword ptr [ebp-50] |
:04B51342 |
C645FC00 |
mov
[ebp-04], 00 |
*
Reference To: JUTIL.??1GUserText@@QAE@XZ, Ord:000Ah
|
:04B51346 |
E86B020000 |
Call
04B515B6 |
:04B5134B |
B805400080 |
mov
eax, 80004005 |
:04B51350 |
8B4DF4 |
mov
ecx, dword ptr [ebp-0C] |
:04B51353 |
64890D00000000 |
mov
dword ptr fs:[00000000], ecx |
:04B5135A |
5F |
pop
edi |
:04B5135B |
5E |
pop
esi |
:04B5135C |
5B |
pop
ebx |
:04B5135D |
8BE5 |
mov
esp, ebp |
:04B5135F |
5D |
pop
ebp |
:04B51360 |
C3 |
ret
|
Bueno bueno, un primer vistazo
no nos revela nada pero ojo ! Donde estamos mira lo que
dice el SoftIce en la linea donde muestra el nombre del
programa/dll donde estamos... KeyChk!.text+2C0, es una DLL
y con un nombre bastante sospechoso, puede ser una DLL de
uso interno del programa que se usa para la comprobación
del CD.
- Llegados a este punto no
merece la pena continuar dentro del Soft-Ice para intentar
algo como lo que hicimos anteriormente, por lo que desactivaremos
los breakpoints y apuntaremos la dirección de código donde
estamos que debe ser 4B51333, saldremos del Soft-Ice y del
programa para desensamblar la DLL keychk.dll que podemos
buscar con el explorador de windows, la encontraras dentro
del directorio donde se encuentran los ejecutables del programa
( X:\..\Solid Edge\Program ), haremos una copia de seguridad
y la desensamblaremos para ver que hace.
Si hacemos click sobre el icono Exp Fnc (funciones que exporta
la DLL) veremos que sólo hay una y se llama CheckKey (que
te parece el nombrecillo, vaya programadores más lamers)
no sacaremos mucho en claro si investigamos esta función
por lo que vamos a ir la función donde nos dejo el Soft-Ice,
vamos al menu Goto e introducimos la dirección que antes
habiamos apuntado 4B51333, una vez alli (veremos exactamente
el código que tienes encima de estas lineas) iremos marcha
atras (tecla flecha arriba) buscando algun salto que nos
envie o nos aleje de esta parte de código tras unas cuantas
pulsaciones veremos algo así:
:04B512BD |
8D4DE0 |
lea
ecx, dword ptr [ebp-20] |
:04B512C0 |
51 |
push
ecx |
:04B512C1 |
E8EA000000 |
call
04B513B0 |
//
Llama a una función |
:04B512C6 |
83C404 |
add
esp, 00000004 |
//
restaura pila |
:04B512C9 |
85C0 |
test
eax, eax |
//
comprueba valor de retorno (mmmm....) |
:04B512CB |
0F8CC4000000 |
jl
04B51395 |
//
salta bastante lejos |
:04B512D1 |
8B45E0 |
mov
eax, dword ptr [ebp-20] |
//
guarda valor de retorno |
:04B512D4 |
85C0 |
test
eax, eax |
//
comprueba de nuevo |
:04B512D6 |
0F85B4000000 |
jne
04B51390 |
//
salta un poco menos lejos |
:04B512DC |
8D4DB0 |
lea
ecx, dword ptr [ebp-50] |
Cabe suponer que ninguno de
estos saltos es tomado ya que son a direcciones más lejanas
que la 4B51333. Hay dos cosas sospechosas en estas lineas,
primero la llamada y luego el test eax,eax seguido del jl
04b51395 (SF<>0F). Si vamos al código que pertenece
a la llamada call 4B513B0 (Menu Goto, teclear dicha dirección
y enter) y examinamos por encima las referencias a las posibles
cadenas veremos cosas como:
*
Reference To: KERNEL32.GetLogicalDrives, Ord:00FAh
-> La función GetLogicalDrives
retorna un DWORD que representa las unidades de disco disponibles
*
Reference To: KERNEL32.GetDriveTypeA, Ord:00DFh
-> GetDriveType determina
el tipo de unidad de disco: si es removible, fija, un CD-ROM,
disco RAM, o una unidad de red.
*
Reference To: MSVCRT.fopen, Ord:0254h
-> Abre un archivo
*
Possible StringData Ref from Data Obj ->"verLic.dll"
-> referencia a un nombre
de una DLL que no existe en nuestro disco duro pero si en
el CD-ROM original :)
*
Possible StringData Ref from Data Obj ->"Products\Solidedg\verLic.dll"
-> referencia a un nombre
y ubicación de una DLL que no existe en nuestro disco duro
pero si en el CD-ROM original :)
*
Possible StringData Ref from Data Obj ->"Products\SEDraft\verLic.dll"
-> referencia a un nombre
y ubicación de una DLL que no existe en nuestro disco duro
pero si en el CD-ROM original :)
*
Reference To: MSVCRT.fclose, Ord:0249h
-> cierra el archivo
Bueno como habras podido deducir
todo este código comprueba las unidades disponibles, busca
una que sea de tipo
CD-ROM
:04B514B2 |
FFD5 |
call
ebp |
//
Llama a GetdriveTypeA |
:04B514B4 |
83F805 |
cmp
eax, 00000005 |
//
Es un lector de CD-ROM |
:04B514B7 |
0F858B000000 |
jne
04B51548 |
//
NO, PUES MALAMENTE |
y comprueba si existe el archivo
"verlic.dll" en el CD intentandolo abrir
:04B514F5 |
50 |
push
eax |
:04B514F6 |
FFD6 |
call
esi |
//
llama a fopen |
:04B514F8 |
83C408 |
add
esp, 00000008 |
:04B514FB |
85C0 |
test
eax, eax |
//
si retorno 0 = NULL |
:04B514FD |
7530 |
jne
04B5152F |
//
malamente ya que no puede ser NULL el valor de retorno
|
luego lo vuelve a cerrar comprobando
de nuevo si se pudo cerrar.
:04B5153B |
FF15A041B504 |
Call
dword ptr [04B541A0] |
//
llama a fclose |
:04B51541 |
83C404 |
add
esp, 00000004 |
:04B51544 |
85C0 |
test
eax, eax |
//
comprueba si eax=0=NULL |
:04B51546 |
7510 |
jne
04B51558 |
//
si no se pudo cerrar malamente, no existe |
(no puedo asegurarte si hace
alguna lectura pero diria que no ya que no hay ningun fread)
ademas yo ya comprobé lo que es exactamente la dll verlic.dll
y no es mas que un fichero de icono renombrado. Para ver
que tipo de accesos se realizan a este archivo puedes usar
el Filemonitor y veras lo que se hace con este archivo.Bueno
hemos salido de dudas y ahora solo queda pensar como hacer
para que el programa funcione en cualquier caso, haya o
no CD original.
- Podriamos modificar los
saltos que hace al abrir y cerrar el archivo pero solo
funcionaria en caso de que el CD original no estuviera,
y queremos que funcione de ambas maneras.
-Dejar en paz esta rutina
y cambiar el salto que hay despues de la llamada a esta:
:04B512BD |
8D4DE0 |
lea
ecx, dword ptr [ebp-20] |
:04B512C0 |
51 |
push
ecx |
:04B512C1 |
E8EA000000 |
call
04B513B0 |
//
Comprueba si existe el fichero verlic.dll en la unidad
CD-ROM |
:04B512C6 |
83C404 |
add
esp, 00000004 |
//
restaura pila |
:04B512C9 |
85C0 |
test
eax, eax |
//
comprueba valor de retorno (mmmm....) |
:04B512CB |
0F8CC4000000 |
jl
04B51395 |
//
salta bastante lejos (esto es lo que hay que cambiar)
|
:04B512D1 |
8B45E0 |
mov
eax, dword ptr [ebp-20] |
//
guarda valor de retorno |
:04B512D4 |
85C0 |
test
eax, eax |
//
comprueba de nuevo |
:04B512D6 |
0F85B4000000 |
jne
04B51390 |
//
salta un poco menos lejos |
:04B512DC |
8D4DB0 |
lea
ecx, dword ptr [ebp-50] |
Bingo!! esto es lo que hay
que cambiar por un salto incondicional, pero ojo, es un
salto de más de 127 bytes, y ahora no me acuerdo de cual
seria su codificación (mmmm....). No importa, usaremos el
Soft-Ice, allí modificaremos esta linea y miraremos que
código de operación tiene jejejejeje. Antes apunta el offset
que es 6CBh.
- Para poder establecer un
bpx en 4B512CB deberas hacer primero que el programa se
pare dentro de la DLL keychk.dll con el bpx messageboxa,
apreta F12 2 veces y ahora pon el bpx en 4B512CB, ahora
el programa saldrá ya que no hemos cambiado nada, vuelve
a ejecutarlo y ahora si se parará justo donde queremos.
Escribe lo siguiente
>
a 4b512cb
> jmp 4b51395
> pulsa ENTER dos veces
> d 4b512cb
Ahora en la ventana donde se
muestra el volcado veras la codificación de la instrucción
que es E9C500000000 el proceso ahora es el mismo, salir
de donde estas, abrir la dll con el editor hexadecimal,
ir al offset de archivo 6CBh y modificar los seis bytes
que encuentres allí por E9C500000000, salvar cambios y a
correr. Si continuas la
ejecución del programa este funcionará correctamente :)
.
Ahora funcionaran todos los
ejecutables a la perfección ya que todos usan la DLL keychk.dll
para comprobar el CD-ROM (el fichero que debe haber más
que la unidad en si) esta es una gran ventaja ya que así
nos evitamos tener que hacer cambios en todos los ejecutables.
Nota: Los driver OpenGL de
la number Nine Rev IV no funcionan bien con este programa
y dan fallos en la dll w95glsrv.dll (que pertenece a estos
drivers) al salir del programa o al cerrar ventanas de vistas
en 3D, esto es debido a que los drivers son una versión
Beta (los mios por lo menos) y no funcionan bien, no es
por culpa de que el crack este mal hecho, como yo pensaba
cuando este me petaba sin saber porque.Me volví loco hasta
que descubrí que era lo que sucedia realmente.
Con otras tarjetas funciona todo perfectamente. Por ej con
la Intel 740. Para que luego digan que los crackers no servimos
para nada, y como llamas a esto si no es buscar posibles
bugs en el software?
|