saludos,
Estoy tratando de hacer un crack para un programa que se llama PBU, es un programa que se usa para cabinas de fotos, en esencia lo que hace es tomar una foto aplicarle efectos, imprimirla y compartirla en redes sociales.
Conseguí la versión Trial del programa que da 15 días de prueba.
Lo que hice hasta ahora fue lo siguiente: primero analice el ejecutable con el RDG Packer Detector y el resultado es que el mismo esta compilado en Visual Basic .NET, y no esta ofuscado y no tiene ninguna protección.
Procedí entonces a desensamblarlo con el Reflector y usando el dotNET_Tracer ubique la "zona caliente" donde el programa valida la cantidad de días restantes del periodo de prueba y también donde valida si la licencia es trial o es pro..etc.
Ese código estaba ubicado en el archivo PhotoBoothUpload.dll y dentro de esta dll hay esta la clase PhotoPartyUpload.PhotoBoothUpload.Registration y ahí están los métodos que se muestran en el dotNET_Tracer específicamente: CheckRegistration().
El codigo en Visual. Net de Checkregistration es:
************************************************************
************************************************************
Public Function CheckRegistration() As RegistrationState
If Me.IsRegistrationDisabled Then
Return RegistrationState.Registered
End If
Dim unregisteredTrial As RegistrationState = RegistrationState.UnregisteredTrial
Dim data As LicenseData = Me.LoadLicenseData
Dim regData As RegistrationData = Me.LoadRegistrationData
If (regData Is Nothing) Then
regData = New RegistrationData With { _
.FirstRunDate = DateTime.Now, _
.LatestDetectedDate = DateTime.Now _
}
End If
Dim currentTime As DateTime = Me.GetCurrentTime
If (currentTime > regData.LatestDetectedDate) Then
regData.LatestDetectedDate = currentTime
End If
Me.RegData = regData
Me.SaveRegistrationData(regData)
Dim time2 As DateTime = regData.FirstRunDate.AddDays(1000)
If (Me.RegData.LatestDetectedDate > time2) Then
unregisteredTrial = RegistrationState.UnregisteredTrialExpired
Me._isProLicense = False
Else
unregisteredTrial = RegistrationState.UnregisteredTrial
Me._isProLicense = True
End If
If (Not data Is Nothing) Then
Me.LicenseData = data
If (Me.RegData.LatestDetectedDate > data.LicenseExpiryDate) Then
unregisteredTrial = RegistrationState.RegisteredExpired
Else
unregisteredTrial = RegistrationState.Registered
End If
Me._isProLicense = data.IsProVersion
Me._licenseCode = data.RegCode
End If
Me._registrationState = unregisteredTrial
Return unregisteredTrial
End Function
*************************************************************
*************************************************************
El codigo IL de la funcion es:
.method public hidebysig instance valuetype PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationState CheckRegistration() cil managed
{
.maxstack 2
.locals init (
[0] valuetype PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationState state,
[1] class PhotoPartyUpload.PhotoBoothUpload.Registration.LicenseData data,
[2] class PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationData data2,
[3] valuetype [mscorlib]System.DateTime time,
[4] valuetype [mscorlib]System.DateTime time2)
L_0000: ldarg.0
L_0001: ldfld bool PhotoPartyUpload.PhotoBoothUpload.Registration.Registration::IsRegistrationDisabled
L_0006: brfalse.s L_000a
L_0008: ldc.i4.2
L_0009: ret
L_000a: ldc.i4.0
L_000b: stloc.0
L_000c: ldarg.0
L_000d: call instance class PhotoPartyUpload.PhotoBoothUpload.Registration.LicenseData PhotoPartyUpload.PhotoBoothUpload.Registration.Registration::LoadLicenseData()
L_0012: stloc.1
L_0013: ldarg.0
L_0014: call instance class PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationData PhotoPartyUpload.PhotoBoothUpload.Registration.Registration::LoadRegistrationData()
L_0019: stloc.2
L_001a: ldloc.2
L_001b: brtrue.s L_0039
L_001d: newobj instance void PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationData::.ctor()
L_0022: stloc.2
L_0023: ldloc.2
L_0024: call valuetype [mscorlib]System.DateTime [mscorlib]System.DateTime::get_Now()
L_0029: stfld valuetype [mscorlib]System.DateTime PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationData::FirstRunDate
L_002e: ldloc.2
L_002f: call valuetype [mscorlib]System.DateTime [mscorlib]System.DateTime::get_Now()
L_0034: stfld valuetype [mscorlib]System.DateTime PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationData::LatestDetectedDate
L_0039: ldarg.0
L_003a: call instance valuetype [mscorlib]System.DateTime PhotoPartyUpload.PhotoBoothUpload.Registration.Registration::GetCurrentTime()
L_003f: stloc.3
L_0040: ldloc.3
L_0041: ldloc.2
L_0042: ldfld valuetype [mscorlib]System.DateTime PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationData::LatestDetectedDate
L_0047: call bool [mscorlib]System.DateTime::op_GreaterThan(valuetype [mscorlib]System.DateTime, valuetype [mscorlib]System.DateTime)
L_004c: brfalse.s L_0055
L_004e: ldloc.2
L_004f: ldloc.3
L_0050: stfld valuetype [mscorlib]System.DateTime PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationData::LatestDetectedDate
L_0055: ldarg.0
L_0056: ldloc.2
L_0057: stfld class PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationData PhotoPartyUpload.PhotoBoothUpload.Registration.Registration::RegData
L_005c: ldarg.0
L_005d: ldloc.2
L_005e: call instance void PhotoPartyUpload.PhotoBoothUpload.Registration.Registration::SaveRegistrationData(class PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationData)
L_0063: ldloc.2
L_0064: ldflda valuetype [mscorlib]System.DateTime PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationData::FirstRunDate
L_0069: ldc.r8 1000
L_0072: call instance valuetype [mscorlib]System.DateTime [mscorlib]System.DateTime::AddDays(float64)
L_0077: stloc.s time2
L_0079: ldarg.0
L_007a: ldfld class PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationData PhotoPartyUpload.PhotoBoothUpload.Registration.Registration::RegData
L_007f: ldfld valuetype [mscorlib]System.DateTime PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationData::LatestDetectedDate
L_0084: ldloc.s time2
L_0086: call bool [mscorlib]System.DateTime::op_GreaterThan(valuetype [mscorlib]System.DateTime, valuetype [mscorlib]System.DateTime)
L_008b: brfalse.s L_0098
L_008d: ldc.i4.1
L_008e: stloc.0
L_008f: ldarg.0
L_0090: ldc.i4.0
L_0091: stfld bool PhotoPartyUpload.PhotoBoothUpload.Registration.Registration::_isProLicense
L_0096: br.s L_00a1
L_0098: ldc.i4.0
L_0099: stloc.0
L_009a: ldarg.0
L_009b: ldc.i4.1
L_009c: stfld bool PhotoPartyUpload.PhotoBoothUpload.Registration.Registration::_isProLicense
L_00a1: ldloc.1
L_00a2: brfalse.s L_00e1
L_00a4: ldarg.0
L_00a5: ldloc.1
L_00a6: call instance void PhotoPartyUpload.PhotoBoothUpload.Registration.Registration::set_LicenseData(class PhotoPartyUpload.PhotoBoothUpload.Registration.LicenseData)
L_00ab: ldarg.0
L_00ac: ldfld class PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationData PhotoPartyUpload.PhotoBoothUpload.Registration.Registration::RegData
L_00b1: ldfld valuetype [mscorlib]System.DateTime PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationData::LatestDetectedDate
L_00b6: ldloc.1
L_00b7: ldfld valuetype [mscorlib]System.DateTime PhotoPartyUpload.PhotoBoothUpload.Registration.LicenseData::LicenseExpiryDate
L_00bc: call bool [mscorlib]System.DateTime::op_GreaterThan(valuetype [mscorlib]System.DateTime, valuetype [mscorlib]System.DateTime)
L_00c1: brfalse.s L_00c7
L_00c3: ldc.i4.3
L_00c4: stloc.0
L_00c5: br.s L_00c9
L_00c7: ldc.i4.2
L_00c8: stloc.0
L_00c9: ldarg.0
L_00ca: ldloc.1
L_00cb: ldfld bool PhotoPartyUpload.PhotoBoothUpload.Registration.LicenseData::IsProVersion
L_00d0: stfld bool PhotoPartyUpload.PhotoBoothUpload.Registration.Registration::_isProLicense
L_00d5: ldarg.0
L_00d6: ldloc.1
L_00d7: ldfld string PhotoPartyUpload.PhotoBoothUpload.Registration.LicenseData::RegCode
L_00dc: stfld string PhotoPartyUpload.PhotoBoothUpload.Registration.Registration::_licenseCode
L_00e1: ldarg.0
L_00e2: ldloc.0
L_00e3: stfld valuetype PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationState PhotoPartyUpload.PhotoBoothUpload.Registration.Registration::_registrationState
L_00e8: ldloc.0
L_00e9: ret
}
**************************************************************
**************************************************************
Se que hay varias maneras de Crackearlo pero se me ocurrió que la más simple era cambiar en el método CheckRegistration().
Como se ve en el codigo anterior al inicio de la función hay un condicional que verifica si esta deshabilitado el registro (es decir si ya está registrado de antemano), y cambia el estado de la variable "RegistrationEstate"a "Registered". La idea que tengo es agregar otro condicional para que al entrar a la función la primera vez cambie el estado de la variable "Isprolicencia" a "true" y la variable "IsRegistrationDisabled" tambien cambie a "True", asi siempre va a entrar en el siguiente condicional y retornar el estado "Registered", la primera parte del codigo modificado quedaria de la siguiente forma:
If Not Me.IsRegistrationDisabled Then
Me._isProLicense = True
Me.IsregistrationDisabled=True
End if
If Me.IsRegistrationDisabled Then
Return RegistrationState.Registered
End If
Lo pensé de esta manera porque solo con cambiar solo RegistrationState a "registred" no funciona, ya que en alguna otra parte del código el programa verifica el tipo de licencia y sigue figurando trial y quedan las fotos con una marca de agua. Por lo tanto en este punto de la función quiero tambien de una vez cambiar es estado de "IsProLicence" y talvez sea necesario en este punto cambiar los demás datos de la licencia como "LicenceexpireDate" y "LicenceCode", para que no falle la verificación en otros puntos del programa, pero quiero probar primero cambiando solo las varibles antes mencionadas.
El problema es que no logro modificar el codigo IL para que quede de la forma anterior, modifique las primeras instrucciones Il con el Reflexil de la siguiente manera pero no funciona:
L_0000: ldfld bool PhotoPartyUpload.PhotoBoothUpload.Registration.Registration::IsRegistrationDisabled
L_0005: brtrue.s L_0013
L_0007: ldc.i4.1
L_0008: stfld bool PhotoPartyUpload.PhotoBoothUpload.Registration.Registration::_isProLicense
L_000d: ldc.i4.1
L_000e: stfld bool PhotoPartyUpload.PhotoBoothUpload.Registration.Registration::IsRegistrationDisabled
L_0013: ldarg.0
L_0014: ldfld bool PhotoPartyUpload.PhotoBoothUpload.Registration.Registration::IsRegistrationDisabled
L_0019: brfalse.s L_001d
L_001b: ldc.i4.2
L_001c: ret
me sale un error en el reflector de "Pila vacia"...
Agradezco si alguien puede indicarme como modificar el codigo en el Reflexil para que quede como quiero, o me de alguna otra sugerencia.
Tambien me seria de mucha ayuda si pueden indicarme un buen turorial de CIL, he buscado pero no encontre ninguno que sea bien completo, y entiendo que debo mejorar mis conocimientos en CIL.
Muchas gracias
Mod: Los códigos deben ir en etiquetas de GeSHi o en su defecto en etiquetas de código
Hola!
Si colocas un link de descarga del ejecutable, podemos mirarlo "in-situ" y, así, darte algunas ideas.
Se hace difícil analizar el código estáticamente (sobre todo si hay 989898 :P), además de que está incompleto.
Saludos!
Hola agradezco la respuesta, puedes descarar la dll que quiero modificar de aca:
http://ge.tt/9bLqLvN2/v/0
Me parecio innecesario subir todo el codigo porque solo necesito cambiar la primera parte de la funcion CheckRegistration()...para que quede como puse en la descripcion; es decir agregar el siguiente condicional al inicio de la funcion:
If Not Me.IsRegistrationDisabled Then
Me._isProLicense = True
Me.IsregistrationDisabled=True
End if
Pero te agradezco si quieres mirar la dll completa y darme alguna otra sugerencia.
tambien insisto en mi pedido si alguien me puede recomendar un tutorial de Lenguaje Intermedio Comun (CIL) que sea bien completo...Se que me falta conocimientos en CIL y es por esto que no he logrado modificar el codigo en el Reflexil para que quede como quiero.
De antemano muchas gracias.
saludos
OK, vamos por partes:
Cita de: kenosis en 14 Septiembre 2015, 22:07 PM
tambien insisto en mi pedido si alguien me puede recomendar un tutorial de Lenguaje Intermedio Comun (CIL) que sea bien completo...Se que me falta conocimientos en CIL y es por esto que no he logrado modificar el codigo en el Reflexil para que quede como quiero.
No conozco tutoriales "completos" sobre MSIL (ó CIL). Es un lenguaje intermedio como el bytecode de Python o Java. Sólo debes conocer cómo trabaja cada opcode y listo. El mejor tutorial es la experiencia propia.
Ahora, con el tema de la DLL, voy a usar éste comentario tuyo:
Cita de: kenosis en 14 Septiembre 2015, 22:07 PM
Pero te agradezco si quieres mirar la dll completa y darme alguna otra sugerencia.
Te has dado cuenta de que en dicha DLL hay una función llamada
KeyGenerator, la cual puedes usar para registrar el programa? :silbar: :silbar: :silbar:
Con lo anterior, sería algo trivial (en realidad, ya lo he hecho. Hasta me bajé el programa para probarlo!! :P) hacer un keygen para registrar el programa.
Y asunto terminado. ;D
Saludos!
PD: Sería interesante que sigas tratando de crackear la función.
Gracias por responder. como tu dices vamos por partes.
Como mencione antes se que hay varias maneras de lograr crackear el programa, pero como tengo poca experiencia me parecio que las mas simple era solo modificar el Checkregistration(), tambien vi la funcion Generatekey() pero como no tengo experiencia haciendo keygen pense primero en intentar la forma que me parece mas simple teniendo en cuenta mi poca experiencia. Entonces en resumen te pido ayuda con dos inquietudes:
1) si tu dices que es facil hacer el keygen lo voy a intentar. Puedes darme alguna recomendacion mas especifica al respecto?, me puedes recomendar alguna lectura para princiiantes en Keygen que aplique a mi problema?
2)igualmente me gustaria probar modificando el Checkregistration(), me puedes ayudar echandole un vistazo al codigo que modifique y orientarme respecto a que esta mal con la modificacion del codigo IL que hice?...porque me sigue saliendo error de pila vacia?, que me falta modificar/agregar con el reflexil para que la funcion quede como quiero?
muchas gracias por tu atencion.
saludos
Cita de: kenosis en 15 Septiembre 2015, 16:51 PM
Como mencione antes se que hay varias maneras de lograr crackear el programa, pero como tengo poca experiencia me parecio que las mas simple era solo modificar el Checkregistration()
Lo mas sencillo no es modificar el ejecutable (o alguna lib del mismo). Con eso obtienes algo que, valga la obviedad, "no es lo original".
En cambio, con un keygen, el programa sigue original y con plena funcionalidad.
Claro que
en este caso, puedes aplicar un crack también, pero la oportuinidad de hacer el keygen está al alcance de la mano.
Cita de: kenosis en 15 Septiembre 2015, 16:51 PM
1) si tu dices que es facil hacer el keygen lo voy a intentar. Puedes darme alguna recomendacion mas especifica al respecto?, me puedes recomendar alguna lectura para princiiantes en Keygen que aplique a mi problema?
OK. Cuando llegue a casa te daré algunas pistas para hacer el keygen. Básicamente, con aprender a programar en VB para .NET o C# (o cualquier otro lenguaje), lograrías hacer un keygen, teniendo el source.
Cita de: kenosis en 15 Septiembre 2015, 16:51 PM
2)igualmente me gustaria probar modificando el Checkregistration(), me puedes ayudar echandole un vistazo al codigo que modifique y orientarme respecto a que esta mal con la modificacion del codigo IL que hice?...porque me sigue saliendo error de pila vacia?, que me falta modificar/agregar con el reflexil para que la funcion quede como quiero?
De la misma forma, te daré algunos tips sobre la modificación del MSIL.
Saludos!
EDITComo prometí, en la imagen siguiente puedes ver cómo modifiqué la DLL para que setee la variable
isPro a True y que retorne siempre que está registrado. Compara con lo que has hecho (la imagen se ve chica, pero si vas al link de la misma la verás al 100%):
(http://i.imgur.com/og9Em2C.jpg)
Con ese cambio, el proggie corre sin registrarlo (y sin inet :P)
Ahora, la siguiente imagen te muestra cómo está definida la función
Keygenerator (de igual forma, la verás pequeña, pero si vas al link de la misma la verás bien):
(http://i.imgur.com/cVNOl0l.jpg)
Si miras bien, verás que recibe 5 parámetros: e primero es el nombre a quien registrar el soft, el segundo es el código que te da el programa cuando lo quieres registrar, el tercero es la fecha en la que expira el soft (recomendable usar algo como 01/01/2200), el cuarto es la fecha en la que expiran los updates (recomendable usar la misma que antes) y por último, si es la versión Pro (osea, debe usarse True).
Copiando esa función en un proyecto VB .NET ó C# de VS y pasándole los parámetros como te he explicado, puedes hacer un keygen en 2 patadas.
Por supuesto, vas a necesitar saber lo mínimo sobre programación .NET.
Saludos!
Nuevamente gracias por responder.
Modifique el CIL como en el ejemplo que me mandaste y me pasa igual, me sale el error de pila vacia en el Reflector cuando quiero ver el codigo en VB.net o C#...pero si lo pongo en IL no sale el error, tal como se ve ne las siguientes imagenes:
(http://imgur.com/4iy2RUL)
http://imgur.com/4iy2RUL (http://imgur.com/4iy2RUL)
y aca se ve el error al tratar de cambiar el lenguaje del Reflector a VB:
(http://imgur.com/0byvxDx)
http://imgur.com/0byvxDx (http://imgur.com/0byvxDx)
mi pregunta es ¿a que se debe este error??.
De igual manera probe el programa con la dll modificada, cambie la dll original por la modificada en la carpeta de instalacion y ejecute el programa, y aunque no pide registro al iniciar el programa( lo que significa que el Checkregistation() devuelve "Registered"), las fotos que se toman quedan con una marca de agua. me imagino que no basta con solo cambiar RegistrationState e IsProVersion, porque en algun lugar el programa verifica los demas datos de la licencia como la fecha de expiracion de la licencia etc. pero me queda la duda si es por esto o es que el codigo no esta como quiero porque no lo puedo ver en VB ni en C#.
del siguiente link puedes descargar las dos dll, con las modificaciones que me sugeriste y la dll con las modificaciones que yo hice en un principio, si es posible ¿puedes verificar a ver si puedes ver el codigo VB o C# de las mismas en el Reflector?
http://filenurse.com/download/8df4849b4c3d3ebbe83b2c73a4c9e250.html (http://filenurse.com/download/8df4849b4c3d3ebbe83b2c73a4c9e250.html)
Pero como siempre hay muchas maneras de resolver un problema se me ocurrio cambiar la cantidad de dias que da para usar la version trial del programa, que por defecto son 15 dias. y encontre la funcion get_RemaningDaysTrial() ...que agrega 15 dias a la fecha de la primera ves que se ejecuta el programa...cambie este valor de 15 a 10000 y efectivamente tengo un trial con 10000 dias de prueba restantes. Es una solucion simple pero poco elegante para mi gusto...aunque por ahora es la unica que he hecho funcionar, con el incoveniente de que aparezca al inicio la molesta ventana que dice cuantos dias de prueba quedan y la pregunta de si deseo registrar....tal ves con el Resource_Hacker pueda quitar esta molesta ventana...aun no lo probe.
Respecto al keygen lo voy a intentar hacer en VB . net, Si te entendi bien solo debo copiar el codigo de la funcion y hacer un nuevo programa con esta funcion donde le envie los parametros correctos...¿es asi o en el nuevo programa debo incluir la referencia a la dll completa?..
Agradezco su atencion
saludos
Hola!
Una vez que modificas la DLL a nivel MSIL (ó IL), Reflector tendrá problemas para reconstruir el bytecode a cualquier lenguaje que elijas.
Para que no te salgan esos errores, podrías NOPear el resto de las instrucciones IL. Verás que así no tendrá problemas para convertir el bytecode al lenguaje que prefieras.
Con respecto al keygen: sólo debes crear un nuevo proyecto .NET en VS, agregar la función, modificarla un poquito (el cómo hacerlo, lo deberás descubrir por tí mismo, pero el mismo IDE te dará las pistas necesarias), agregar un botón, 2 textbox y listo.
Saludos!
PD: Ten en cuenta que el programa se conecta a internet por todos lados. Si quieres hacer pruebas, vas a tener que hacerlas quitándole es acceso a la misma. Puedes usar un firewall para bloquearlo o, como hacemos todos, usar una VM, en la cual puedes desactivar la placa de red directamente.
ok, voy a tratar de hacer el keygen con VB . Net.
por otro lado no entiendo que significa el termino "NOPear"...te refieres a eliminar las demas instrucciones IL?
Respecto de la conexion ya lo tenia bloqueado en el Firewall.
Comentare si tengo exito con el keygen.
Muchas gracias por la ayuda.
Cita de: kenosis en 17 Septiembre 2015, 23:19 PM
por otro lado no entiendo que significa el termino "NOPear"...te refieres a eliminar las demas instrucciones IL?
NOPear: Reemplazar instrucciones por instrucciones
NOP (
No-
OPeration; osea, que no realizan ninguna tarea).
:P
Saludos!
Cita de: kenosis en 12 Septiembre 2015, 19:17 PMSe que hay varias maneras de Crackearlo pero se me ocurrió que la más simple era cambiar en el método CheckRegistration().
El problema es que no logro modificar el codigo IL para que quede de la forma anterior, modifique las primeras instrucciones Il con el Reflexil de la siguiente manera pero no funciona:
No intentes modificar manualmente las instrucciones IL si no sabes hacerlo correctamente (yo tampoco se mucho), dices que estás utilizando
.Net Reflector + el plugin
Reflexil y tienes localizado la función validatoria, entonces con el mismo
Reflexil puedes modificar el código del método a tu semejanza utilizando la sintaxis VB.Net o C# del byte-code, es decir, modificar las órdenes para dejarlo más o menos así:
Public Function CheckRegistration() As RegistrationState
Me._isProLicense = True
Return RegistrationState.Registered
End Function
No es necesario más que eso, olvida el código
IL.
Aquí tienes un tutorial que hice con imágenes sobre cómo usar la opción "
Replace all with code", por si te sirve de algo, pero no creas que soy experto ni nada parecido en la ing. inversa, simplemente me defiendo en la técnica Reflection ya que desarrollo bajo la plataforma .Net y eso siempre ayuda a entender lo que haces al craquear un ensamblado .Net:
➢
[TUTORIAL] Craquear librería Nostalgia.Net (Reflection) (http://foro.elhacker.net/ingenieria_inversa/tutorial_craquear_libreria_nostalgianet_reflection-t431216.0.html;msg2000454#msg2000454)
En el panel de
Reflexil, lo configuras para usar la sintaxis de VB.Net, posteriormente seleccionas todas las instrucciones IL de la class PhotoPartyUpload.PhotoBoothUpload.Registration, presionas click derecho y seleccionas la opción "
Replace all with code", seguidamente, reemplazas la class entera por el siguiente código modificado que te muestro aquí abajo, y compilas
usando la misma versión del compiler de .NetFx que hayan usado originálmente al desarrollar la dll.
Debo mencionar que obviamente no puedo verificar que no sea necesario realizar más modificaciones de las que hice, o ignorar alguna modificación, pues aparte de que con la dll que subiste no es suficiente ya que faltan referencias a otras classes de otros ensamblados de la aplicación los cuales no has compartido, además de eso me ha sido imposible descargar el trial de la app para testearlo, ya que al parecer te piden la VISA y demás para un miserable trial, es de locos, así que si tienes problemas en compilar este código entonces envíame el instalador completo del tal PBU por mensaje privado y veré que puedo hacer, pero en principio esto te podría servir cómo solución final:
Option Explicit On
Option Strict On
#Region " Imports "
Imports System
Imports System.Collections.Generic
Imports System.Text
#End Region
Namespace PhotoPartyUpload.PhotoBoothUpload.Registration
Class Registration
Function CheckRegistration() As PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationState
Return RegistrationState.Registered
End Function
#Region " Methods stubs "
Function get_LicenseData() As PhotoPartyUpload.PhotoBoothUpload.Registration.LicenseData
Return Nothing
End Function
Sub set_LicenseData(ByVal value As PhotoPartyUpload.PhotoBoothUpload.Registration.LicenseData)
End Sub
Function get_RemaningDaysTrial() As Integer
Return Integer.MaxValue
End Function
Function GetCurrentTime() As System.DateTime
Return DateTime.Now()
End Function
Function LoadLicenseData() As PhotoPartyUpload.PhotoBoothUpload.Registration.LicenseData
Return Nothing
End Function
Sub SaveLicenseData(ByVal regData As PhotoPartyUpload.PhotoBoothUpload.Registration.LicenseData)
End Sub
Function LoadRegistrationData() As PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationData
Return New RegistrationData
End Function
Sub SaveRegistrationData(ByVal regData As PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationData)
End Sub
Shared Function KeyGenerator(ByVal name As String, ByVal systemCode As String, ByVal expiryDate As System.DateTime, ByVal updatesExpiryDate As System.DateTime, ByVal isProVersion As Boolean) As String
Return String.Empty
End Function
Function DecodeLicense(ByVal name As String, ByVal systemCode As String, ByVal code As String) As PhotoPartyUpload.PhotoBoothUpload.Registration.LicenseData
Return Nothing
End Function
Sub SetCurrentTime(ByVal currentTime As System.DateTime)
End Sub
Function get_IsBasicLicense() As Boolean
Return False
End Function
Function get_IsDemoMode() As Boolean
Return False
End Function
Function get_IsProLicense() As Boolean
Return True
End Function
Function get_LicenseCode() As String
Return "2fa747e3-4604-46e5-9083-3d01aadb9499"
End Function
Shared Function GetSystemKey() As String
Return String.Empty
End Function
Shared Function GetSystemInfo() As String
Return String.Empty
End Function
Shared Function RunQuery(ByVal TableName As String, ByVal MethodName As String) As String
Return String.Empty
End Function
Sub New()
End Sub
Shared Sub New()
End Sub
#End Region
#Region " Fields stubs "
Dim Shared TrialDays As Integer = Integer.MaxValue
Dim Shared RegistrationSubKey As String = String.Empty
Dim Shared RegistrationSubKeyOld As String = String.Empty
Dim _registrationState As PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationState = RegistrationState.Registered
Dim _isProLicense As Boolean = True
Dim _licenseCode As String = "2fa747e3-4604-46e5-9083-3d01aadb9499"
Dim RegData As PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationData = New RegistrationData
Dim Shared RegistrationKey As String = "{76995B8C-ECAF-4A37-8AE7-D2CFD9B303A5}"
Dim Shared DataKey As String = "{C4D4B1C3-C9C9-4CFE-A70A-54358EE10109}"
Dim IsRegistrationDisabled As Boolean = False
' Dim <LicenseData>k__BackingField As PhotoPartyUpload.PhotoBoothUpload.Registration.LicenseData
#End Region
End Class
End Namespace
Saludos
Cita de: Ele?tro en 20 Septiembre 2015, 12:26 PM
No intentes modificar manualmente las instrucciones IL si no sabes hacerlo correctamente...
No es necesario más que eso, olvida el código IL.
Sólo quiero destacar que saber codear en IL equivale a ASM en x86 o x86-64. Es
imperativo en Ing. Inversa,
saber cómo funciona IL si vas a atacar programas hechos en .NET. En este caso se podría reemplazar todo con código ya que no hay packer. Pero generalmente no es así.
Cita de: Ele?tro en 20 Septiembre 2015, 12:26 PM
... me ha sido imposible descargar el trial de la app para testearlo, ya que al parecer te piden la VISA y demás para un miserable trial ...
La app la puedes descargar sin problemas desde el sitio. La verdad, el sitio está muy mal hecho (si te has fijado, piden los datos de tu tarjeta por HTTP). :P
El ejecutable lo puedes bajar entrando aqui (http://www.photoboothupload.com/activation) y haciendo click en el link de la opción 1 (http://laphotoparty.com/photoboothupload/photoboothupload/latestversion.php?action=download).
Saludos!
PD: El link de descarga salió usando FOCA... :xD
Cita de: MCKSys Argentina en 21 Septiembre 2015, 01:31 AMSólo quiero destacar que saber codear en IL equivale a ASM en x86 o x86-64. Es imperativo en Ing. Inversa, saber cómo funciona IL si vas a atacar programas hechos en .NET. En este caso se podría reemplazar todo con código ya que no hay packer. Pero generalmente no es así.
Por supuesto compañero, sin duda es un buen consejo, yo lo único que pretendía decirle es que si no sabe
IL mejor no lo intente por ese camino por que se meterá en un búcle
Trial and Error sin salida, el aprendizaje le llevaría meses y esto parece ser un problema esporádico que se puede resolver de la otra forma ya mencionada, la cual, en teoría le costaría menos entendimiento y aprendizaje en comparación, pues parece desenvolverse bien utilizando la sintaxis de VB.Net.
Cita de: MCKSys Argentina en 21 Septiembre 2015, 01:31 AMEl ejecutable lo puedes bajar entrando aqui (http://www.photoboothupload.com/activation) y haciendo click en el link de la opción 1 (http://laphotoparty.com/photoboothupload/photoboothupload/latestversion.php?action=download).
Vaya, gracias por la info, ahora puedo testearlo a ver. :)
EDITO: Confirmo que con la solución que expuse antes parece funcionar correctamente, el mensaje de aviso trial desaparece y lo reconoce cómo registrado.
(http://i.imgur.com/BYke1KD.png)
Aquí tienes la librería parcheada, prueba a ver:
http://www.mediafire.com/download/ip61tll45nt5sr2/PhotoBoothUploadLib.dll
[OFFTOPIC]
Recuerdo que hace tiempo me pidieron un trabajo freelance para controlar el comportamiento de esta app, uf, no la recordaba, ¡esta App tiene la UI más nefasta que he visto jamás!, realmente me asquea de principio a fin, empezando por el diseño.
Pero bueno, cómo se suele decir...
(http://img.desmotivaciones.es/201112/itsfree.jpg)
Qué disfrutes tu app gratuita :laugh:.
[/OFFTOPIC]
Saludos!
Hola Eleкtro, he visto este post de 2015 y he intentado descargar la ddl de mediafire pero veo que no esta disponible.
Podrías volver a subirla?
Me pierdo dentro de reflector la verdad.
Gracias
Cita de: adyctivo en 31 Julio 2017, 20:18 PM
Hola Eleкtro, he visto este post de 2015 y he intentado descargar la ddl de mediafire pero veo que no esta disponible.
Podrías volver a subirla?
No, lo siento, no conservo la librería, pero puedes intentar contactar con el autor de este hilo a ver si él todavía la conserva,
en su perfil de usuario hallarás su dirección e-mail...Cita de: adyctivo en 31 Julio 2017, 20:18 PM
Me pierdo dentro de reflector la verdad.
Comprendo que utilizar algo "nuevo" siempre se hace dificil hasta que se adquiere cierta práctica, pero por otro lado considero que compartí unas instrucciones bien facilitas... solo debes usar el plugin
Reflexil en el programa .
NET Reflector de
Redgate para reemplazar el código original por el que yo puse, y compilar con los cambios realizados :-/.
Saludos!
Ok, voy a probar y a intentar aprender a utilizarlo.
Gracias! ;-)