首页
论坛
课程
招聘
[工具脚本] [源码分析] [系统相关] [HOOK注入] [程序开发] [逆向分析] [基础理论] [原创]开源一个Linux内核里进程内存管理模块源码
2020-5-5 07:59 8237

[工具脚本] [源码分析] [系统相关] [HOOK注入] [程序开发] [逆向分析] [基础理论] [原创]开源一个Linux内核里进程内存管理模块源码

2020-5-5 07:59
8237
收藏
点赞7
打赏
分享
最新回复 (35)
雪    币: 313
活跃值: 活跃值 (473)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
abcz316 活跃值 2021-5-6 10:54
26
0
asdf呵呵 手机是pixel,系统是自己编译的android10。
那就得你自己解决了。推荐国产手机,并且不要自己编译android,用官方最新的ROM就行。
雪    币: 220
活跃值: 活跃值 (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mumuya 活跃值 2021-5-10 13:17
27
0
期待你的下个教程
雪    币: 220
活跃值: 活跃值 (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mumuya 活跃值 2021-5-10 13:17
28
0
目前加载内核提示这样信息
insmod: failed to load rwProcMem37.ko: Required key not available
雪    币: 42
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_tuancc 活跃值 2021-5-10 14:31
29
0
期待楼主发内核patch加载驱动啊
雪    币: 2
活跃值: 活跃值 (280)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
asdf呵呵 活跃值 2021-5-10 20:12
30
0
abcz316 不可能,除非你的手机不是市面上的普通手机。我的手机全部是市面的普通手机,比如小米8 9 10 11
楼主,你说你用的都是国产的手机,那么是不是手机都必须先用第三方root框架拿到root权限。执行demo里的elf时都必须以root用户执行?
另外,你用的是哪个版本的linux源码,用的编译工具链是直接用的ndk工具链吗?
雪    币: 313
活跃值: 活跃值 (473)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
abcz316 活跃值 2021-5-11 00:48
31
0
asdf呵呵 楼主,你说你用的都是国产的手机,那么是不是手机都必须先用第三方root框架拿到root权限。执行demo里的elf时都必须以root用户执行? 另外,你用的是哪个版本的linux源码,用的编译工具链 ...
我是直接改boot的
雪    币: 313
活跃值: 活跃值 (473)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
abcz316 活跃值 2021-5-11 00:50
32
0
编译的工具链,随便一个llvm就行了,没要求,高版本的就行,不用NDK,NDK里面的编译器老掉牙了
雪    币: 2
活跃值: 活跃值 (280)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
asdf呵呵 活跃值 2021-5-11 01:28
33
0

楼主,关于在内核模块里获取用户空间地址对应的物理地址你看看下面的方法是否正确。


 pte_t *pte = NULL;
 phy_addr = (pte_val(*pte) & PAGE_MASK) | (vir_add & ~PAGE_MASK);

这样获取到的地址,放到你的框架里面,在检查物理地址是否合法时直接就失败了。搜了一下,又找到下面的方法:


// struct mm_struct *mm : The memory descriptor of the current process.
// unsigned long address: The virtual address to be translated.
pgd_t *pgd = pgd_offset(mm, address);
if (!pgd_none(*pgd) && !pgd_bad(*pgd)) {
    pud_t *pud = pud_offset(pgd, address);
    if (!pud_none(*pud) && !pud_bad(*pud)) {
        pmd_t *pmd = pmd_offset(pud, address);
        if (!pmd_none(*pmd) && !pmd_bad(*pmd)) {
            pte_t *pte = pte_offset_map(pmd, address);
            if (!pte_none(*pte)) {
                     struct page *pg = pte_page(*pte);
                     unsigned long phys = page_to_phys(pg);
            }
            pte_unmap(pte);
        }
    }
}

这样得到的地址倒是合法了,只是读出的数据始终对不上。后来看到有人提到要用kmap映射一下,如下:

 struct page* pg = pte_page(*pte);
 void* p = kmap(pg);
 phy_addr = virt_to_phys(p);

但这样拿到的值也是读不出来。

雪    币: 313
活跃值: 活跃值 (473)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
abcz316 活跃值 2021-5-11 01:38
34
0
asdf呵呵 楼主,关于在内核模块里获取用户空间地址对应的物理地址你看看下面的方法是否正确。 pte_t *pte = NULL; & ...
建议新手先看书。
雪    币: 2
活跃值: 活跃值 (280)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
asdf呵呵 活跃值 2021-5-11 01:55
35
0
abcz316 建议新手先看书。
关键是都不知道看什么书。内核里一些api都搜找不到详细的资料。像你说的 /drivers/char/mem.c 我看了,也没找到地址转换的代码。上面贴的第一段代码还是从样本里还原的。
雪    币: 313
活跃值: 活跃值 (473)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
abcz316 活跃值 2021-5-11 11:52
36
0
asdf呵呵 关键是都不知道看什么书。内核里一些api都搜找不到详细的资料。像你说的 /drivers/char/mem.c 我看了,也没找到地址转换的代码。上面贴的第一段代码还是从样本里还原的。
那就将每本Linux内核的书都看一遍呗,有关Linux内核的书籍我都看了十几本,我也不知道哪本适合你。
游客
登录 | 注册 方可回帖
返回