Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Borito30 en 19 Marzo 2017, 14:46 pm



Título: Iniciar un proceso de forma pausada c++
Publicado por: Borito30 en 19 Marzo 2017, 14:46 pm
Hola estoy haciendo un pequeño programa que me iniciara mi proceso de forma pausada el siguiente código obtengo el pid y se lo paso a mi funcion:
Código
  1. int main(int argc, char *argv[])
  2. {
  3. HANDLE processList = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  4. PROCESSENTRY32 pInfo;
  5. BOOL st = TRUE;
  6. pInfo.dwSize = sizeof(PROCESSENTRY32);
  7. Process32First(processList, &pInfo);
  8. int myPid = 0;
  9. do
  10. {
  11. std::wstring name(L"miproceso.exe");
  12. const wchar_t* szName = name.c_str();
  13. if (wcscmp(pInfo.szExeFile, szName) == 0)
  14. {
  15. myPid = pInfo.th32ProcessID;
  16. cout << myPid << endl;
  17. break;
  18. }
  19. Process32Next(processList, &pInfo);
  20. } while (st != FALSE);
  21.  
  22. char chaine[10];
  23. sprintf(chaine,"%d",myPid);
  24. Startpausedprocess(chaine,processList);
  25. }
La funcion:
Código
  1. HANDLE Startpausedprocess(char *cmd, PHANDLE hthread)//Not const char* because CreateProcess may write on it
  2. {
  3.    PROCESS_INFORMATION pi;
  4.    STARTUPINFOA si;//STARTUPINFOA is the ANSI version of STARTUPINFO.
  5.    ZeroMemory(&si, sizeof(STARTUPINFOA));
  6.    si.cb = sizeof(STARTUPINFOA);
  7.  
  8.    if (!CreateProcessA(NULL, cmd, NULL, NULL, false, CREATE_SUSPENDED, NULL, NULL, &si, &pi))//The flag "CREATE_SUSPENDED" will create the process and pause the main thread.
  9.    {
  10.        cout << "CreateProcess failed, " << GetLastError() << endl;
  11.        return NULL;
  12.    }
  13.    *hthread = pi.hThread;
  14.    return pi.hProcess;
  15. }

Sigo teniendo problemas al resolver errores de argumentos. Los errores son los siguientes:
Citar
Build FAILED.

"C:\Users\Androide\Desktop\colo\injector\injector\injector.vcxproj" (default ta
rget) (1) ->
(ClCompile target) ->
  c:\users\androide\desktop\colo\injector\injector\injector.cpp(64): error C266
4: 'HANDLE Startpausedprocess(char *,PHANDLE)': cannot convert argument 2 from
'HANDLE' to 'PHANDLE' [C:\Users\Androide\Desktop\colo\injector\injector\injecto
r.vcxproj]
  c:\users\androide\desktop\colo\injector\injector\injector.cpp(63): error C499
6: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s
 instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help
for details. [C:\Users\Androide\Desktop\colo\injector\injector\injector.vcxproj
]

    0 Warning(s)
    2 Error(s)

 :P No me hace la conversión char * correctamente alguna idea como convertir mi entero a char *? Y luego PHandle que diferencia tiene con Handle?


Título: Re: Iniciar un proceso de forma pausada c++
Publicado por: ivancea96 en 19 Marzo 2017, 15:53 pm
Los errores son claros:
Código:
'HANDLE Startpausedprocess(char *,PHANDLE)': cannot convert argument 2 from
'HANDLE' to 'PHANDLE'


'sprintf': This function or variable may be unsafe. Consider using sprintf_s
 instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

Estás pasando un HANDLE a tu función, que recibe PHANDLE.

Y lo segundo, pues lo que dice. Puede no ser segura.


Título: Re: Iniciar un proceso de forma pausada c++
Publicado por: Borito30 en 19 Marzo 2017, 17:01 pm
que diferencia hay entre un handle y un phandle son lo mismo? Esque encuentro informacion sobre handle pero no phandle.. disculpa las molestias..


Título: Re: Iniciar un proceso de forma pausada c++
Publicado por: ivancea96 en 19 Marzo 2017, 17:30 pm
Los tipos de Windows que empiezan con P o con LP suelen sen punteros.
En cualquier caso: https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx (https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx)

De todos modos, si no te gusta PHANDLE, puedes poner HANDLE*. La razón de que hayan puesto un HANDLE* en esa función es para poder devolver el HANDLE.
Código
  1. *hthread = pi.hThread;


Título: Re: Iniciar un proceso de forma pausada c++
Publicado por: Borito30 en 20 Marzo 2017, 05:33 am
Los tipos de Windows que empiezan con P o con LP suelen sen punteros.
En cualquier caso: https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx (https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx)

De todos modos, si no te gusta PHANDLE, puedes poner HANDLE*. La razón de que hayan puesto un HANDLE* en esa función es para poder devolver el HANDLE.
Código
  1. *hthread = pi.hThread;
