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

 

 


Tema destacado: Estamos en la red social de Mastodon


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

Desconectado Desconectado

Mensajes: 25


Ver Perfil
Editar Memoria
« en: 24 Marzo 2011, 20:40 pm »

Hola a todos, cree un proxy para un juego online (Argentum) y para poder interceptar los datos que envían y reciben los winsocks (cliente y servidor) debo cambiar la ip del juego que está en el cliente (190.224.163.62) por 127.0.0.1 y lo hago con el editor hex del Cheat Engine 6.0

Lo que yo busco es no tener que abrir el cheat engnie y cambiar estos valores cada vez que inicio el juego y que lo haga directamente... sería mucho mas fácil hacerlo en c, una librería y listo pero bueno, lo quiero hacer desde visual basci  :xD

Tengo una módulo que "CREO" que realiza esta acción, lo dejo por si ayuda a alguno
Código
  1. Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFF
  2. Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
  3. Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
  4. Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
  5. Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  6. Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal Classname As String, ByVal WindowName As String) As Long
  7.  
  8. Public Function WriteLocalhost(Offset As Long, WindowName As String, Value As Currency) As Currency
  9.  
  10.    Dim hWnd As Long
  11.    Dim ProcessID As Long
  12.    Dim ProcessHandle As Long
  13.  
  14.    hWnd = FindWindow(vbNullString, WindowName)
  15.  
  16.    If hWnd = 0 Then
  17.  
  18.            MsgBox "No encontré el Argentum", vbCritical, ""
  19.  
  20.            Exit Function
  21.    End If
  22.  
  23.    GetWindowThreadProcessId hWnd, ProcessID
  24.  
  25.    ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, False, ProcessID)
  26.  
  27.    If ProcessHandle = 0 Then
  28.  
  29.        Exit Function
  30.  
  31.    End If
  32.  
  33.    WriteProcessMemory ProcessHandle, Offset, Value, 8, 0&
  34.  
  35.    CloseHandle ProcessHandle
  36.  
  37. End Function
  38.  

Esto es el original:


Así debería quedar:


Si me podrían ayudar a entender el código o explicarme algún metodo para finalizar mi proxy bienvenido sea :$ .. Un saludo !!


En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: Editar Memoria
« Respuesta #1 en: 24 Marzo 2011, 21:19 pm »

Y .. deberia funcionar, el tema es encontrar el Offset, y parcharlo :P

Como lo haces desde el CheatEngine? A mano o usas el buscar?


En línea

Dunkansdk

Desconectado Desconectado

Mensajes: 25


Ver Perfil
Re: Editar Memoria
« Respuesta #2 en: 24 Marzo 2011, 21:34 pm »

Busco la ip en UNICODE . Como hago para encontrar ese offset? ..
« Última modificación: 24 Marzo 2011, 21:44 pm por Dunkansdk » En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: Editar Memoria
« Respuesta #3 en: 24 Marzo 2011, 22:24 pm »

No hay otra que leer poco a poco :D
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Editar Memoria
« Respuesta #4 en: 25 Marzo 2011, 07:51 am »

lo mejor seria un Hook a los Sockets y cambiar asi los paquetes, ya que cualquier cambio en la memoria de los juegos si es erronea puede crashearlo y otra cosa erronea seria que encontraras la IP o DNS y no sea la adecuada yo optaria por un hook al api... por hay ya alguien publico algo para ahcerlo a los socket's.

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
DaasCook

Desconectado Desconectado

Mensajes: 53


Maximum Trolling!


Ver Perfil
Re: Editar Memoria
« Respuesta #5 en: 25 Marzo 2011, 16:11 pm »

El Cheat Engine no tiene ningún editor hexadecimal, lo que si tiene es un visor de memoria, donde, cómodamente visualizas los bytes de X bloque de memoria. Que puedas editarlos a parte, no le da el papel de editor hexadecimal, eso déjaselo a Hex Edit, etc...

A ver, antes de ponerte a buscar offset's y demás, deberías fijarte si tu dirección es estática o dinámica... Intenta guardar la dirección de memoria donde apunta a tal IP, cierra y abre el juego, y revisa si la dirección de memoria aún guarda la dirección donde se mantiene el IP.

Si es así, pues tenéis medio trabajo hecho, tu address es estático (a simple vista) y nada más tendrías que liarte con modificarle, cosa no muy dificil si de C/C++ hablamos.

Un básico ejemplo sería el siguiente (no es muy complejo, pues no soy programador de C/C++, pero es una base y es bastante entendible a mi juicio):

