|
Mostrar Temas
|
Páginas: [1] 2 3 4 5 6 7
|
1
|
Programación / Ingeniería Inversa / Crackeando un programa [Consulta]
|
en: 21 Octubre 2014, 21:10 pm
|
Buenos días/tardes/noches a todos en el foro Soy algo nuevo en esto de la ingeniería inversa, así que pido disculpas si alguna afirmación no es correcta en lo que leerán a continuación xDDD He estado leyendo a Ricardo Navaja y bueno me lance a la aventura de intentar crackear un programa que necesito, por la información que he podido recopilar está escrito en Microsoft Visual C++ 2010, usa Qt para la GUI y está protegido con VM Protect v1.60 - v2.05 según ProtectionId, VM Protect 2.x + Simple UPX cryptor según RDG y VM Protect según DIS. Se que esta protección es una de las más fuertes para ejecutables escritos en C++, pero como todo, difícil pero no imposible; por lo que he buscado recomiendan usar OllyDbg junto con los plugins Phat0m y StrongOD para hacer frente a VM Protect, pues los he cargado al OllyDbg y configurado como se debe (o al menos así parece), el programa ya no detecta al OllyDbg explitamente enviandote el clásico MessageBox indicando que ha detectado un depurador pero se queda sin hacer nada y parece no desempaquetar nada porque aún no se pueden ver los strings ni el código del modulo principal en claro. De tal manera me fui por el Attach, con los plugins todo funciona bien pero colocar un breakpoint e intentar depurar hace que todo explote xD No me importo al principio, pues solo quería encontrar el salto condicional y parchearlo jajajajaja, analizando un poco más a fondo básicamente el programa genera un HWID, siguiendo las conexiones con Wireshark he visto que envía por POST los datos a un servidor que en pocas palabras contesta HTTP/OK y un número, siguiendo esa respuesta en el OllyDbg el número termina pasando por un switch, tal como este: Hay un case del switch para cada error posible (falla de conexión, prueba vencida, datos de conexión inválidos, etc), con su respectiva llamada al MessageBox de Qt para dar la información al usuario. Como no existe un case de éxito y está presente el default case he intentado saltar al default case de una vez pero no pasa nada, el programa se queda sin hacer nada, también he intentado saltar fuera del switch antes de entrar (esto hace que explote xD), imagino que por el estado de los registros. Llevo varios días pegado tratando de averiguar a donde salta o a quien llama cuando todo sale bien, si alguien me pudiese dar una luz, sobre como depurarlo sin que explote (hace falta desempaquetar?) o hacia donde termina yéndose esto, o cualquier otra cosa que ustedes crean que es lo correcto, estaría muy agradecido. Esta es la aplicación, es un bot de un juego, el enlace lo coloco desde mi Google Drive, para no poner directo el ejecutable desde la página del fabricante: https://drive.google.com/file/d/0B3_t7GvNr0xvZTNyaFZqeWkzMjQ/view?usp=sharingGracias por leer este testamento xD
|
|
|
2
|
Programación / .NET (C#, VB.NET, ASP) / GamesRec [Proyecto] [Grupo Completo] -- Sigue nuestro avances --
|
en: 1 Enero 2013, 19:15 pm
|
Buenos días/tardes/noches a todos en el foro... Suscribete a nuestra página web: http://gamesrec.net/iShots, Nombre removido por motivo de patentes, cambiado por GamesRec. Estamos en busca de personal experimentado en el área de aplicaciones cliente-servidor, multimedia y redes sociales, para un proyecto llamado " GamesRec" que consideramos una buena idea, específicamente buscamos lo siguiente: 1 Programador Java/PHP1 Programador .Net especializado en GDI+1 Diseñador WEB1 SEO ManagerConforman este proyecto ya: 1 Programador PHP3 Programadores .Net1 SEO Manager 1 Diseñador WEBA continuación, les doy una breve pero precisa descripción de que trata y los detalles básicos e importantes: Esta es la primera Imagen de como GamesRec va tomando forma, con un menú desplegable a un lado. GamesRec será una aplicación de escritorio para capturar imágenes y vídeos de alta calidad en momentos de juego, la aplicación permitirá compartir dichas imágenes a través de las redes sociales más conocidas Twitter y Facebook de manera automática mediante la asociación de cuentas a la aplicación haciendo uso de las API de las redes sociales mencionadas.El proyecto será de código cerrado, ya que se pretende su venta por precios bajos a plazos cortos o una cantidad aceptable por licencias vitalicias, a fin de enfrentar la competencia en el campo con el doble de calidad a la mitad del precio. Las ganancias individuales serán equitativas entre los miembros del proyecto, contamos con 500Mb de espacio en nuestro servidor y una conexión de 10Mbps, que serán extensibles mientras el proyecto avance. GamesRec se caracterizara por lo siguiente: - Diseño minimalista y simple pero potente.
- La complejidad de la UI déjensela a los programadores en el código, el usuario debe tener todo a la mano de la manera más sencilla posible.
- El diseño debe estar a la vanguardia como una de las características principales de la aplicación sin desechar la potencia.
El Framework destino es 4.0 el método de comunicación será Skype y TeamViewer, el desarrollo será modular y por clases, de manera que las tareas se puedan repartir con homogeneidad según el dominio de cada participante, muchos más detalles de gran interés podremos compartir contigo cuando estés de nuestro lado.
Gracias por leer y me despido esperando sus comentarios, opiniones, dudas o criticas
|
|
|
3
|
Programación / .NET (C#, VB.NET, ASP) / Fondo Blur GDI+ [Aporte]
|
en: 18 Noviembre 2012, 03:10 am
|
El Visual Studio es excelente para el diseño a falta de potencia, entonces si tenemos esta herramienta pues explotemosla Aquí le dejo un modulo que quizá a alguien le pueda servir, crea un Form cuyo BackGroundImage es un ScreenShot con el efecto Blur se muestra con control de opacidad de una manera muy visual, esto sirve si queremos llamar la atención del usuario a nuestra aplicación más o menos lo que hace el UAC cuando nos da una advertencia pero con Blur, es un código sencillo que puede resaltar el detalle del diseño en cualquier aplicación... El BlurForce mientras más alto más desenfoca pero tarda más en aplicar el efecto, se recomiendan valores del 1 al 5, por defecto es 2, la función tiene por defecto 1. Speed define la velocidad para pasar la opacidad del Form de 0 a 1 y viceversa, por defecto es 0.025/1 ms. Coloque la función Blur a parte para que se pudiese detallar su funcionamiento. El Sub BlurBitmap proviene de: http://vbdotnetpower.blogspot.com/2011/06/image-effect-bluring.htmlModule BlurBackground Private WithEvents Background As New Form With {.Bounds = SystemInformation.VirtualScreen, _ .StartPosition = FormStartPosition.Manual, _ .TopMost = True, _ .Opacity = 0, _ .BackgroundImageLayout = ImageLayout.None, _ .FormBorderStyle = FormBorderStyle.None, _ .BackgroundImage = Nothing, _ .ShowIcon = False, _ .ShowInTaskbar = False} Private WithEvents Timer As New Timer With {.Enabled = False, .Interval = 1} Public Speed As Double Private Sub BlurBitmap(ByRef Image As Bitmap, Optional ByVal BlurForce As Integer = 1) Dim _ Graph As Graphics = Graphics.FromImage(Image), _ ImgAtt As New ImageAttributes, _ Matrix As New ColorMatrix Matrix.Matrix33 = 0.5F ImgAtt.SetColorMatrix(Matrix) For x As Integer = -BlurForce To BlurForce For y As Integer = -BlurForce To BlurForce Graph.DrawImage(Image, New Rectangle(x, y, _ Image.Width, _ Image.Height), _ 0, 0, Image.Width, _ Image.Height, _ GraphicsUnit.Pixel, ImgAtt) Next Next ImgAtt.Dispose() Graph.Dispose() End Sub Public Sub ShowBackground() If Background.BackgroundImage IsNot Nothing Then Background.BackgroundImage.Dispose() End If Dim BlurBack As New Bitmap(SystemInformation.VirtualScreen.Width, _ SystemInformation.VirtualScreen.Height) Dim BlurGraph As Graphics = Graphics.FromImage(BlurBack) BlurGraph.CopyFromScreen(0, 0, 0, 0, SystemInformation.VirtualScreen.Size) BlurBitmap(BlurBack, 2) BlurGraph.Dispose() Background.BackgroundImage = BlurBack If Not Timer.Enabled And Not Background.Visible Then Background.Show() Speed = 0.025 Timer.Start() End If End Sub Public Sub HideBackground() If Not Timer.Enabled And Background.Visible Then Speed = -0.025 Timer.Start() End If End Sub Private Sub Timer_Tick(ByVal sender As Timer, ByVal e As System.EventArgs) Handles Timer.Tick Select Case Background.Opacity + Speed Case Is > 1 Timer.Stop() Exit Sub Case Is < 0 Timer.Stop() Background.Hide() End Select Background.Opacity += Speed End Sub 'Solo por seguridad para cerrar el Form con un click' Private Sub Background_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Background.Click HideBackground() End Sub End Module
|
|
|
4
|
Programación / .NET (C#, VB.NET, ASP) / Captcha v3.0
|
en: 3 Julio 2012, 04:27 am
|
Siempre recuerdo este proyecto y le agrego algo nuevo además de mejorar la velocidad, el código también muestra mucho la parte de como Graphics puede controlar al 100% una imagen, al nivel de poder hacer lo que quieras. Aquí están las versiones 1, 2 y 3 para que se note la diferencia ¿Que es lo nuevo?- Las lineas que interceptaban las letras ahora son curvas
- Las letras ahora aparecen movidas y manchadas
- La mortal mancha, para los OCR, que invierte el color en ReCaptcha, ahora esta en este proyecto
|
|
|
5
|
Programación / .NET (C#, VB.NET, ASP) / DeflateStream - Extraña Perdida de Datos
|
en: 23 Junio 2012, 21:30 pm
|
Estoy diseñando una clase que guarda información en un archivo y utiliza DeflateStream como método de compresión, no hay casi información de como comprimir datos en forma de Bytes(), hay mucha documentación de ir directamente al trabajo con archivos, entonces diseñe esta función que al parecer funciona correctamente, pero se pierden algunos Bytes del final de la información comprimida y no encuentro el error por ningún lado, quizás es mal uso de DeflateStream. Para probar la perdida de los datos hice esta prueba: Imports System.IO, System.IO.Compression, System.Text, System.Security.Cryptography Module Module1 #Region " Algoritmo de DeCompresión Deflate " Public Function DeflateDeCompress(ByVal Data As Byte(), _ ByVal Action As CompressionMode) As Byte() DeflateDeCompress = Nothing Dim ResultStream As MemoryStream = Nothing Dim DeCompresser As DeflateStream = Nothing Dim A As Integer, B As New List(Of Byte) Try If Action = CompressionMode.Compress Then ResultStream = New MemoryStream DeCompresser = New DeflateStream(ResultStream, CompressionMode.Compress) DeCompresser.Write(Data, 0, Data.Length) ResultStream.Position = 0 DeflateDeCompress = ResultStream.ToArray Else ResultStream = New MemoryStream(Data) ResultStream.Position = 0 DeCompresser = New DeflateStream(ResultStream, CompressionMode.Decompress) DeflateDeCompress = New Byte() {} DeCompresser.ReadByte() : A = DeCompresser.ReadByte While A <> -1 B.Add(CByte(A)) A = DeCompresser.ReadByte End While DeflateDeCompress = B.ToArray : B.Clear() End If If DeCompresser IsNot Nothing Then DeCompresser.Dispose() End If If ResultStream IsNot Nothing Then ResultStream.Dispose() End If Catch ex As Exception Return Nothing End Try End Function #End Region Public Function MD5_String(ByVal Data As Byte()) As String Return BitConverter.ToString(MD5.Create.ComputeHash(Data)).Replace("-", "").ToLower End Function Sub Main() Dim x As String = "C:\ejemplo.txt" Dim y As Byte() = File. ReadAllBytes(x ) Dim z As Byte() = DeflateDeCompress(y, CompressionMode.Compress) Dim a As Byte() = DeflateDeCompress(z, CompressionMode.Decompress) Console.WriteLine("Archivo de Entrada: {0}", x) Console.WriteLine("Tamaño de Entrada: {0} bytes", y.Length) Console.WriteLine("MD5-{0}", MD5_String(y)) Console.WriteLine() Console.WriteLine("Tamaño Comprimido: {0} bytes ({1}%)", z.Length, Math.Round(z.Length / y.Length * 100 - 100, 2)) Console.WriteLine("MD5-{0}", MD5_String(z)) Console.WriteLine() Console.WriteLine("Tamaño Descomprimido: {0} bytes", a.Length) Console.WriteLine("MD5-{0}", MD5_String(a)) Console.WriteLine() Console.WriteLine("Perdida de {0} bytes", y.Length - a.Length) Erase y, z, a Console.Read() End Sub End Module
Gracias de antemano
|
|
|
6
|
Programación / Ingeniería Inversa / CrackMe v4.5 [Reto]
|
en: 11 Marzo 2012, 02:24 am
|
Yo estoy en desarrollo en un proyecto de un ofuscador que dejo cada 1 mes y luego sigo cuando pierdo la frustración En Reparación La única pista que les daré es que use otro programa además de mi ofuscador por sobre el ejecutable. Es el mismo CrackMe con 2 protecciones distintas: Nro. 1 http://speedy.sh/y8gFz/CrackMe-1.rarNro. 2 http://speedy.sh/Bqjpu/CrackMe-2.rarEl CrackMe se considera resuelto cuando logren obtener una licencia comercial. Son libres de publicar como lo solucionaron. Me gustaría su opinión de cual protección les pareció mas compleja.
|
|
|
7
|
Programación / .NET (C#, VB.NET, ASP) / Delegados Generales [Aporte]
|
en: 19 Febrero 2012, 22:59 pm
|
Hace mucho tiempo que no publico nada, y la razón es que estoy superocupado Pero les traigo un aporte que seguro les servirá a muchos, cuando hice una aplicación que usaba Threads, y me di cuenta que no podía acceder a los controles, además eran demasiados controles, y propiedades para hacer un sub/function delegada para cada una de las propiedades de cada uno de los controles, lo resolví así: #Region " Delegados " Public Delegate Sub SetProperty_Delegate( _ ByVal ObjectControl As Control, _ ByVal ObjectName As String, _ ByVal ObjectValue As Object) Public Sub SetProperty( _ ByVal ObjectControl As Control, _ ByVal ObjectName As String, _ ByVal ObjectValue As Object) If ObjectControl.InvokeRequired Then ObjectControl.Invoke(New SetProperty_Delegate(AddressOf SetProperty), _ New Object() {ObjectControl, ObjectName, ObjectValue}) Else ObjectControl.GetType.GetProperty(ObjectName).SetValue( _ ObjectControl, _ ObjectValue, _ Nothing) End If End Sub Public Delegate Function GetProperty_Delegate( _ ByVal ObjectControl As Control, _ ByVal ObjectName As String) As Object Public Function GetProperty(ByVal ObjectControl As Control, _ ByVal ObjectName As String) As Object If ObjectControl.InvokeRequired Then Return ObjectControl.Invoke(New GetProperty_Delegate(AddressOf GetProperty), _ New Object() {ObjectControl, ObjectName}) Else Return ObjectControl.GetType.GetProperty(ObjectName).GetValue( _ ObjectControl, _ Nothing) End If End Function Public Delegate Function CallMethod_Delegate( _ ByVal ObjectControl As Control, _ ByVal ObjectName As String, _ ByVal ObjectParams As Object(), _ ByVal ObjectParamsType As Type()) As Object Public Function CallMethod( _ ByVal ObjectControl As Control, _ ByVal ObjectName As String, _ Optional ByVal ObjectParams As Object() = Nothing, _ Optional ByVal ObjectParamsType As Type() = Nothing) As Object If ObjectParams Is Nothing Then ObjectParams = New Object() {} End If If ObjectControl.InvokeRequired Then Return ObjectControl.Invoke(New CallMethod_Delegate(AddressOf CallMethod), _ New Object() {ObjectControl, ObjectName, ObjectParams, ObjectParamsType}) Else If ObjectParamsType Is Nothing Then Return ObjectControl.GetType.GetMethod(ObjectName).Invoke( _ ObjectControl, _ ObjectParams) Else Return ObjectControl.GetType.GetMethod(ObjectName, ObjectParamsType).Invoke( _ ObjectControl, _ ObjectParams) End If End If End Function #End Region
Establece, obtiene y llama propiedades y métodos de forma segura, solo por el nombre. Algunos ejemplos, de como se usa: SetProperty(Me, "Text", "Código Seguro") 'Establece la propiedad Text en Me GetProperty(Me, "Size") 'Obtiene el Size de Me CalMethod(Me, "Focus", New Object(){}, New Type(){}) 'Llama el sub Focus de Me
CallMethod se llama, pasando el objeto del control, seguido del nombre del método a llamar, un array de object con contiene los parámetros, y un array de Type que contiene los tipos correspondientes para la lista de parámetros, para seleccionar el método correcto en caso de una sobrecarga.
|
|
|
8
|
Programación / .NET (C#, VB.NET, ASP) / Captcha v2.1 [Update]
|
en: 22 Diciembre 2011, 01:17 am
|
Bueno el Captcha v1.0 se quedo en pañales Los cambios fueron: - Las letras ahora pueden chocar entre sí
- La tipografía, el grosor y el estilo de cada letra es distinto
- Las lineas horizontales que antes estaban en cada letra ahora ocupan la imagen completamente
- Algunas letras pueden salirse de los limites pero seguirán entendiéndose
El cambio más radical fue la fórmula que separa las letras y les da el tamaño adecuado, ahora se toma en cuenta el ángulo, un poco de pitagoras y trigonometría fue necesario
|
|
|
9
|
Programación / .NET (C#, VB.NET, ASP) / Captcha [Aporte]
|
en: 10 Noviembre 2011, 03:55 am
|
Necesitaba un Captcha para un proyecto que llevo en marcha y decidí hacer una clase 'Captcha' yo mismo les dejo una imagen y un proyecto ejemplo, espero que a alguien le sirva
|
|
|
10
|
Programación / .NET (C#, VB.NET, ASP) / Clase que Captura el Inicio y Cierre de Procesos [Aporte] [WMI]
|
en: 28 Septiembre 2011, 22:20 pm
|
Bueno decidí compartir este código lo acabo de hacer sirve para capturar los procesos que se han iniciado y los que se han terminado, me parece bastante útil, utiliza como base WMI solo que en la clase está mucho más administrado y más cómodo de utilizar. Deben liberar el objeto con .Dispose cuando vayan a cerrar la aplicación que use la clase o lanza un error. Public Class ProcessWatcher Partial Class StoppedProcess Public Sub New(ByVal PropertiesDictionary As Dictionary(Of String, Object)) Dim AllFlags As BindingFlags = &H107FF7F Dim Field As FieldInfo = Nothing For Each FieldProperty As KeyValuePair(Of String, Object) In PropertiesDictionary Field = Me.GetType.GetField("_" & FieldProperty.Key, AllFlags) If Field IsNot Nothing Then Field.SetValue(Me, FieldProperty.Value) End If Next End Sub #Region " Properties " Private _ProcessName As String Public ReadOnly Property ProcessName() As String Get Return _ProcessName End Get End Property Private _ProcessID As UInteger Public ReadOnly Property Id() As UInteger Get Return _ProcessID End Get End Property Private _ParentProcessID As UInteger Public ReadOnly Property ParentProcessId() As UInteger Get Return _ParentProcessID End Get End Property Private _ExitStatus As UInteger Public ReadOnly Property ExitCode() As UInteger Get Return _ExitStatus Process.GetCurrentProcess() End Get End Property Private _SessionID As UInteger Public ReadOnly Property SessionId() As UInteger Get Return _SessionID End Get End Property #End Region End Class Public Event Started(ByVal e As Process) Public Event Stopped(ByVal e As StoppedProcess) Private ProcessQueryEvent_Start As WqlEventQuery Private ProcessWatcher_Start As ManagementEventWatcher Private ProcessQueryEvent_Stop As WqlEventQuery Private ProcessWatcher_Stop As ManagementEventWatcher Private WatcherEnabled As Boolean = False Public Sub New(Optional ByVal AutoStart As Boolean = True, _ Optional ByVal SetAsFalseCheckForIllegalCrossThreadCalls As Boolean = False, _ Optional ByVal Frequency As Double = 1000) ProcessQueryEvent_Start = New WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace") ProcessWatcher_Start = New ManagementEventWatcher(ProcessQueryEvent_Start) ProcessQueryEvent_Stop = New WqlEventQuery("SELECT * FROM Win32_ProcessStopTrace") ProcessWatcher_Stop = New ManagementEventWatcher(ProcessQueryEvent_Stop) AddHandler ProcessWatcher_Start.EventArrived, AddressOf StartEvent AddHandler ProcessWatcher_Stop.EventArrived, AddressOf StopEvent ProcessQueryEvent_Start.WithinInterval = TimeSpan.FromMilliseconds(Frequency) ProcessQueryEvent_Stop.WithinInterval = TimeSpan.FromMilliseconds(Frequency) Control.CheckForIllegalCrossThreadCalls = Not SetAsFalseCheckForIllegalCrossThreadCalls If AutoStart Then Enabled = True End If End Sub Private Sub StopEvent(ByVal sender As Object, ByVal e As EventArrivedEventArgs) Dim RawDictionary As New Dictionary(Of String, Object) For Each ProcessProperty As PropertyData In e.NewEvent.Properties If Not ProcessProperty.IsArray Then RawDictionary.Add(ProcessProperty.Name, e.NewEvent(ProcessProperty.Name)) End If Next RaiseEvent Stopped(New StoppedProcess(RawDictionary)) End Sub Private Sub StartEvent(ByVal sender As Object, ByVal e As EventArrivedEventArgs) RaiseEvent Started(Process.GetProcessById(e.NewEvent("ProcessID"))) End Sub Public Property Frequency() As Double Get Return ProcessQueryEvent_Start.WithinInterval.TotalMilliseconds End Get Set(ByVal value As Double) If value < 0 Then Throw New ArgumentException("value") Else ProcessQueryEvent_Start.WithinInterval = TimeSpan.FromMilliseconds(value) ProcessQueryEvent_Stop.WithinInterval = TimeSpan.FromMilliseconds(value) End If End Set End Property Public Property Enabled() As Boolean Get Return WatcherEnabled End Get Set(ByVal value As Boolean) If WatcherEnabled Then ProcessWatcher_Start.Stop() ProcessWatcher_Stop.Stop() Else ProcessWatcher_Start.Start() ProcessWatcher_Stop.Start() End If WatcherEnabled = Not WatcherEnabled End Set End Property Public Sub Dispose() If Enabled Then ProcessWatcher_Start.Stop() ProcessWatcher_Stop.Stop() End If ProcessWatcher_Start.Dispose() ProcessWatcher_Stop.Dispose() End Sub End Class
Un poco largo el código Los parametros del constructor son: AutoStart, Boolean, True para iniciar automáticamente con la construcción y False para iniciar después mediante la propiedad Enabled. SetAsFalseCheckForIllegalCrossThreadCalls, Boolean, True para desactivar la detección de llamadas de controles fuera del MainThread y false para activar. Frequency, Double, el intervalo en milisegundos en cuál se va a chequear.
|
|
|
|
|
|
|