Pues al final lo corregi haciendo la conversión pasando el * intente pero no iba. Pero aún así mi inyector falla cuando hago esto de iniciar un proceso pausado y llamo a la función obviamente si descarto esto funciona. Pero el objetivo es iniciar un proceso de manera pausada, sacar el pid nuevo para ese proceso y luego inyectar una dll en el proceso.  Supongo que no debería poner *ph = (PHANDLE)GetCurrentProcess();  ya que estoy llamando a otro proceso diferente que sería el taskmgr.. claro que estaría cerrado yo lo iniciaria.
El código es el siguiente:
Código
  1. // injector.cpp: define el punto de entrada de la aplicación de consola.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <windows.h>
  8. #include <Tlhelp32.h>
  9. #include <wchar.h>
  10. #include <iostream>
  11. using namespace std;
  12.  
  13. void error(char *err);
  14.  
  15. HANDLE myProc = NULL;
  16.  
  17. void error(char *err)
  18. {
  19. if (myProc != NULL) CloseHandle(myProc);
  20. printf("%s", err);
  21. exit(0);
  22. }
  23.  
  24. HANDLE Startpausedprocess(char *cmd, PHANDLE hthread)//Not const char* because CreateProcess may write on it
  25. {
  26.    PROCESS_INFORMATION pi;
  27.    STARTUPINFOA si;//STARTUPINFOA is the ANSI version of STARTUPINFO.
  28.    ZeroMemory(&si, sizeof(STARTUPINFOA));
  29.    si.cb = sizeof(STARTUPINFOA);
  30.  
  31.    if (!CreateProcessA(NULL, cmd, NULL, NULL, false, CREATE_SUSPENDED, NULL, NULL, &si, &pi))//The flag "CREATE_SUSPENDED" will create the process and pause the main thread.
  32.    {
  33.        cout << "CreateProcess failed, " << GetLastError() << endl;
  34.        return NULL;
  35.    }
  36.    *hthread = pi.hThread;
  37.    return pi.hProcess;
  38. }
  39.  
  40. int main(int argc, char *argv[])
  41. {
  42. PHANDLE *ph=NULL;
  43. *ph = (PHANDLE)GetCurrentProcess();
  44. Startpausedprocess("taskmgr.exe",*ph);
  45. HANDLE processList = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  46. PROCESSENTRY32 pInfo;
  47. BOOL st = TRUE;
  48. pInfo.dwSize = sizeof(PROCESSENTRY32);
  49. Process32First(processList, &pInfo);
  50. int myPid = 0;
  51. do
  52. {
  53. std::wstring name(L"taskmgr.exe");
  54. const wchar_t* szName = name.c_str();
  55. if (wcscmp(pInfo.szExeFile, szName) == 0)
  56. {
  57. myPid = pInfo.th32ProcessID;
  58. cout << myPid << endl;
  59. break;
  60. }
  61. Process32Next(processList, &pInfo);
  62. } while (st != FALSE);
  63.  
  64. // Abrir el proceso
  65. printf("[+] Opening process %i\n", myPid);
  66. myProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, myPid);
  67. if (myProc == NULL) error("[-] Error abriendo proceso.\n");
  68. else printf("[+] Proceso abierto.\n");
  69.  
  70. // Reservar memoria para el argumento (ruta de la DLL)
  71. char thData[] = "dllmain.dll";
  72. LPVOID dirToArg = VirtualAllocEx(myProc, NULL, strlen(thData), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  73. if (dirToArg == NULL)
  74. error("[-] Error reservando memoria para argumento.\n");
  75. else
  76. printf("[+] Memoria reservada para argumento (%i bytes).\n", strlen(thData));
  77.  
  78.  
  79. // Escribir la ruta de la DLL en la memoria reservada
  80. SIZE_T written = 0;
  81. if (WriteProcessMemory(myProc, dirToArg, (LPVOID)&thData, strlen(thData), &written) == 0)
  82. error("[-] Error escribiendo memoria.\n");
  83. else
  84. printf("[+] Memoria escrita (arg %i bytes).\n", written);
  85. //Lanzar un hilo con LoadLibrary
  86. //Load the DLL
  87. //Load the DLL
  88. HANDLE rThread = CreateRemoteThread(myProc, NULL, NULL, (LPTHREAD_START_ROUTINE)GetProcAddress(LoadLibrary(L"Kernel32.dll"), "LoadLibraryA"), dirToArg, NULL, NULL);
  89. if (rThread == NULL)
  90. error("[-] Error creando el hilo.\n");
  91. else
  92. printf("[+] Hilo creado.\n");
  93. CloseHandle(rThread);
  94.  
  95. }
  96.  

El error que me devuelve a la mejor creo por hacer conversion al handle..
Código:
Problem signature:
  Problem Event Name: APPCRASH
  Application Name: injector.exe
  Application Version: 0.0.0.0
  Application Timestamp: 58cf59ba
  Fault Module Name: injector.exe
  Fault Module Version: 0.0.0.0
  Fault Module Timestamp: 58cf59ba
  Exception Code: c0000005
  Exception Offset: 000179a9
  OS Version: 6.1.7601.2.1.0.256.1
  Locale ID: 1043
  Additional Information 1: 0a9e
  Additional Information 2: 0a9e372d3b4ad19135b953a78882e789
  Additional Information 3: 0a9e
  Additional Information 4: 0a9e372d3b4ad19135b953a78882e789

Read our privacy statement online:
  http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0409

If the online privacy statement is not available, please read our privacy statement offline:
  C:\Windows\system32\en-US\erofflps.txt

Debugeando podría ver pero aún así se cual es la razón al incluir la función para que arranque mi proceso de manera pausada algo estaré haciendo mal, si me sugieres debuguear podría tambien chekearlo.