Código
  1. #include <windows.h>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. void EnableDebugPriv(); //Nos aumentamos los privilegios, para evitar problemas con permisos... (Ring 3)
  7.  
  8. void main() {
  9.  
  10. BYTE newvalue[] = {0x31, 0x00, 0x32, 0x00, 0x37, 0x00, 0x2E, 0x00, 0x30, 0x00, 0x2E, 0x00, 0x30, 0x00, 0x2E, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //Este es el valor en hexadecimal, de la cadena: 1 2 7 . 0 . 0 . 1 (rellenamos con 0 los numeros del IP antiguo sobrantes)
  11.  
  12. HWND hwnd = FindWindow(0, "Solitario"); //Buscamos la ventana de nuestro juego/proceso (Yo hice la prueba con Solitario)
  13.  
  14. DWORD pid;//Declaramos la variable PID para almacenar el ID de nuestro juego/proceso
  15.  
  16. if(!hwnd) //Si no encontramos la ventana (el handle es nulo)
  17. {
  18. cout << "Error: No se pudo encontrar la ventana!" << endl;
  19. system("pause");
  20. exit(0);
  21. }
  22. else
  23. {
  24. GetWindowThreadProcessId(hwnd, &pid); //Obtenemos el Id del proceso (PID) en base al handle que nos devuelve FindWindow
  25.  
  26. HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); //Abrimos el proceso con acceso total (lectura, escritura)
  27.  
  28. if(!hProcess) //Si no encontramos el juego/proceso (...)
  29. {
  30. cout << "Error: No se pudo abrir el handle" << endl;
  31. system("pause");
  32. exit(0);
  33. }
  34. else //En caso contrario
  35. {
  36. if (WriteProcessMemory(hProcess, //Juego/Proceso a modificar
  37. (LPVOID)0x0100700C, //Direccion de memoria a modificar (Que en tu caso, si no es dinamica deberia ser: 0x0028B244)
  38. &newvalue, //Nuevos bytes a cambiar (en tu caso el nuevo IP)
  39. sizeof(newvalue), //Tamano de los bytes a modificar
  40. NULL)) //Este parametro lo podemos dejar nulo
  41.  
  42. cout << "Memoria editada con exito!" << endl; //Exito!
  43. else
  44. cout << "Fallo al editar la memoria!" << endl; //Memoria no existente o protegida
  45. }
  46. CloseHandle(hProcess); //Cerramos el handle abierto anteriormente
  47. }
  48. system("pause");
  49. }
  50.  
  51. void EnableDebugPriv()
  52. {
  53. HANDLE hToken;
  54. LUID sedebugnameValue;
  55. TOKEN_PRIVILEGES tkp;
  56. OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
  57. LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue);
  58. tkp.PrivilegeCount = 1;
  59. tkp.Privileges[0].Luid = sedebugnameValue;
  60. tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  61. AdjustTokenPrivileges(hToken, false, &tkp, sizeof tkp, NULL, NULL);
  62. CloseHandle(hToken);
  63. }

Con eso ya tienes tu IP cambiada, espero os funcione.

Y... en caso que sea dinámica la dirección que apunta al IP, avisadme y te doy algunos tips de cómo encontrar su puntero.

Edito:
Tío, no respondo MP's que puedan ser resueltos en el mismo tema, pues mira con un bucle, durarías horas enteras buscando perdiendo tiempo, por tal... Es mejor que puntees tal dirección.

Y ahora dirás ¿Eh que cojones? xD... Pues vale, te toca conseguir la dirección de memoria que apunta al IP, esto puede parecer un tanto dificil, pero, créeme una vez lo aprendes no lo es.

Así que, para no extenderme, te dejaré un video donde explican como puntear direcciones de memoria, el video está en inglés, pero no es muy dificil de entender (y de hecho, enseñan como puntear direcciones usando el mismo Cheat Engine ya que es la manera más fiable de hacerlo).

Si se te hace dificil, decidme y te hago un manual a parte.

Aquí el video: http://www.youtube.com/watch?v=Eo_thbmfFIU

Espero me respondas en el foro, ¿Para eso es el mismo no? xD...
« Última modificación: 25 Marzo 2011, 16:53 pm por Daas Cook » En línea

for (int i = Trolling.MaxVal; i > Trolling.MinValue; i--) {
    Forum.Answer = "Don't feed the troll"; }
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Editar Memoria
« Respuesta #6 en: 25 Marzo 2011, 19:43 pm »

.

Te recomiendo que si vas a usar una dirrecion IP manejes el SafeArray de ese juego, hasta donde se esta en VB6 dicho juego asi que para que no Crashee cambia el puntero pData de la estructura ya dicha a otro bloque de memoria de la longitud X que desees, ya que hay una longitud X reservada en memoria si escribes mas en ella te va a crashear por Segmentacion de memoria cuando el juego consulte dicha parte y tu hayas modificado esa zona.

