首页
社区
课程
招聘
[求助]请教看雪达人指导R0读取其他进程内存方法
发表于: 2010-10-27 16:38 8670

[求助]请教看雪达人指导R0读取其他进程内存方法

2010-10-27 16:38
8670
小弟是刚从R3下来滴新人。希望各位前辈能指点一二

在R3下 对一个没有保护滴进程 做读内存操作既简单又直观

1.FindWindow() 获取目标窗口句柄
2.GetThreadProcessId() 获取目标进程ID
3.OpenProcess() 打开目标进程
4.ReadMemory() 读取内存空间内存

本来认为在R0只是用R0滴函数代替R3滴函数而已~其实现原理是相同滴。可是好像误会啦

1.NtUserFindWindowEx() 获取目标窗口句柄
2.GetThreadProcessId() 没找到对应滴函数~~~卡住~无法进行下去啦。
3.ZwOpenProcess() 打开目标进程
4.ZwReadVirtualMemory() 读取内存空间内存

在看雪和B&G搜索了很久啦。。。例子呢能看懂滴很少。。。其主要都来自于看雪~据我分析

因为看雪高人太多。好意思在看雪发代码滴~都把自己滴代码要多花哨写多花哨~说实话我这种

水平真是看不太懂~还有一点原因呢~~我这种没保护滴进程~看雪滴高人已经没人写啦。大家

写滴都是那些变过型滴case~其代码大量部分都是处理解决变形滴~我没经验分不太清楚~每句

代码都是在处理什么~我只是想一份能做教科书滴标准代码来学习下原理~希望有高手能腾出一点

时间来帮助我。

还看到一些高人很简短滴提到KeAttachProcess~据我理解这位高人滴意思~就是可以利用这个

函数附加到进程~然后利用指针就可以读取目标空间内存~ 就好像我们在R3注入一个DLL进

目标进程一样。使自己成为目标进程滴一部分

如果我理解正确滴话~大家能不能写份完整滴例子让我有机会学习一下呢?

我真的懂什么叫一书 二搜 三问滴道理。。。以我滴技巧真滴找不到方法可以解决。。。

最后我来看雪求助啦。。。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 1489
活跃值: (1053)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
终于让LZ发现了
2010-10-27 16:53
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
发现了什么???
2010-10-27 16:57
0
雪    币: 8196
活跃值: (2791)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
如果你处于内核下.你对4GB内存地址空间有绝对的访问权(前提是地址有效).

但是.这4GB内存地址空间想必你也知道它被分了高2GB内核用和低2GB应用层程序用(一般情况下.3GB选项和XGB选项未考虑)...所谓的读取目标进程地址空间的内存.如果读的地址大于0x80000000.那属于内核地址.各个进程的都一样.都是那一份.无需切换地址空间直接读.如果读低2GB地址.则需要先切换进程地址空间.(最简单的方式是KeAttachProcess或者KeStackAttachProcess到目标进程)..然后直接访问这个地址.就可以了..如果写代码.框架代码几行就差不多了.[为什么需要切换地址空间?主要是CR3的问题.具体参考windows内存管理相关书籍.虚拟内存地址转换等.)

NTSTATUS   
ReadMemory(
           IN ULONG ProcessId,
           IN PVOID AddressToRead,
           IN ULONG LenthToRead,
           IN OUT PVOID BufferToRecviveData
           )
{
    NTSTATUS    status  =   STATUS_UNSUCCESSFUL;
    PEPROCESS   ProcessPointer  =   NULL;
    BOOLEAN     IsAttached  =   FALSE;
    __try
    {
       //检查参数啥的.都省了...你注意添加..
        status  =   PsLookupProcessByProcessId((HANDLE)ProcessId,&ProcessPointer);
        if (!NT_SUCCESS(status))
        {
            __leave;
        }
        ObDereferenceObject(ProcessPointer);
        //挂靠到目标进程地址空间
        KeAttachProcess(ProcessPointer);
        IsAttached  =   TRUE;
        //请在这里检查地址.确保要读的地址有效.
        //读取数据
        RtlCopyMemory(BufferToRecviveData,AddressToRead,LenthToRead);
        status  =   STATUS_SUCCESS;
    }
    __finally
    {
        if (IsAttached)
        {
            KeDetachProcess();
            IsAttached  =   FALSE;
        }
    }
    return status;
}

临时写的.未经详细测试..
2010-10-27 17:02
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
NTSTATUS  ReadMemory(进程ID,要读取的地址,要读取的长度,接收读取到的数据)
{
PEPROCESS EPROCESS结构指针
BOOLEAN 是否已经附加
PsLookupProcessByProcessId(通过进程ID,获取EPROCESS结构)
ObDereferenceObject(这个函数不知道是做什么的)
KeAttachProcess(附加到目标进程) 疑惑:MSDN 让使用他KeStackAttachProcess为什么?
成功附加
RtlCopyMemory(接收读取到的数据,读取的地址,读取的长度) 内存拷贝
}
高人指教我理解滴正确吗? 还有一个重要滴问题。。。我不知道如何获取PID

这个函数滴大前提就是需要手里有PID才能进行下去
2010-10-27 17:24
0
雪    币: 8196
活跃值: (2791)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
两个功能一样..KeStackAttachProcess 是KeAttachProcess的升级版.好处之一在于已经挂靠到一个进程之后并且可以在Detch之前可以再次挂靠别的进程.而KeAttachProcess不行..PsLookupProcessByProcessId会增加目标进程EPROCESS对象的引用计数.ObDereferenceObject来减少引用计数.不然会造成一点麻烦..例如僵死进程..

我只是举例.程序是可以写活的.关键是思路问题.你没有发觉吗.使用PID只是为了尝试通过PID尝试获取目标进程EPROCESS指针..因为只有获取了这个指针.才能下一步切换地址空间.实际上.获取目标进程EPROCESS指针方法一大堆..比如遍历EPROCESS链表匹配进程名..再比如.知道对方进程中某个线程的ID.得到它线程ETHREAD.然后通过ETHREAD获取进程EPROCESS..等...

Ps:我不是高人..我也是菜鸟...只是比你多翻了几页书而已.
2010-10-27 17:57
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
能帮助新人滴就都是高人啦。。。

十分感谢高人能抽出时间来指教我。。。代码很清晰。对我有很大滴帮助。
2010-10-27 18:13
0
游客
登录 | 注册 方可回帖
返回
//