0环下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #include <ntifs.h> VOID DriverUnload(PDRIVER_OBJECT pDriver); // 根据PID返回进程EPROCESS,失败返回NULL PEPROCESS LookupProcess(HANDLE hPid) { PEPROCESS pEProcess = NULL; if (NT_SUCCESS(PsLookupProcessByProcessId( hPid, &pEProcess))) return pEProcess; return NULL; } VOID ChangeData(ULONG uId) { KAPC_STATE ks; //1 根据ID获得进程内核对象 PEPROCESS pEprocess = LookupProcess((HANDLE)uId); //2 挂靠到此进程上去 //需要注意:不能挂靠之后,将内存中的数据往用户层地址存储,是不对的。 //因为当挂靠到目标进程之后,用户层地址就是目标进程的了,也就存储到 //目标进程中,而且目标进程的那个地址不一定有效,可能造成崩溃。 KeStackAttachProcess( pEprocess, &ks ); //3 修改内存 char * p = (char *)0x1dfaf0; p[5] = 'h'; p[6] = 'a'; p[7] = 'h'; p[8] = 'a'; p[9] = '\0'; //4 解除挂靠 KeUnstackDetachProcess(&ks); } NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pPath) { UNREFERENCED_PARAMETER(pPath); DbgBreakPoint(); ChangeData(1716); pDriver->DriverUnload = DriverUnload; return STATUS_SUCCESS; } VOID DriverUnload(PDRIVER_OBJECT pDriver) { UNREFERENCED_PARAMETER(pDriver); } |
3环
1 2 3 4 5 6 7 8 | #include<stdio.h> int main() { char *ch = "allenboy"; printf("%c,%x", ch, ch); getchar(); printf("%c,%x", ch, ch); getchar(); } |