Aquí te dejo una porcion de uno de mis codigos para el trato de memoria.

Código
  1.  
  2. '
  3. ' ////////////////////////////////////////////////////////////////
  4. ' // Autor: BlackZeroX ( Ortega Avila Miguel Angel )            //
  5. ' //                                                            //
  6. ' // Web: http://InfrAngeluX.Sytes.Net/                         //
  7. ' //                                                            //
  8. ' // |-> Pueden Distribuir Este Código siempre y cuando         //
  9. ' // no se eliminen los créditos originales de este código      //
  10. ' // No importando que sea modificado/editado o engrandecido    //
  11. ' // o achicado, si es en base a este código                    //
  12. ' ////////////////////////////////////////////////////////////////
  13.  
  14.  
  15. Option Explicit
  16.  
  17. Private Const SE_PRIVILEGE_ENABLED = &H2
  18. Private Const PAGE_WRITECOPY As Long = &H8
  19. Private Const STANDARD_RIGHTS_REQUIRED As Long = &HF0000
  20. Private Const SYNCHRONIZE As Long = &H100000
  21. Private Const PROCESS_ALL_ACCESS As Long = (STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF)
  22.  
  23. Private Const SE_DEBUG_NAME             As String = "SeDebugPrivilege"
  24. Private Const TOKEN_ADJUST_PRIVILEGES = &H20
  25. Private Const TOKEN_QUERY = &H8
  26. Private Const ANYSIZE_ARRAY = 1
  27.  
  28. Type LUID
  29.    LowPart                     As Long
  30.    HighPart                    As Long
  31. End Type
  32. Type LUID_AND_ATTRIBUTES
  33.    pLuid                       As LUID
  34.    Attributes                  As Long
  35. End Type
  36. Type TOKEN_PRIVILEGES
  37.    PrivilegeCount              As Long
  38.    Privileges(ANYSIZE_ARRAY)   As LUID_AND_ATTRIBUTES
  39. End Type
  40.  
  41. Private Declare Function VarPtrA Lib "msvbvm60.dll" Alias "VarPtr" (ByRef Ptr() As Any) As Long
  42. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
  43.  
  44. Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
  45. Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
  46. Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
  47. Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
  48.  
  49. Private Declare Function VirtualProtectEx Lib "kernel32" (ByVal hProcess As Long, lpAddress As Any, ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long
  50. Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
  51. 'Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
  52.  
  53. Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
  54. Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
  55. Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  56.  
  57.  
  58.  
  59. Public Function EnableDebugPriv() As Boolean
  60. Dim hProc       As Long
  61. Dim hToken      As Long
  62. Dim mLUID       As LUID
  63. Dim mPriv       As TOKEN_PRIVILEGES
  64. Dim mNewPriv    As TOKEN_PRIVILEGES
  65.  
  66.    hProc = GetCurrentProcess()
  67.    If hProc <> 0 Then
  68.        If OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hToken) <> 0 Then
  69.            If LookupPrivilegeValue(vbNullString, SE_DEBUG_NAME, mLUID) <> 0 Then
  70.                With mPriv
  71.                    .PrivilegeCount = 1
  72.                    .Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
  73.                    .Privileges(0).pLuid = mLUID
  74.                End With
  75.                EnableDebugPriv = AdjustTokenPrivileges(hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount)) <> 0
  76.            End If
  77.            Call CloseHandle(hToken)
  78.        End If
  79.    End If
  80.  
  81. End Function
  82.  
  83. Public Function WriteInMmemoryB(ByVal hWnd As Long, ByVal lngBaseAddress As Long, ByRef bBuff() As Byte, Optional ByVal EnablePrivDebug As Boolean = True) As Long
  84. Dim lngPID                      As Long
  85. Dim lngOldProt                  As Long
  86. Dim lngWritten                  As Long
  87. Dim hProcess                    As Long
  88. Dim lngBuff                     As Long
  89.  
  90.    lngBuff = lenByteArray(bBuff)
  91.    If lngBuff > 0 Then
  92.        If EnablePrivDebug Then
  93.            If Not EnableDebugPriv Then
  94.                Exit Function
  95.            End If
  96.        End If
  97.        If GetWindowThreadProcessId(hWnd, lngPID) <> 0 Then
  98.            hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, lngPID)
  99.            If hProcess <> 0 Then
  100.                'If VirtualProtectEx(hProcess, ByVal lngBaseAddress, lngBuff, PAGE_WRITECOPY, lngOldProt) <> 0 Then
  101.                    Call WriteProcessMemory(hProcess, ByVal lngBaseAddress, bBuff(0), lngBuff, lngWritten)
  102.                    WriteInMmemoryB = lngWritten
  103.                'End If
  104.                Call CloseHandle(hProcess)
  105.            End If
  106.        End If
  107.    End If
  108. End Function
  109.  
  110. Public Function WriteInMmemoryS(ByVal hWnd As Long, ByVal lngBaseAddress As Long, ByRef bBuff As String, Optional ByVal EnablePrivDebug As Boolean = True) As Long
  111. ' PAra ahcerlo mas rapido y respectando los caracteres Nulos entre letras usa la estructura SafeArray y cambia los punteros entre variables asi evitas un chorizo de codigo que usara inecesariamente el procesador.
  112.    WriteInMmemoryS = WriteInMmemoryB(hWnd, lngBaseAddress, StrConv(bBuff, vbFromUnicode), EnablePrivDebug)
  113. End Function
  114.  
  115. Public Function lenByteArray(ByRef bBuff() As Byte) As Long
  116.    If ItsArrayIni(VarPtrA(bBuff), 4) Then
  117.        lenByteArray = UBound(bBuff)
  118.        If 0 = LBound(bBuff) Then
  119.            lenByteArray = lenByteArray + 1
  120.        End If
  121.    End If
  122. End Function
  123.  
  124. Private Function ItsArrayIni(ByVal lngPtr As Long, Optional LnBytes As Long = 4) As Boolean
  125. Dim lngPtrSA                   As Long
  126.  
  127.    If lngPtr <> 0 And LnBytes > 0 Then
  128.        Call CopyMemory(ByVal VarPtr(lngPtrSA), ByVal lngPtr, LnBytes)
  129.        ItsArrayIni = Not lngPtrSA = 0
  130.    End If
  131. End Function
  132.  
  133.  

Para mas practico:

Código
  1.  
  2. Option Explicit
  3.  
  4. Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  5.  
  6. Public variable As String
  7.  
  8. Private Sub Form_Load()
  9.    variable = "Miguel Angel Ortega Avila"
  10.    MsgBox variable
  11.    Show
  12.    '   _Use findwindows con me.caption que es equivaente a me.hwnd solo es para dar una idea.
  13.    MsgBox ModMemory.WriteInMmemoryS(FindWindow(vbNullString, Me.Caption), StrPtr(variable), "I" & Chr(0) & "n" & Chr(0) & "f" & Chr(0) & "r" & Chr(0) & "a" & Chr(0) & "n" & Chr(0) & "g" & Chr(0) & "e" & Chr(0) & "l" & Chr(0) & "u" & Chr(0) & "X")
  14.    MsgBox variable
  15. End Sub
  16.  
  17.  

Temibles Lunas!¡.
En línea

The Dark Shadow is my passion.
el_c0c0


Desconectado Desconectado

Mensajes: 307


Ver Perfil
Re: Editar Memoria
« Respuesta #7 en: 25 Marzo 2011, 20:49 pm »

Che una pregunta, porque pasa el tema de segmentacion de memoria?
Segun lo que entendi de lo que pusieron es porque vos bloqueaste la memoria para escribir, y el programa esta intentando leer?

Porque no "pausas" el proceso? (poder se puede, sino fijate en el Process Explorer que te permite pausar un proceso y no crashea ni nada...)

De todas maneras, cambiar el puntero al safearray parece la mas viable, solo si no podes editar el .exe original del Argentum.
En línea

'-     coco
"Te voy a romper el orto"- Las hemorroides
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Editar Memoria
« Respuesta #8 en: 25 Marzo 2011, 20:59 pm »

.
­La segmentacion de memoria es causada cuando se intenta acceder a una porcion de memoria no asignada/reservada es tal cual como en C/C++ cuando intentas leer una porcion no reservada.

En otras palabras al escribir asi aun que sea pausado el proceso si se escribe mas de lo debido el programa ( en este caso el juego ) solo leera lo requerido pero OJO se estaria modificando otros bytes al escribir desde otro programa que no deberian modificarse.

P.D.: Perdon el SafeArray es para Arreglos.

Dulces Lunas!¡.
« Última modificación: 25 Marzo 2011, 21:05 pm por BlackZeroX▓▓▒▒░░ » En línea

The Dark Shadow is my passion.
Dunkansdk

Desconectado Desconectado

Mensajes: 25


Ver Perfil
Re: Editar Memoria
« Respuesta #9 en: 26 Marzo 2011, 01:53 am »

Hola a todos puedo sacar la dirección de memoria donde se almacena la IP, cambiarla con una función y todo perfecto, el problema es que tengo que sacar el puntero de esta IP ya que es dinámica .

Hay alguna manera de sacar el puntero manualmente? .
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