|
Mostrar Temas
|
Páginas: [1]
|
2
|
Programación / Programación C/C++ / Codigo para cargar Drivers en el kernel
|
en: 17 Septiembre 2017, 17:45 pm
|
Mi pequeño Loader, que hace : 1-) registrar un servicio y ejecutarlo 2-) detener un servicio y eliminarlo Loader: #include <Windows.h> #include <stdio.h> char *driver = "C:\\hellowWorld.sys"; void instalar_driver() { SC_HANDLE Manager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE); if (Manager != ERROR) { printf("\nCargando el driver..."); SC_HANDLE Service = CreateService(Manager, "TEST", "TEST", SERVICE_START | DELETE | SERVICE_STOP, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, driver, NULL, NULL, NULL, NULL, NULL); if (Service == ERROR) { Service = OpenService(Manager, "TEST", SERVICE_START | DELETE | SERVICE_STOP); } if (Service) { StartService(Service, 0, NULL); printf("\nServicio Ejecutado"); } CloseServiceHandle(Manager); } } void eliminar_driver() { SC_HANDLE Manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (Manager != ERROR) { SC_HANDLE Service = OpenService(Manager, "TEST", SERVICE_START | DELETE | SERVICE_STOP); if (Service != ERROR) { SERVICE_STATUS status; ControlService(Service, SERVICE_CONTROL_STOP, &status); printf("\nServicio Detenido"); DeleteService(Service); printf("\nServicio Eliminado"); CloseServiceHandle(Service); } CloseServiceHandle(Manager); } } int main(void) { int opcion; while (1) { printf("\n2) eliminar driver de la memoria"); printf("\n3) salir del menu"); switch (opcion) { case 1: instalar_driver(); break; case 2: eliminar_driver(); break; case 3: default: printf("\n\nOpcion incorrecta"); break; } } return 0; }
Codigo del Driver #include <ntddk.h> VOID Unload(PDRIVER_OBJECT DriverObject) { DbgPrint("Driver Unloaded From Memory\n"); } NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath) { DbgPrint("Hellow World From Kernel Space\n"); DriverObject->DriverUnload = Unload; // No siempre hay que limpiar el codigo , pero si es recomendable si vamos a hacer pruebas, ya que , de lo contrario hay que reiniciar el ordenador continuamente return STATUS_SUCCESS; }
https://imgur.com/kfXwXNfhttps://imgur.com/oeWnpO1https://imgur.com/4obeza9
|
|
|
3
|
Programación / Programación C/C++ / Inyeccion Dll básica
|
en: 28 Agosto 2017, 18:31 pm
|
Como hacer una inyección básica de una dll en C Código dll #include <Windows.h> BOOL APIENTRY DllMain(HMODULE hMod, DWORD callback, LPVOID Param) { switch(callback) { case DLL_PROCESS_ATTACH: aqui ponemos el codigo que queremos que se ejecute en la dll MessageBoxW(NULL, TEXT("Hola desde proceso injectado !"), TEXT("Test"), MB_ICONINFORMATION); case DLL_PROCESS_DETACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: default: break; } return TRUE; }
codigo de la aplicacion externa #include <Windows.h> #include <stdio.h> #include <winternl.h> #pragma comment(lib, "ntdll.lib") typedef struct _CLIENT_ID { HANDLE UniqueProcess; HANDLE UniqueThread; } CLIENT_ID, *PCLIENT_ID; extern "C" NTSTATUS NTAPI ZwOpenProcess(PHANDLE ProcessHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, PCLIENT_ID ClientID); int main(int argc, char *argv[]) { char *ruta_dll = "C:\\Dlltest.dll"; ULONG pid; OBJECT_ATTRIBUTES oa; HANDLE hproc; CLIENT_ID cid; NTSTATUS status; cid.UniqueProcess = (HANDLE)pid; cid.UniqueThread = 0; InitializeObjectAttributes(&oa, NULL, 0, NULL, NULL); if(NT_SUCCESS(ZwOpenProcess(&hproc, PROCESS_ALL_ACCESS, &oa, &cid))) { if(NT_SUCCESS(status)) { HMODULE dll = GetModuleHandle(L"kernel32"); if(dll != NULL) { FARPROC load = GetProcAddress(dll, "LoadLibraryA"); if(load != ERROR) { LPVOID base = VirtualAllocEx(hproc, NULL, 256, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); if(base != ERROR) { BOOL exito = WriteProcessMemory (hproc , base , ruta_dll , strlen(ruta_dll ) + 1, NULL ); if(exito != 0) { HANDLE thread = CreateRemoteThread(hproc, NULL, NULL, (LPTHREAD_START_ROUTINE)load, base, NULL, NULL); if(thread != ERROR) { printf("\n dll inyectada en proceso id: %d", pid ); } } } } } } } return 0; }
http://imgur.com/DsEoTz4http://imgur.com/6HoVbVRhttp://imgur.com/jD3CYTH
|
|
|
4
|
Programación / Programación C/C++ / Terminar Proceso usando funciones NTAPI
|
en: 21 Agosto 2017, 20:44 pm
|
Usando NtOpenProcess para conseguir el handle del proceso NtTerminateProcess para acabarlo #include <Windows.h> #include <winternl.h> #include <stdio.h> #pragma comment(lib, "ntdll.lib") typedef struct _CLIENT_ID { PVOID UniqueProcess; PVOID UniqueThread; } CLIENT_ID, *PCLIENT_ID; EXTERN_C NTSTATUS NTAPI NtOpenProcess(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, PCLIENT_ID); EXTERN_C NTSTATUS NTAPI NtTerminateProcess(HANDLE, NTSTATUS); void main() { OBJECT_ATTRIBUTES oa; HANDLE hProc; ULONG pid; CLIENT_ID cid; printf("\n introduce pid-> "); scanf("%ld", &pid); cid.UniqueProcess = (HANDLE)pid; cid.UniqueThread = 0; InitializeObjectAttributes(&oa, NULL, 0, NULL, NULL); if(NT_SUCCESS(NtOpenProcess(&hProc, PROCESS_TERMINATE, &oa, &cid))) { NTSTATUS status = NtTerminateProcess(hProc, 1); if(NT_SUCCESS(status)) { MessageBoxW(0, TEXT("proceso terminado"), TEXT("test"), MB_ICONINFORMATION); } } NtClose(hProc); }
|
|
|
5
|
Seguridad Informática / Análisis y Diseño de Malware / C++ Conseguir Privilegios para inyectar en procesos
|
en: 8 Abril 2017, 16:20 pm
|
int privilegios() //esto nos dara los permisos para inyectar en otros procesos { HANDLE Token; TOKEN_PRIVILEGES tp; if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &Token)) { LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid); int i = GetLastError(); tp.PrivilegeCount = 1; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if (AdjustTokenPrivileges(Token, 0, &tp, sizeof(tp), NULL, NULL) == 0) { return 1; } else { if (GetLastError() == ERROR_SUCCESS) { return 1; } else { return 0; } } } return 1; } int main() { privilegios(); return EXIT_SUCCESS; }
· Los códigos deben ir en etiquetas GeSHi >aquí las reglas del foro -Engel Lex
|
|
|
|
|
|
|