• 小红书app之shield 逆向


    1.通过Jni_load 找到函数偏移

    ​ 定位到jni_load 函数,跟踪函数sub_A654。如图

    其中sub_2e1f4 是对app的签名进行验证,直接nop,sub_736B0 是通过jni调用java的okhttp类的一些方法。sub_7306 是动态注册的函数。

    找到地址off_8E0D0,各个函数地址如图所示。

    2、分析各个函数的作用

    2.1 initializeNative函数

    initializeNative函数是对jni调用java方法的一些类进行初始化操作,建议对变量进行改名,类用c开头,方法用m开头便于后续分析。

    2.2 initialize 函数

    initialize 函数是从s.xml文件中读取key为main_hmac的值value。

    把读取的value使用sub_AAAC函数进行传参, sub_AAAC 函数的主要功能是对value和device_id 进行aes得到一个key,把key存入ptr + 0x28C 处, 如果sub_AAAC返回值为1,则使用新版的shield算法,反之则使用旧版的s1-s12算法。

    2.3 intercept函数

    intercept 是shield算法的逻辑部分

    通过ptr+650的值来判断使用哪种算法,sub_ABB8为新版,sub_AD14为旧版。

    sub_1fbb0函数对sub_AAAC 函数的key进行异或0x36和0x5c,这里大胆猜测shield使用的是hmacmd5算法,sub_1fbb0是对key进行初始化,sub_1fc52是对url进行md5,sub_1fc7e是对前面两步进行收尾工作计算出真正的shield。

    像这种a1+12 是一个函数指针我是通过动态调试得到函数地址。使用的是魔改的md5。

    3、算法还原

    3.1 算法流程

    1、result = md5((key ^ 0x36) + param)

    2、shield = md5((key ^ 0x5c) + result)

    aes部分的算法暂时没进行还原,md5的部分使用c语言进行了还原,本来想移植到python的,但是python没有无符号等数据类型,每一次操作都要进行&0xFFFFFFFF,心态有点爆炸,所以编译了一个shield.so供python调用,最终完成图如下:

    md5的参数为(urlpath+xy-common-params+xy-platform-info) (ps:urlpath 需要去掉? 比如urlpath为: /api/sns/v6/homefeed?oid=homefeed_recommend,传入的为/api/sns/v6/homefeedoid=homefeed_recommend)

  • 相关阅读:
    Python基础(一)
    计算机编程和编程语言
    初始Markdown
    Python模块
    Python递归以及面向过程编程
    Python推导式和匿名函数
    Python学闭包函数和装饰器
    Python函数的特点
    Python文件高级应用和如何使用函数
    Python字符编码和文件处理
  • 原文地址:https://www.cnblogs.com/gqv2009/p/14155017.html
Copyright © 2020-2023  润新知