吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2379|回复: 0
收起左侧

[其他转载] 使用ollvm编译Linux内核驱动模块.ko的正确方法、解决ollvm编译导致加载驱动报错“p...

[复制链接]
Victory.ms 发表于 2021-4-18 01:01
本帖最后由 Victory.ms 于 2021-4-18 01:04 编辑

继“[内核编程] 开源一个Linux内核里进程内存管理模块源码”的后续文章
地址:[内核编程] 开源一个Linux内核里进程内存管理模块源码


前言
使用ollvm编译Linux内核驱动模块.ko的正确方法、解决ollvm编译导致加载驱动报错“please compile with -fno-common”
此问题很久之前就已解决了,库存了挺久了,是时候发布一下吧~

起因
在编写好Linux内核驱动模块后,经过OLLVM混淆编译出来(这里我采用OLLVM9.0.1编译)。再加载进真机手机发现报错“please compile with -fno-common”(不要问我是如何Pass掉内核里验证,此问题不在此文章的讨论范围内)


失败.png


分析
可以确定的是这个错误,肯定是内核报出来的,不是我的驱动报的。随便下载一份Linux内核源码,很快就定位到了报错点在/kernel/module.c文件里

QQ截图20210418000023.png



通过分析ELF结构可以得知COM的意思:
  • STT_COMMON
    The symbol labels an uninitialized common block. See below for details.

检查.ko文件的ELF头发现确实有一大堆的COM变量,而且规律可循,每有一个混淆函数,就会带有两个COM变量,分别为x、y。这里猜测是ollvm每混淆出来的一个函数,都需要附带两个4字节全局变量才可正常执行,这两个4字节变量叫x、y。

QQ截图20210417235549.png



解决
每让ollvm混淆一个函数,自己就在源文件新建两个4字节的变量后期替换掉ollvm编译后的两个COM,如
int fake_x=0,fake_y=0;

这里变量名我随便取,取xaa3和xaa6
QQ图片20210418000704.png
可以发现,自己在源文件里面定义的变量,是没有COM这个标识的,反而变成了17,那就非常好办了,修改ELF头,替换掉OLLVM编译的COM变量指向,因为自己在源文件里定义的两个int变量并无任何用途,所有替换是没有问题的。

这里写一个小工具来替换COM变量:
Github



替换后的效果:
替换后.png
COM标志已消失。
尝试重新跑驱动
成功.png
成功来源.png


验证混淆:
拖进IDA,看看效果
QQ截图20210418001730.png
下雨一样很壮观。


大部分去除OLLVM混淆的工具都离不开一个特点,就是模拟运行,但此Linux内核驱动,首先是采用非常规手段编译出来的驱动文件,再者,目标真机手机的内核是官方最新的ROM包里的内核非自己编译的内核,官方最新的ROM里的内核都是不开放源码的,要么开源的都是第一版很旧很旧那种,想调试?死心吧),然后我采用的是非常规手段加载启动的Linux内核驱动(正常方法不行哈哈,因为会死机,我也不知道原因,懒得去查了,反正特殊方法能启动,所以想调试?很难哟)。
破解者想要去除此驱动的混淆,只能静态去混淆,但目前好像还没看到有?。反正动态调试此驱动是几乎不可能的了。

免费评分

参与人数 3吾爱币 +7 热心值 +3 收起 理由
苏紫方璇 + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
woyucheng + 1 + 1 我很赞同!
jafck + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 18:46

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表