Estoy trabajando en una inyeccion sin DLL, bueno es de "sin DLL" me refiero a que no uso el clásico método de LoadLibrary, todo perfecto lo logro hacer en el propio proceso, pero surge un problema.
Al principio WriteProcessMemory no le prestaba atención, y pasaba directamente a CreateRemoteThread, me destruía el proceso. use NTCreateRemote, NTCreateRemoteEx e incluso use la API Kernel RtlCreateUserThread pero todas me devolvían el mismo resultado, el proceso dejaba de funcionar.
Comence a leer acerca del tema y descubrí que se debía a que se entraba a una zona en memoria que no contenía función alguna o incompleta; lo que me hizo enfocarme a WriteProcessMemory me devolvía el error 299 ERROR_PARTIAL_COPY, hasta ahora no encuentro nada en internet; incluso use API de mayor nivel como NTWriteVirtualMemory y de nuevo me fue al Kernel usando ZwWriteVirtualMemory todas me devolvía error las últimas dos el error 487 "Área de memoria inválida".
He intentado cambiar la protección de memoria, usar otra API para pedir memoria, pero todas me devuelven el mismo resultado...
Dejo un retazo de código.
Código: Seleccionar todo
Result := False;
hProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_WRITE or PROCESS_VM_READ{PROCESS_ALL_ACCESS}, False, dwPID);
if hProcess = 0 then Exit;
pRemoteDLL := VirtualAllocEx(hProcess, nil {pMemFile}, dwSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
//VirtualProtectEx(hProcess, pRemoteDLL, dwSize, PAGE_EXECUTE_READWRITE, nil);
if pRemoteDll = nil then Exit;
//Result := WriteProcessMemory(hProcess, pRemoteDLL, pMemFile, dwSize, dwRet);
dwRet := ZwWriteVirtualMemory(hProcess, pRemoteDLL, pMemFile, dwSize, @dwWriteRet);
lasterror;
//NewCreateRemoteThread(hProcess, nil, 0, pStartPoint, nil, 0, dwRet);
//MyCreateRemoteThread(hProcess, nil, 0, pStartPoint, nil, 0, @dwRet);
CreateRemoteThread(hProcess, nil, 0, pStartPoint, nil, 0, dwRet);
//lasterror;
Result := True;
Saludos y gracias!