elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Descompilar / Desensamblar programa .NET
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Descompilar / Desensamblar programa .NET  (Leído 5,676 veces)
angel9484

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Descompilar / Desensamblar programa .NET
« en: 16 Noviembre 2010, 15:50 pm »

Buenas tardes,
Se que puede parecer el tipico hilo donde pido que alguien me haga entero el trabajo o que me ayude a crackear un programa desconocido, pero quiero dar a entender que no es así.
El programa en cuestión, es un programa en el que uno pone una clave de licencia, genera un código, que tu tienes que mandar a la empresa, y este te devuelve un codigo de retorno.
La empresa en cuestión se ha ido al carajo, así que no existe y no se puede usar más que en los pc's que ya está instalado.
Habian 3 ordenadores, pero resulta que en uno cambiamos el disco duro, clonamos el sistema, y al ejecutar el programa resultó que no funcionaba asi que descompilandolo con .NET Reflector vi que el codigo que se generaba tomaba el num de serie del disco duro como parte para generar el código.
Todos los códigos se almacenan en el registro de Windows, pero antes de mirar ahi comprueba que concuerda, así que transportando las claves símplemente, no vale.
Mi gran problema, es que he podido descompilarlo (no es muy dificil con el .NET Reflector), intento coger los cachos que me son de utilidad de código para que me devuelva el código de retorno, pero el primer problema es que hay una linea:
            buffer(i) = CByte(valor.Chars(i))
que luego en Visual Studio 2005 me dice que eso no puede ser, y tengo que usar Val o AsciW si no recuerdo mal, para hacer ese "casting".
Lo hago y bueno, sale un código y tal, lo pongo y no es el bueno, así que hice una traza, y dependiendo de qué funcion ponga (Val o AsciW), me devuelve un valor u otro, asi que me da por pensar que el programa por dentro, haciendo la linea esa, tambien me devuelve algo diferente, y por eso no soy capaz de averiguar la clave.

¿Sabeis que puede pasar o que puedo hacer para resolver esto?
No sé si me he equivocado de subforo, como no he visto algo de "cracking" concretamente puesto he ido al lenguaje en el que aparentemente está escrito el programa.
Puedo aportar todas las funciones y procedimientos que se encargan de generar el código, pero el programa en sí no puedo ya que se comunica con un servidor para generar estadísticas y comprometería la seguridad de mi empresa.

muchas gracias, y espero que alguien pueda ayudarme!


En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: Descompilar / Desensamblar programa .NET
« Respuesta #1 en: 16 Noviembre 2010, 16:12 pm »

Esto deberia ir a la sección de .net

Y para

buffer(i) = CByte(valor.Chars(i))

tenes Byte.Parse o Convert.ToByte :)


En línea

angel9484

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Descompilar / Desensamblar programa .NET
« Respuesta #2 en: 25 Noviembre 2010, 18:41 pm »

