山东001在线

 找回密码
 立即注册
搜索
查看: 91|回复: 0

[美女] 洞察:Android Kernel 源码环境2023/3/28 12:19:14

[复制链接]
  • TA的每日心情
    开心
    2023-10-11 21:31
  • 签到天数: 104 天

    [LV.6]常住居民II

    发表于 2023-3-28 12:19:17 | 显示全部楼层 |阅读模式

    工欲善其事必先利其器游戏逆向的相关问题可以到网站了解下,我们是业内领域专业的平台,您如果有需要可以咨询,相信可以帮到您,值得您的信赖!




    前言

    本篇将会搭建一个完美的LK及其内核模块的源码阅读开发环境









    因为K源码在是太庞大了,打开一个文件,想要详细的研究研究,甚至上手写两句代码,即没有高亮提示,也没有代码跳转。在这种情况下,想要理清楚内核源码,相当不易。



    用CL貌似不太行。K的构建体系是而不是类似于LLVM的CM。C直接打开K源码是法被CL解析的。


    用SI貌似不是非常完美。对于K源码来说,很多函数一样,只是适用于不同架构罢了。SI在跳转的时候,全源引索,并不会帮我们加以区分。诸如此类的问题,SI还有很多强迫症患者表示很难受~


    用VC貌似更不行VC对CC++代码的高亮提示,依托于CC++EP这个插件,我不清楚别人体验如何,至少对我来说,这个插件有多烂,我都不想多做评价



    浅谈代码索引

    为什么IDE集成开发环境可以完美的索引项目代码参考于,我了解到了语言服务器这个东西。


    什么是语言服务器,有什么作用



    简单来说,VC,VIM等等,都是文本编辑器的性质,可以让我们愉的编辑代码。而,等等,都是代码编译套件,可以将我们的源码文件编译出来。比较后,-等等,就属于语言服务器,就是他们的工作,才使我们的源码具备了高亮提示和代码跳转方面的功能。
    其,各大IDE可以完美的对代码做解析服务,多半也是内部集成了语言服务器。



    CL对代码索引的功能貌似就是通过现的。




    如何让语言服务器运作起来我们现在知道了,想要对语言的代码做解析,就需要这个语言服务器。那么,如何让运作起来呢对代码做解析,需要_文件。


    该文件是什么作用这个文件记录着我们对源码编译时候的每个命令,用的什么编译器,提供的什么编译参数,链接了哪些库,设置了什么宏,编译的什么源码文件等等。如此,就可以通过编译命令,详细的了解到整个编译流程。


    如何生成该文件



    对于项目来说,常规来讲,可以使用来对源码生成_文件。





    1


    2





    ##原编译命令--不生成_



    ##使用--生成_





    对于CM项目来说,这个相当简单。参考于,只需要设置CMAKE_EXPORT_COMPILE_COMMANDS为T即可在编译后生成_文件。





    1





    (CMAKE_EXPORT_COMPILE_COMMANDS
    T
    )








    这里特别提一嘴,对于体系编译的的项目脚本,其本质上是,但是对于安卓的来说,生成编译描述文件非常简单官方有提供命令








    1





    -
    GEN_COMPILE_COMMANDS_DB
    =

    ##构建的时候顺便生成_





    所以,理论上来说,搭建的这套代码解析方案,不仅仅适用于K源码阅读。也适用于各种交叉编译


    敲定方案

    毫疑问K的源码大多是文件,以及少部分的汇编文件,设备树文件




    明确一点,我们需要支持。首先看看VC有没有插件,搜了一下,果然有。
    我们需要对内核编译的流程,生成描述文件。

    这里我找到一个项目,可以把已经完整编译好了的内核解析出编译描述文件出来:。
    如何使用将在下面细说。

    K正好是体系,理论上是可以用B的。由于我做教程的时候,已经把内核编译结束了,在不想重新编译内核,理论上选哪个都一样,我们只是要个编译描述文件罢。






    使用套件比较终定型:VC++编译描述文件+CC++EP

    虽然CC++EP相当的烂,但是部分CC++方面的东西,还需他提供支持。所以这里依然需要安装该插件,后续在设置中禁用掉他的代码提示服务,转交给插件即可。





    关于插件




    这个插件会络下载的文件,很多人可能络不佳,会下载失败。
    这里不需要担心这个,我们只管安装插件即可,里面自带的就可以提供语言解析服务了,VC设置里面指定路径即可。
    而且,貌似高版本有什么大病

    开始动手

    完整编译内核



    这里以ACK(ACK)为例因为ACK的编译比较简单,不会出乱七八糟的错误,G基本上完善好了一键编译体系。
    参考

    这里默认读者会换源或者其他手法保持络通畅



    步骤简述:

    初始化库





    1


    2




    ##这里选择--5分支



    -
    :







    -

    -

    -
    5





    同步库代码





    1









    漫长的等待
    选择自己需要的文件,开启脚本这里以64为例





    1




    BUILD_CONFIG
    =


    64







    等待一段时间后,内核即可编译完成:


    生成编译描述文件



    仔细观察我们编译的目录,会发现有很多后缀为的文件,这些其就是编译过程中的临时文件,包含了编译命令等。
    其就是利用编译后的等文件做解析,生成编译描述文件_。
    步骤简述:

    进入内核源码的根目录,将项目拉下来:





    1


    2


    3


    4





    #进入内核源码根目录


    #--项目到文件夹


    #该文件夹为配置文件夹类似于



    -
    -

    =
    1
    :







    -

    -






    运行脚本,并指定-O参数到编译产出目录:





    1


    2


    3






    _
    -
    O




    -
    5






    -
    |_


    #------888862N:_




    可以看到,源码目录下的_文件已经生成。

    对于O--编译的内核模块详细见原项目地址的这一套代码解析方案也完美的适用于O--的内核模块





    配置VC对于VC来说目录下,是一些配置文件。我们修改原项目的文件,内容修改成如下:







    1


    2


    3


    4


    5


    6


    7


    8


    9




































































    32


    33


    34


    35


    36


    37


    38


    39


    40


    41


    42


    43


    44


    45


    46


    47


    48


    49


    50


    51


    52


    53




    {



    ""
    :{



    ""
    :
    ""
    ,



    ""
    :
    ""
    ,



    ""
    :
    ""
    ,



    ""
    :
    ""



    },



    "OP"
    :,



    "OS"
    :,



    "OT"
    :,





    关闭C

    C
    +
    +
    EP插件的提示防止其与冲突



    "C_CS"
    :
    "D"
    ,



    "C_CSEF"
    :
    "D"
    ,



    "C_CSE"
    :
    "D"
    ,



    "C_C"
    :
    "D"
    ,


    S'







    指向路径



    ""
    :
    "NDK--86_64"
    ,



    ""
    :[





    _文件的目录位置



    "----=${F}"
    ,





    让C生成更详细的日志



    "--="
    ,





    输出的JSON文件更美观



    "--"
    ,





    全局补全



    "----"
    ,





    建议风格:打包(重载函数只会给出一个建议)相反可以设置为



    "---="
    ,





    跨文件重命变量



    "----"
    ,





    允许补充头文件



    "---="
    ,





    输入建议中,已包含头文件的项与还未包含头文件的项会以圆点加以区分



    "----"
    ,





    在后台自动分析文件基于_



    "---"
    ,





    启用C
    -
    T以提供「静态检查」



    "---"
    ,





    C
    -
    T静态检查的参数,指出按照哪些规则进行静态检查





    参数后部分的
    *
    表示通配符





    在参数前加入
    -
    ,如
    -

    -

    -

    -

    -

    ,将会禁用某一规则



    "----=-*,-*,-*,-*,-*,-*"
    ,





    默认格式化风格:谷歌开源项目代码指南



    "---="
    ,





    同时开启的任务数量



    "-=2"
    ,





    化的位置(或,选择会增加内存开销,但会提升性能)



    "---="
    ,





    启用这项时,补全函数时,将会给参数提供占位符





    我选择禁用



    "----="



    ],


    }




    注释已经写到相当清楚,这里不再赘述。


    打开K根目录,等待索引结束



    我这里是远程连接的L虚拟机。
    打开源码根目录后,随便打开一个文件,触发VC的插件后,他会提示你,你的默认配置会被目录下的文件覆盖,是否确认:
    这里当然选择YES,使用我们配置的。
    停留在文件上面,等待一段时间,则会出现如下画面:
    左边会出现缓存目录,里面不断缓存着整个内核源码的索引。
    左下角有一个,意味着解析整个源码的进度。
    当解析结束后,打开内核源码的任意文件,都可以自由的跳转头文件,跳转到函数定义和现,智能提示函数和结构体等等。就和用IDE写代码一样,非常丝滑舒服。
    所有的索引都在一秒不到内可以完成,而且也不会高额占用机器性能。
    甚至他还会结合编译的,对未开启的代码块不高亮显示:


    做一些润滑

    你发现会报很多关痛痒的警告:



    内核源码根目录下,新建一个文件,内容如下:







    1


    2


    3


    4


    5


    6




    CF:



    A:[
    -
    W
    -

    -

    -
    ,
    -
    W
    -

    -
    ,
    -
    W
    -

    ]





    D:



    CT:



    R:
    -

    -






    RW后,W消失不见。

    小技巧:

    +T全内核源码搜索S
    +S+当前文件搜索S
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Archiver|山东001在线 ( ICP11027147 )

    GMT+8, 2026-4-4 15:42 , Processed in 0.040039 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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