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

85 篇文章 6 订阅
83 篇文章 9 订阅

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();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值