通过进程挂靠实现改其它进程的数据

3环


#include<stdio.h>
int main() {
    char *ch = "allenboy";
    printf("%c,%x", ch, ch);
    getchar();
    printf("%c,%x", ch, ch);
    getchar();
}

0环


#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);
}

猜你喜欢

转载自blog.51cto.com/haidragon/2131751
今日推荐