Buenas, siento haber tardado tantisimo en contestar... pero la uni no perdona.
EDITO: Despues de darle algunas vueltas, habia pensado en descompilar el .exe y cambiarle diréctamente desde el ensamblador la parte en la que controla el registro, y saltarme directamente la clave, o que imprima la clave en el registro en lugar de buscarlo, y se autoregistre, pero soy incapacisimo de encontrar un programa para hacerlo o en el caso de ollydbg, de hacer algo a derechas (el debug produce excepciones despues de llamar a sitios tan dispares como kernel o win32, jamas consigo que me saque el codigo de mi "discoverymail.exe"
No me funcionó el Parse ni el ToByte.
Hay un método que llama a un método de un objeto creado de la clase MD5 (ComputeHash) y le da, supuestamente, lo que mete buffer(i) = CByte(valor.Chars(i))
valor es una cadena que es como el código a darle a la "empresa" (que vuelvo a anticipar que ya no existe).
Estoy casi seguro de que es este método es el que lo lía todo, y no se si es que usa versiones anteriores/posteriores del framework .net y por eso esa linea en la compilacion de su momento era valida.

Como hice un codigo para hacer la traza de lo que iba haciendo para hallar el codigo de retorno (luego al verlo ineficaz busque que hiciese el mismo codigo que esto me retorna, sin exito), puedo pegarlo aquí sin comprometer a la empresa:

Código del fichero principal
Código
  1. Imports System.Security.Cryptography
  2. Imports Microsoft.Win32
  3.  
  4. Public Class Form1
  5.    Shared idCompany As String = "30E35072EG3A"
  6.    Shared clave As String = "5GD72G5E9GE9"
  7.  
  8.    Public Function GetDiscoveryMailConfigKey() As RegistryKey
  9.        Dim key As RegistryKey
  10.        Try
  11.            key = Registry.LocalMachine.OpenSubKey("Software").OpenSubKey("DiscoveryMail", True)
  12.            If (key Is Nothing) Then
  13.                key = Registry.LocalMachine.OpenSubKey("Software", True).CreateSubKey("DiscoveryMail")
  14.            End If
  15.        Catch obj As System.Exception
  16.            Return Nothing
  17.        End Try
  18.        Return key
  19.    End Function
  20.  
  21.  
  22.    Public Function GetCompany() As String
  23.        If (idCompany <> "") Then
  24.            Return idCompany
  25.        End If
  26.        Dim discoveryMailConfigKey As RegistryKey = Me.GetDiscoveryMailConfigKey
  27.        If (discoveryMailConfigKey Is Nothing) Then
  28.            MessageBox.Show("Error al acceder al registro. Compruebe que tenga permisos suficientes.")
  29.            Return ""
  30.        End If
  31.        If (Not discoveryMailConfigKey.GetValue("CompanyId") Is Nothing) Then
  32.            idCompany = CStr(discoveryMailConfigKey.GetValue("CompanyId"))
  33.            Return idCompany
  34.        End If
  35.        Return Me.SetCompanyId
  36.    End Function
  37.    Public Function SetCompanyId() As String
  38.        Dim discoveryMailConfigKey As RegistryKey = Me.GetDiscoveryMailConfigKey
  39.        If (discoveryMailConfigKey Is Nothing) Then
  40.            MessageBox.Show("Error al acceder al registro")
  41.            Return ""
  42.        End If
  43.        discoveryMailConfigKey.SetValue("CompanyId", idCompany)
  44.        Return idCompany
  45.    End Function
  46.  
  47.    Public Function GetLicenseQuestion() As String
  48.        Dim serial As New HardDriveSerial
  49.        Return Me.md5((Me.GetCompany & "DiscoveryMail" & serial.Serial), 12)
  50.    End Function
  51.  
  52.    Private Function toHex(ByVal a As Integer) As String
  53.        If (a < 10) Then
  54.            Return Convert.ToString(a)
  55.        End If
  56.        Select Case a
  57.            Case 10
  58.                Return "A"
  59.            Case 11
  60.                Return "B"
  61.            Case 12
  62.                Return "C"
  63.            Case 13
  64.                Return "D"
  65.            Case 14
  66.                Return "E"
  67.        End Select
  68.        Return "F"
  69.    End Function
  70.  
  71.  
  72.    Public Function CheckIsValidLicense(ByVal license As String) As Boolean
  73.        MessageBox.Show(Me.md5(("47619549" & Me.GetLicenseQuestion & "DiscoveryMail"), 12))
  74.        Return (Me.md5(("47619549" & Me.GetLicenseQuestion & "DiscoveryMail"), 12) = license)
  75.    End Function
  76.    Public Function md5(ByVal valor As String) As String
  77.        Return Me.md5(valor, 0)
  78.    End Function
  79.    Public Function md5(ByVal valor As String, ByVal length As Integer) As String
  80.        Dim md As MD5 = New MD5CryptoServiceProvider
  81.        Dim buffer As Byte() = New Byte(valor.Length - 1) {}
  82.        Dim i As Integer
  83.        For i = 0 To valor.Length - 1
  84.            'buffer(i) = CByte(valor.Chars(i))                      El original
  85.            buffer(i) = CByte(AscW(valor.Chars(i)))                'El más adaptado al código
  86.            'buffer(i) = CByte(Byte.Parse(valor.Chars(i)))          Lo del foro
  87.        Next i
  88.        Dim buffer2 As Byte() = md.ComputeHash(buffer)
  89.        Dim text As String = ""
  90.        Dim j As Integer
  91.        For j = 0 To buffer2.Length - 1
  92.            Dim num2 As Integer = buffer2(j)
  93.            Dim a As Integer = (num2 Mod &H10)
  94.            Dim num3 As Integer = (num2 / &H10)
  95.            text = (text & Me.toHex(a) & Me.toHex(num3))
  96.        Next j
  97.        If (text.Length > 0) Then
  98.            text = Me.reduceText(text, 12)
  99.        End If
  100.        Return text
  101.    End Function
  102.  
  103.    Private Function reduceText(ByVal text As String, ByVal length As Integer) As String
  104.        Dim str As String = "0KAL1MBN2OCP3QDR4SET5UFV6WGX7YHZ8I9J"
  105.        Dim num4 As Integer = 0
  106.        Do While (text.Length > length)
  107.            Dim ch As Char = text.Chars((text.Length - 1))
  108.            text = text.Substring(0, (text.Length - 1))
  109.            Dim ch2 As Char = text.Chars(num4)
  110.            Dim index As Integer = str.IndexOf(ch2)
  111.            Dim num2 As Integer = str.IndexOf(ch)
  112.            Dim num3 As Integer = ((index + num2) Mod str.Length)
  113.            text = (text.Substring(0, num4) & str.Chars(num3) & text.Substring((num4 + 1), ((text.Length - num4) - 1)))
  114.            num4 += 1
  115.            If (num4 > length) Then
  116.                num4 = 0
  117.            End If
  118.        Loop
  119.        Return text
  120.    End Function
  121.  
  122.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAccept.Click
  123.        If (Me.txtLicencia.Text.Length = 12) Then
  124.            If Me.CheckIsValidLicense(Me.txtLicencia.Text) Then
  125.                Me.btnAccept.Enabled = True
  126.            Else
  127.                Me.btnAccept.Enabled = False
  128.            End If
  129.        End If
  130.    End Sub
  131.  
  132.    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  133.        'Me.CheckIsValidLicense(Me.txtLicencia.Text)
  134.        MessageBox.Show(GetLicenseQuestion())
  135.        Me.Dispose()
  136.    End Sub
  137. End Class
  138.  
codigo es lo que estoy intentando sacar en el messagebox
Serial es esto:
Código
  1. Imports System.Management
  2. Friend Class HardDriveSerial
  3.    ' Methods
  4.    Public Function Serial() As String
  5.        Dim list As New ArrayList
  6.        'Dim coge As String = "None"
  7.        Dim searcher As New ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive")
  8.        Dim obj2 As ManagementObject
  9.        For Each obj2 In searcher.Get
  10.            Dim drive As New HardDrive
  11.            drive.Model = obj2.Item("Model").ToString
  12.            drive.Type = obj2.Item("InterfaceType").ToString
  13.            'coge = obj2.Item("Signature").ToString()
  14.            list.Add(drive)
  15.        Next
  16.        searcher = New ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia")
  17.        Dim num As Integer = 0
  18.        Dim obj3 As ManagementObject
  19.        For Each obj3 In searcher.Get
  20.            Dim drive2 As HardDrive = DirectCast(list.Item(num), HardDrive)
  21.            If (obj3.Item("SerialNumber") Is Nothing) Then
  22.                drive2.SerialNo = "None"
  23.                'drive2.SerialNo = coge
  24.            Else
  25.                drive2.SerialNo = obj3.Item("SerialNumber").ToString
  26.            End If
  27.            num += 1
  28.        Next
  29.        If (list.Count > 0) Then
  30.            Return DirectCast(list.Item(0), HardDrive).SerialNo
  31.        End If
  32.        Return "NoDisc"
  33.    End Function
  34.  
  35. End Class
Los comentarios evidentemente son mios,estaba sacando el numero de serie del disco duro de una forma alternativa a ver si era eso, pero ni sacandolo con Signature lo hace bien, luego probé con otro programa que lo saca tambien con WMI y tanto en este como ese programa externo ponia "None" asi que descarté este problema.

Y este es HardDrive
Código
  1. Friend Class HardDrive
  2.    ' Properties
  3.    Public Property Model() As String
  4.        Get
  5.            Return Me.model2
  6.        End Get
  7.        Set(ByVal value As String)
  8.            Me.model2 = value
  9.        End Set
  10.    End Property
  11.  
  12.    Public Property SerialNo() As String
  13.        Get
  14.            Return Me.serialNo2
  15.        End Get
  16.        Set(ByVal value As String)
  17.            Me.serialNo2 = value
  18.        End Set
  19.    End Property
  20.  
  21.    Public Property Type() As String
  22.        Get
  23.            Return Me.type2
  24.        End Get
  25.        Set(ByVal value As String)
  26.            Me.type2 = value
  27.        End Set
  28.    End Property
  29.  
  30.  
  31.    ' Fields
  32.    Private model2 As String
  33.    Private serialNo2 As String
  34.    Private type2 As String
  35. End Class
  36.  
  37.  
  38.  
Modifiqué las variables privadas y los Me.---- con ese 2 que se ve porque me decia algo de noseque recursivo, pero esta comprobado que pone y devuelve los valores bien

¿Algúna idea?

« Última modificación: 25 Noviembre 2010, 18:44 pm por angel9484 » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines