Ir al contenido


Foto

Traducir código C# a Delphi


  • Por favor identifícate para responder
17 respuestas en este tema

#1 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 89 mensajes

Escrito 02 diciembre 2016 - 07:09

Buenas, estoy tratando de hacer mi propio lancador del juego call of duty Modern Warfare 3 para un server TeknoGonds para juegos offline, e logrado desensamblar el lancador del TeknoGonds pero tengo el codigo en C# quisiera pasarlo a Delphi, alguien me podria ayudar. Esta es la parte del codigo q al parecer inyecta la dll al juego para que vea el server TeknoGonds:

csharp
  1. private void BAAAA(object ᙂ, RoutedEventArgs \u0031AAAA)
  2. {
  3. byte[] bytes = Encoding.ASCII.GetBytes("teknomw3.dll");
  4. if (MessageBox.Show("This is only intented if you have the game running in the backround connected to Steam and it is recommented that you are in the barracks.", "Are you sure you want to continue?", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.No)
  5. return;
  6. Process[] processArray = MainWindow.("iw5mp.exe");
  7. if (processArray == null)
  8. {
  9. int num1 = (int) MessageBox.Show("Target process not found");
  10. }
  11. else
  12. {
  13. IntPtr num2 = Win32Apis.OpenProcess(2035711, false, processArray[0].Id);
  14. if (num2 == IntPtr.Zero)
  15. {
  16. int num3 = (int) MessageBox.Show("Target process pointer is invalid");
  17. }
  18. else
  19. {
  20. IntPtr procAddress = (IntPtr) ((int) (uint) Win32Apis.GetProcAddress(Win32Apis.GetModuleHandle("Kernel32.dll"), "LoadLibraryA"));
  21. if (procAddress == (IntPtr) 0)
  22. {
  23. int num4 = (int) MessageBox.Show("Loadlibrary unreachable");
  24. }
  25. else
  26. {
  27. int num5 = bytes.Length + 1;
  28. IntPtr num6 = Win32Apis.VirtualAllocEx(num2, new IntPtr(0), (uint) num5, Win32Apis.AllocationType.COMMIT, Win32Apis.MemoryProtection.READWRITE);
  29. if (num6 == (IntPtr) 0)
  30. {
  31. int num7 = (int) MessageBox.Show("Virtual alloc failure");
  32. }
  33. else
  34. {
  35. UIntPtr lpNumberOfBytesWritten;
  36. Win32Apis.WriteProcessMemory(num2, num6, bytes, (uint) num5, out lpNumberOfBytesWritten);
  37. if (lpNumberOfBytesWritten == (UIntPtr) 0U)
  38. {
  39. int num8 = (int) MessageBox.Show("Write process mem failure");
  40. }
  41. else
  42. {
  43. Mutex mutex = new Mutex(false, "TeknoPDump" + (processArray[0].Id ^ 128).ToString("X8"));
  44. Win32Apis.CreateRemoteThread(num2, new IntPtr(0), new IntPtr(0), procAddress, num6, 0U, (IntPtr) 0);
  45. Win32Apis.CloseHandle(num2);
  46. Thread.Sleep(6000);
  47. mutex.Close();
  48. }
  49. }
  50. }
  51. }
  52. }
  53. }

teknomw3.dll: es la dll q se quiere inyectar al juego
iw5mp.exe: es el ejecutable de juego
  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 02 diciembre 2016 - 12:44

Ese código es un inyector de dll. Me extraña que un juego se lance inyectando una dll al mismo juego.

 

Una traducción a delphi puede ser esta:


delphi
  1. uses
  2.   Tlhelp32;
  3.  
  4. function GetProcessId(FileName: PCHAR): DWORD;
  5. var
  6.   proc: TProcessEntry32;
  7.   hSysSnapshot: THandle;
  8. begin
  9.   Result:= 0;
  10.   proc.dwSize := SizeOf(TProcessEntry32);
  11.   hSysSnapshot:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  12.   if (hSysSnapshot <> INVALID_HANDLE_VALUE) and Process32First(hSysSnapshot, proc) then
  13.   repeat
  14.     if lstrcmpi(proc.szExeFile, FileName) = 0 then
  15.     begin
  16.       Result:= proc.th32ProcessID;
  17.       break;
  18.     end;
  19.   until not (Process32Next(hSysSnapshot, proc));
  20.   CloseHandle(hSysSnapshot);
  21. end;
  22.  
  23. procedure BAAAA;
  24. const
  25. DllName = 'teknomw3.dll';
  26. Process = 'iw5mp.exe';
  27. var
  28. hProcess: THANDLE;
  29. ProcessId: integer;
  30. PLoadLibrary: Pointer;
  31. SizeDllName: integer;
  32. Buffer: Pointer;
  33. NumberOfBytesWritten: DWORD;
  34. Mutex: THANDLE;
  35. begin
  36. if MessageBox(0, 'This is only intented if you have the game running in the backround connected to Steam and it is recommented that you are in the barracks.', 'Are you sure you want to continue?', MB_YESNO or MB_ICONQUESTION) = IDNO then
  37. exit;
  38. ProcessId:= GetProcessId(Process);
  39. hProcess:= OpenProcess(2035711, false, ProcessId);
  40. if hProcess = 0 then
  41. MessageBox(0, 'Target process pointer is invalid', 'Error', MB_ICONEXCLAMATION)
  42. else
  43. begin
  44. PLoadLibrary:= GetProcAddress(GetModuleHandle('Kernel32.dll'), 'LoadLibraryA');
  45. if PLoadLibrary = nil then
  46. MessageBox(0, 'Loadlibrary unreachable', 'Error', MB_ICONEXCLAMATION)
  47. else
  48. begin
  49. SizeDllName:= lstrlen(DllName) + 1;
  50. Buffer:= VirtualAllocEx(hProcess, nil, SizeDllName, MEM_COMMIT, PAGE_READWRITE);
  51. if Buffer = nil then
  52. MessageBox(0, 'Virtual alloc failure', 'Error', MB_ICONEXCLAMATION)
  53. else
  54. begin
  55. WriteProcessMemory(hProcess, Buffer, PCHAR(DllName), SizeDllName, NumberOfBytesWritten);
  56. if NumberOfBytesWritten = 0 then
  57. MessageBox(0, 'Write process mem failure', 'Error', MB_ICONEXCLAMATION)
  58. else
  59. begin
  60. Mutex:= CreateMutex(nil, false, PCHAR('TeknoPDump' + IntToStr(ProcessId xor 128)));
  61. CreateRemoteThread(hProcess, nil, 0, PLoadLibrary, Buffer, 0, PDWORD(0)^);
  62. CloseHandle(hProcess);
  63. Sleep(6000);
  64. CloseHandle(Mutex);
  65. end;
  66. end;
  67. end;
  68. end;
  69. end;

También puedes inyectar con la función que ya mostré:


delphi
  1. uses
  2.   Windows, Tlhelp32;
  3.  
  4. function GetProcessId(FileName: PCHAR): DWORD;
  5. var
  6. proc: TProcessEntry32;
  7. hSysSnapshot: THandle;
  8. begin
  9. Result:= 0;
  10. proc.dwSize := SizeOf(TProcessEntry32);
  11. hSysSnapshot:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  12. if (hSysSnapshot <> INVALID_HANDLE_VALUE) and Process32First(hSysSnapshot, proc) then
  13. repeat
  14. if lstrcmpi(proc.szExeFile, FileName) = 0 then
  15. begin
  16. Result:= proc.th32ProcessID;
  17. break;
  18. end;
  19. until not (Process32Next(hSysSnapshot, proc));
  20. CloseHandle(hSysSnapshot);
  21. end;
  22.  
  23. // Inyecta en el proceso abierto con el PID dado
  24. function InjectCRT(Pid: integer; dll: PCHAR): BOOL; overload;
  25. var
  26. hThread: THANDLE;
  27. ExitCode: DWORD;
  28. hLib: Pointer;//LPTHREAD_START_ROUTINE;
  29. hProc: THANDLE;
  30. Buffer: Pointer;
  31. begin
  32. Result:= false;
  33. if(dll^ = #0) then exit;
  34.  
  35. ExitCode:= 0;
  36. hProc:= OpenProcess(PROCESS_ALL_ACCESS, false, Pid);
  37. if hProc<>0 then
  38. begin
  39. Buffer:= VirtualAllocEx(hProc, nil, lstrlen(dll)+1, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
  40. if Buffer<>nil then
  41. begin
  42. if WriteProcessMemory(hProc, Buffer, dll, lstrlen(dll)+1, PDWORD(0)^) then
  43. begin
  44. hLib:= GetProcAddress(GetModuleHandle('Kernel32.dll'), 'LoadLibraryA');
  45. if hLib <> nil then
  46. begin
  47. hThread:= CreateRemoteThread(hProc, nil, 0, hLib, Buffer, 0, PDWORD(0)^);
  48. if hThread <> 0 then
  49. begin
  50. // libero la memoria localizada...
  51. WaitForSingleObject(hThread, INFINITE); // Espero a que se cree y termine el Thread
  52. GetExitCodeThread(hThread, ExitCode); // Termino el Thread
  53. CloseHandle(hThread); // Cierro el Handle hThread
  54. end;
  55. end;
  56. end;
  57. VirtualFreeEx(hProc, Buffer, 0, MEM_RELEASE); // Libero memoria
  58. end;
  59. CloseHandle(hProc); // Cierro el Handle hProc
  60. end;
  61. Result:= (ExitCode <> 0);
  62. end;
  63.  
  64. // Inyecta procesos por su nombre, devuelve el número de inyectados
  65. function InjectCRT(FileName: PCHAR; DllFullName: PCHAR): DWORD; overload;
  66. var
  67. i: integer;
  68. proc: TProcessEntry32;
  69. hSysSnapshot: THandle;
  70. begin
  71. i:= 0;
  72. proc.dwSize := SizeOf(TProcessEntry32);
  73. hSysSnapshot:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  74. if (hSysSnapshot <> INVALID_HANDLE_VALUE) and Process32First(hSysSnapshot, proc) then
  75. repeat
  76. if lstrcmpi(proc.szExeFile, FileName) = 0 then
  77. begin
  78. InjectCRT(proc.th32ProcessID, DllFullName);
  79. inc(i);
  80. end;
  81. until not (Process32Next(hSysSnapshot, proc));
  82. CloseHandle(hSysSnapshot);
  83. Result:= i;
  84. end;

Saludos.


  • 1

#3 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 89 mensajes

Escrito 02 diciembre 2016 - 12:49

TeknoGonds es hecho por terceros no es del juego en si, ellos crearon un server para juegar ese juego offline ya q solo se podia jugar en steam, pero yo quiero hacer un lansador propio pa q se conecte direto al server que montamos.


  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 02 diciembre 2016 - 01:02

TeknoGonds es hecho por terceros no es del juego en si, ellos crearon un server para juegar ese juego offline ya q solo se podia jugar en steam, pero yo quiero hacer un lansador propio pa q se conecte direto al server que montamos.

 

En ese caso, ya tienes la traducción que solicitabas. ;)

 

 

Saludos.


  • 0

#5 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 89 mensajes

Escrito 02 diciembre 2016 - 01:16

Me da un error "types of actual and formal var parameters must be identical" en la linea

WriteProcessMemory(hProcess, Buffer, PCHAR(DllName), SizeDllName, NumberOfBytesWritten);

 

lo traduje y me dio esto "Los tipos de parámetros var reales y formales deben ser idénticos"  a q se refiero eso?


  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 02 diciembre 2016 - 02:01

¿Qué Delphi usas? es ¿Lazarus?. Dependiendo de la declaración de la API así son los tipos. En la declaración de M$ en C,  NumberOfBytesWritten debe ser puntero. En Delphi 7 es una referencia.

 

Saludos.


  • 0

#7 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 89 mensajes

Escrito 02 diciembre 2016 - 02:11

estoy compilando con delphi rad studio berlin


  • 0

#8 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 02 diciembre 2016 - 03:21

Berlin la declara así:


php
  1. WriteProcessMemory(cardinal, pointer, pointer, cardinal, @cardinal);

Al contrario que delphi7 en realidad debería declararse como Berlin porque es como la declara M$. Debes usarla así en Berlin:


php
  1. WriteProcessMemory(hProcess, Buffer, PCHAR(DllName), SizeDllName, @NumberOfBytesWritten);

Saludos.


  • 0

#9 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 89 mensajes

Escrito 02 diciembre 2016 - 04:16

asi me sige dando el mismo error, pero con lo de SIZE_T se lo trago eso lo busque en un sitio en chino asi q no se q tipo de variable es

otra cosa: como puedo subir el proyecto de teknoGods pa q lo revises proque parece q el pone un hilo a trabajar q chequea cuando el exe se levanta y le hace mas cosa, lo trace con el JetBrains y me dio esta funcion


delphi
  1. private void ᙅ()
  2. {
  3.   STARTUPINFO lpStartupInfo = new STARTUPINFO();
  4.   PROCESS_INFORMATION lpProcessInformation = new PROCESS_INFORMATION();
  5.   byte[] arrayToSearchThrough = File.ReadAllBytes(this.ExecutableName);
  6.   byte[] input1 = new byte[4];
  7.   Array.Copy((Array) arrayToSearchThrough, 60, (Array) input1, 0, 2);
  8.   byte[] input2 = new byte[4];
  9.   int num1 = RunProc.BytesToInt(input1);
  10.   int sourceIndex1 = num1 + 296;
  11.   int sourceIndex2 = num1 + 300;
  12.   int sourceIndex3 = num1 + 304;
  13.   int sourceIndex4 = num1 + 308;
  14.   Array.Copy((Array) arrayToSearchThrough, sourceIndex3, (Array) input2, 0, 4);
  15.   int num2 = RunProc.BytesToInt(input2);
  16.   Array.Copy((Array) arrayToSearchThrough, sourceIndex4, (Array) input2, 0, 4);
  17.   int num3 = RunProc.BytesToInt(input2);
  18.   Array.Copy((Array) arrayToSearchThrough, sourceIndex2, (Array) input2, 0, 4);
  19.   int num4 = RunProc.BytesToInt(input2) + 4194304;
  20.   Array.Copy((Array) arrayToSearchThrough, sourceIndex1, (Array) input2, 0, 4);
  21.   int num5 = RunProc.ᙃ(RunProc.BytesToInt(input2));
  22.   int num6 = RunProc.IndexOf(arrayToSearchThrough, Encoding.ASCII.GetBytes("steam_api.dll"));
  23.   if (num6 < num3 && num6 > num3 + num2)
  24.   {
  25.   int num7 = (int) MessageBox.Show("Cannot find steam_api.dll string in executable, make sure you have the proper original files!");
  26.   }
  27. else
  28. {
  29.   int num8 = num6 - num3;
  30.   if (!Win32Apis.CreateProcess(this.ExecutableName, this.Commandargs, IntPtr.Zero, IntPtr.Zero, false, 516U, IntPtr.Zero, (string) null, ref lpStartupInfo, out lpProcessInformation))
  31.   {
  32.   int num9 = (int) MessageBox.Show("Cannot create process!");
  33.   }
  34. else
  35. {
  36.   this.CAAA0 = lpProcessInformation.hThread;
  37.   uint lpflOldProtect1;
  38.   Win32Apis.VirtualProtectEx(lpProcessInformation.hProcess, new IntPtr(num4), new UIntPtr((uint) num5), 64U, out lpflOldProtect1);
  39.   UIntPtr lpNumberOfBytesWritten;
  40.   Win32Apis.WriteProcessMemory(lpProcessInformation.hProcess, new IntPtr(num4 + num8), Encoding.ASCII.GetBytes("teknomw3.dll"), 13U, out lpNumberOfBytesWritten);
  41.   uint lpflOldProtect2;
  42.   Win32Apis.VirtualProtectEx(lpProcessInformation.hProcess, new IntPtr(num4), new UIntPtr((uint) num5), lpflOldProtect1, out lpflOldProtect2);
  43.   if (lpNumberOfBytesWritten == (UIntPtr) 0U)
  44.   {
  45.   int num10 = (int) MessageBox.Show("Cannot write to process memory!");
  46.   Win32Apis.TerminateProcess(lpProcessInformation.hProcess, 0U);
  47.   Win32Apis.TerminateThread(lpProcessInformation.hThread, 0U);
  48.   }
  49. else
  50. {
  51.   this.BAAAA = new Mutex(false, "TeknoMW3" + (lpProcessInformation.dwProcessId ^ 87U).ToString("X8"));
  52.   int num10 = (int) Win32Apis.ResumeThread(lpProcessInformation.hThread);
  53.   }
  54. }
  55. }
  56. }

 q llama a


delphi
  1. public static int IndexOf(byte[] arrayToSearchThrough, byte[] patternToFind)
  2. {
  3.   if (patternToFind.Length > arrayToSearchThrough.Length)
  4.   return -1;
  5.   for (int index1 = 0; index1 < arrayToSearchThrough.Length - patternToFind.Length; ++index1)
  6.   {
  7.   bool flag = true;
  8.   for (int index2 = 0; index2 < patternToFind.Length; ++index2)
  9.   {
  10.   if ((int) arrayToSearchThrough[index1 + index2] != (int) patternToFind[index2])
  11.   {
  12.   flag = false;
  13.   break;
  14.   }
  15. }
  16. if (flag)
  17. return index1;
  18. }
  19. return -1;
  20. }


  • 0

#10 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 02 diciembre 2016 - 05:36

asi me sige dando el mismo error, pero con lo de SIZE_T se lo trago eso lo busque en un sitio en chino asi q no se q tipo de variable es


SIZE_T = Cardinal = DWORD
sizeof(SIZE_T) = sizeof(Cardinal) = sizeof(DWORD) = 4

Debe ser un bug de Berlin porque estas variables son idénticas.

Lamentablemente no localizo el fuente en mi versión delphi Berlin para ver como declara exactamente WriteProcessMemory no se si es porque primero instalé Builder C

Yo he usado delphi7 para todo el código que te mostré y con lo que dices, deberías haber encontrado más errores con Berlin, pues WriteProcessMemory la uso en las funciones de inyección que lleva la dll.

Saludos.
  • 0

#11 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 02 diciembre 2016 - 06:06

Sobre la traducción, es muy difícil que pueda ayudarte sin tener todo el sistema en mis manos.

Ese código parece que escribe en la memoria de un proceso que crea, cuyo nombre no está presente, para cambiar probablemente en la IAT, el nombre de una dll por teknomw3.dll. El objeto de esto, puede ser para cambiar el comportamiento de ciertas funciones que sobreescribe con la nueva dll (teknomw3.dll).

 

El código decompilado es complejo de entender puesto que se pierde el nombre de las variables y muchas veces es impreciso hasta el punto que no compilaría. Para entender lo que sucede, hay que usar una herramienta tipo Ollydbg que te permite ver los valores tomados y realizar ingeniería inversa.

 

No creo que te sea muy rentable ese trabajo. Es más sencillo usar la lanzadera original para luego hacer lo que precises.

 

 

Saludos.


  • 0

#12 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 89 mensajes

Escrito 05 diciembre 2016 - 07:14

el problema de usar la lansadera original es q ya existen crack q se ejecuntan y no muestran ventanas solo esperan a q el proceso del juego aparesca y lo inyectan, entonces seria una competencia entre el antihook y el crack a ver quien encuentra primero el procesos por eso quiero poner como lansador al antihook pa q capture el PID del proceso al crearlo el. La inyeccion al sistema completo no me fue factible porque me da alertas de casi todos los programas q tenga ejecutados. Quiero subirte el proyecto completo de Teknogods pero no me deja este sitio, lo subi a mega https://mega.nz/#!wA...mHgdKgNm81eUfyc

dime si lo puedes descagar


  • 0

#13 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 05 diciembre 2016 - 02:07

La clave para que la dll inyectada globalmente no provoque falsos avisos es el control de los PID que debe proteger. Para eso está la lista de PIDS.  Es decir el proceso del o los juegos y de sus lanzadores. Si usas el lanzador original con otro usando Createprocess obtienes inmediatamente su PID dese PROCESS_INFORMATION. eso te permite inyectarle la dll e introducirlo en la lista de PIDs.

 

Si conoces las dlls que carga el lanzador original puedes compararla con la que realmente tenga. las sobrantes están inyectadas y las descargas, exceptuando la que te interese. Esa lista la puedes hacer analizando el proceso en ejecucíon. También en la IAT pero es menos seguro.

 

 

Saludos.


  • 0

#14 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 89 mensajes

Escrito 05 diciembre 2016 - 02:14

no entienddo esta parte

 

Si usas el lanzador original con otro usando Createprocess obtienes inmediatamente su PID dese PROCESS_INFORMATION. eso te permite inyectarle la dll e introducirlo en la lista de PIDs.

el lansador original q tiene el juego cuando se ejecuta salen muchas opciones para cotectarse o crear un server con el mismo por lo q no es automatico y el usuario puede estar en la ventana del lansador el tiempo q desee por lo q tengo q crear un ciclo q este chequeando cuando el proseso 'iw5mp.exe'

se levante.


  • 0

#15 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 05 diciembre 2016 - 02:18

no entienddo esta parte

el lansador original q tiene el juego cuando se ejecuta salen muchas opciones para cotectarse o crear un server con el mismo por lo q no es automatico y el usuario puede estar en la ventana del lansador el tiempo q desee por lo q tengo q crear un ciclo q este chequeando cuando el proseso 'iw5mp.exe'

se levante.

 

Un Hook a CreateProcessInternal.

 

Saludos.


  • 0

#16 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 05 diciembre 2016 - 04:36

Quiero subirte el proyecto completo de Teknogods pero no me deja este sitio, lo subi a mega https://mega.nz/#!wA...mHgdKgNm81eUfyc
dime si lo puedes descagar


404 Not Found

Saludos.
  • 0

#17 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 89 mensajes

Escrito 06 diciembre 2016 - 07:29

ya consegui desemsamblar el proyecto sin tantos errores este es el link http://mega.nz/#!sRx...jy9EOsZ4vpbPscw


  • 0

#18 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 07 diciembre 2016 - 06:45

Tu plan es sustituir una app lanzadora por otra propia decompilando la original y realizando algunos cambios, en concreto inyectando una determinada dll defensiva antes de que te ataquen. El problema es el trabajo de interpretación de un código decompilado que suele tener partes incomprensibles y que la mayoría de las veces genera un proyecto que no compilará. En mi opinión, hay que facilitarse la vida por caminos menos trabajosos, bien consiguiendo el fuente original, o bien con aproximaciones. Entiendo que esa lanzadera no ejecuta inmediatamente el proceso que lanza hasta que el usuario configure ciertos parámetros, momento en que el atacante aprovecha y por eso hay que diseñarlo bien.

 

Como quiera que el fuente original no lo puedes conseguir, por lo que hay que aproximarse. Ya te  sugerí un hook a la API CreateProcess y mejor a CreateProcessInternal que es indoumentada y cuya declaración en C es como sigue:


php
  1. bool   __stdcall CreateProcessInternalW(HANDLE hToken,
  2.                         LPCWSTR lpApplicationName,
  3.                         LPWSTR lpCommandLine,
  4.                         LPSECURITY_ATTRIBUTES lpProcessAttributes,
  5.                         LPSECURITY_ATTRIBUTES lpThreadAttributes,
  6.                         BOOL bInheritHandles,
  7.                         DWORD dwCreationFlags,
  8.                         LPVOID lpEnvironment,
  9.                         LPCWSTR lpCurrentDirectory,
  10.                         LPSTARTUPINFOW lpStartupInfo,
  11.                         LPPROCESS_INFORMATION lpProcessInformation,
  12.                         PHANDLE hNewToken);
  13. // "kernel32.dll", "CreateProcessInternalW"

El proceso 'iw5mp.exe' será creado en última instancia por CreateProcessInternalW. Teniendo el control de esa API mediante un Hook a la propia lanzadera original, vas a tener inmediatamente su PId a través de la estructura PROCESS_INFORMATION determinada por un puntero lpProcessInformation. De esta forma no esperas a que un bucle analice los procesos en ejecución cada cierto tiempo, sino que no esperas. En cuanto tengas el PId inyectas tu dll y listo.

 

En este punto puedes dudar si eres el primero en detectar la ejecución de 'iw5mp.exe', puedes no ser el primero si previamente a tu Hook a CreateProcessInternalW se te han adelantado, cosa improbable pero que puedes solventar:

 

1.- Deshaciendo dicho hook antes de realizar el tuyo: API UnHooker deshaciendo un Hook a la API tipo trampolín

2.- Detectando dlls indeseables: CreateToolHelp32SnapShot(TH32CS_SNAPMODULE, 0)

3.- Usando otra lanzadera que lance a la lanzadera original inyectando el Hook a CreateProcessInternalW.

 

El tercer punto puede ser más atractivo, pero deberás conseguir que el uso de la lanzadera original, aún levantando el proceso 'iw5mp.exe', no cumpla su cometido. Debes tener en cuenta que tus atacantes tendrán copia de esos archivos. Conseguido esto, el truco estaría en cambiar el nombre del proceso lanzadera para que sea tu lanzadera quien lo conozca y la única que pueda encontrarlo, incluso hardcodear en tu lanzadera toda la lanzadera original. No creo que con esta técnica se adelante nadie a inyectar un proceso que ni tiene archivo en disco y cuyo nombre desconocen. Puestos a rizar el rizo, pueden usarse técnicas que suplanten al loader de windows cargando en memoria el ejecutable y lanzándolo desde ahí (RunPE), aunque sinceramente no creo que esto último sea necesario ya que es una técnica usada para esconder procesos de los mismos antivirus.

 

Creo que con las pautas dadas puedes solucionar el problema sin necesidad de decompilar, cambiar y recompilar la lanzadera original evitando que te ataquen,

 

Saludos.


  • 0




IP.Board spam blocked by CleanTalk.