V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
paparika
V2EX  ›  Linux

.so 库如何在运行时获取自己的 SHA-2?

  •  
  •   paparika · 2018-02-01 11:09:24 +08:00 · 4046 次点击
    这是一个创建于 2248 天前的主题,其中的信息可能已经有所发展或是发生改变。
    24 条回复    2018-02-03 00:05:42 +08:00
    dirtycold
        1
    dirtycold  
       2018-02-01 12:07:20 +08:00
    没办法获取自身的路径吧...
    ipoh
        2
    ipoh  
       2018-02-01 15:48:28 +08:00
    先获取当前运行程序的路径,然后获取依赖的.so 文件列表
    在.so 源文件中定义一段字符串,查找哪个.so 文件包含该字符串
    VYSE
        3
    VYSE  
       2018-02-01 15:56:24 +08:00
    cat /proc/self/maps
    sha256sum {path}
    paparika
        5
    paparika  
    OP
       2018-02-01 17:22:54 +08:00
    @ipoh @VYSE @blahgeek
    谢谢几位,其实我本来想 so 库通过校验 hash 是否一致来判定自己是否被篡改,不过这个思路好像逗逼了,因为要提前编译好 so,然后会得到一个 hash 值,代码运行时找到 so 路径然后判断 hash 值是否一致,但是一旦把这个 hash 值编译进 so 库,库被改变,其 hash 也会变。。。。

    其实是之前参考 stackoverflow 上的一个帖子: https://stackoverflow.com/questions/15318795/android-shared-library-integrity-protection

    from Freedom_Ben:
    'The best way to protect from modification is to take a SHA-2 of the .so after you compile it, and rehash each time at runtime, matching it against the known value.'

    不过他没详细说怎么个操作
    Arnie97
        6
    Arnie97  
       2018-02-01 17:25:13 +08:00 via Android
    算储存 Hash 区域以外部分的 Hash 不就行了
    blless
        7
    blless  
       2018-02-01 17:28:24 +08:00 via iPhone
    可以联网吗,可以联网就用请求的方式发到服务端校验
    undeflife
        8
    undeflife  
       2018-02-01 17:39:47 +08:00
    用自己的证书对库文件签名?
    paparika
        9
    paparika  
    OP
       2018-02-01 17:44:25 +08:00
    @Arnie97 这思路不错,实际操作的话,用 readelf 之类的工具定位一下各个区的位置,然后计算的时候跳过去?
    paparika
        10
    paparika  
    OP
       2018-02-01 17:44:54 +08:00
    @blless 联网确实是一种思路
    paparika
        11
    paparika  
    OP
       2018-02-01 17:45:16 +08:00
    @undeflife 能具体点吗
    qmm0523
        12
    qmm0523  
       2018-02-01 18:12:16 +08:00
    so 库不加固的话,单纯检查哈希没有意义,直接把你哈希改掉就可以了。
    还不如上个 vmp 壳
    paparika
        13
    paparika  
    OP
       2018-02-01 18:23:15 +08:00
    @qmm0523 有什么免费的加固方案推荐吗
    Technetiumer
        14
    Technetiumer  
       2018-02-01 20:55:01 +08:00
    hash 被非對稱加密並簽名后存成獨立文件,so 庫讀取 hash 文件解密並驗證簽名以保證 hash 文件沒有被篡改,判斷自身是否與 hash 文件解密后的結果相符
    zckevin
        15
    zckevin  
       2018-02-01 21:05:01 +08:00
    判断的逻辑和校验值都可以直接被改掉,还是得加壳吧。
    tylerdurden
        16
    tylerdurden  
       2018-02-01 21:06:33 +08:00
    @Arnie97 这个方法赛高
    ghostheaven
        17
    ghostheaven  
       2018-02-01 22:25:21 +08:00 via Android
    文件签名?
    kaneg
        18
    kaneg  
       2018-02-01 22:30:54 +08:00
    java jarsigner 的思路是否可行?
    ysc3839
        19
    ysc3839  
       2018-02-01 23:11:41 +08:00   ❤️ 1
    @paparika 编译的时候 Hash 写一段固定的 Pattern,比如 AAAAAAAAAA,然后计算 Hash,把 Hash 覆盖掉这段 Pattern。计算的时候把 Hash 替换成 Pattern 然后算。
    VYSE
        20
    VYSE  
       2018-02-02 10:53:56 +08:00
    @paparika #5 读 /proc/self/maps 找到自己 so 内存地址,然后把指针,长度传到 SHA256()函数里就行了
    VYSE
        21
    VYSE  
       2018-02-02 10:56:11 +08:00
    @VYSE #20 至于文件真 SHA256,通过版本号联网,本地太容易被改,除非上证书签名
    BXLR
        22
    BXLR  
       2018-02-02 16:53:55 +08:00
    app 拿来测试下
    paparika
        23
    paparika  
    OP
       2018-02-02 18:24:11 +08:00
    @ysc3839 偷天换日,聪明!
    ysc3839
        24
    ysc3839  
       2018-02-03 00:05:42 +08:00
    @paparika 这也是在网上看到的思路
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5422 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 08:42 · PVG 16:42 · LAX 01:42 · JFK 04:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.