bueno, se que no se debe de revivir post antiguos asi que preguntare sobre un post que encontre
vi un post donde hablaban de inyecciones sin DLL, abajo posteare el codigo, pero tengo una pregunta
alli se pone una estructura, despues en una funcion se llama a la estructura y despues se utiliza para saber el tamaño a reservar, pero si yo en vez de hacer esto
Código
struct TDatos_MessageBoxA { _MessageBoxA direccionMessageBoxA; char titulo[255], texto[255]; }; void Hilo_MessageBoxA(TDatos_MessageBoxA *datos) { datos->direccionMessageBoxA(0, datos->texto, datos->titulo, 0); }
Seria lo mismo que yo hiciera esto?
Código
void Message() { MessageBoxA(pID, "descifra.me", "Codigo inyectado!"); } void Inyectar_MessageBoxA(DWORD pID) //////////////////////////////////// Quitando datos.direccionMessageBoxA = (_MessageBoxA)GetProcAddress(GetModuleHandle("USER32.DLL"), "MessageBoxA"); //////////////////////////////
Y en vez dehacer una estructura solo hacer una funcion en donde si quiero iniciar un socket, funcione correctamente, o eso no es posible?
espero me puedan ayudar, les dejo el codigo completo que encontre
Código
typedef int (WINAPI *_MessageBoxA)(HWND, LPCTSTR, LPCTSTR, UINT); struct TDatos_MessageBoxA { _MessageBoxA direccionMessageBoxA; char titulo[255], texto[255]; }; void Hilo_MessageBoxA(TDatos_MessageBoxA *datos) { datos->direccionMessageBoxA(0, datos->texto, datos->titulo, 0); } int main() { DWORD pID; HWND hWnd; hWnd = FindWindow("SciCalc", NULL); if(hWnd!=NULL) { GetWindowThreadProcessId(hWnd, &pID); Inyectar_MessageBoxA(pID, "descifra.me", "Codigo inyectado!"); } return 0; } void Inyectar_MessageBoxA(DWORD pID, char* titulo, char* texto) { DWORD tamFunc; HANDLE tHandle, funcionRemota; TDatos_MessageBoxA datos, *direccionDatosRemotos; void* direccionFuncionRemota; tHandle = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, false, pID); datos.direccionMessageBoxA = (_MessageBoxA)GetProcAddress(GetModuleHandle("USER32.DLL"), "MessageBoxA"); direccionDatosRemotos = (TDatos_MessageBoxA*)VirtualAllocEx(tHandle, 0, sizeof(TDatos_MessageBoxA), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); WriteProcessMemory(tHandle, direccionDatosRemotos, &datos, sizeof(TDatos_MessageBoxA), NULL); tamFunc = (DWORD)Inyectar_MessageBoxA - (DWORD)Hilo_MessageBoxA; direccionFuncionRemota = VirtualAllocEx(tHandle, 0, tamFunc, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE); WriteProcessMemory(tHandle, direccionFuncionRemota, (void*)Hilo_MessageBoxA, tamFunc, NULL); WaitForSingleObject(funcionRemota,INFINITE); CloseHandle(funcionRemota); VirtualFreeEx(tHandle,direccionFuncionRemota,0,MEM_RELEASE); VirtualFreeEx(tHandle,direccionDatosRemotos,0,MEM_RELEASE); CloseHandle(tHandle); }