mysql中字符串拼接函数_hook init_array中函数解密ollvm加密字符串

本文介绍了如何使用Xposed框架和Android-Inline-Hook库来hook安卓应用中的init_array节,以解密加密字符串。作者通过IDA分析SO文件,定位到解密函数,并实现动态加载库进行hook,最终成功获取解密后的字符串。
摘要由CSDN通过智能技术生成

9eeaf5e612e3cbbefce420c61d5235b3.png

本文为看雪论优秀文章

看雪论坛作者ID:别致疯子

0d9ce05cda092d0340f3f5f86bb4a535.gif

前 言

0d9ce05cda092d0340f3f5f86bb4a535.gif
这是2W班8月份的练习题。题目要求是:
ollvm针对加密字符串的解密都是在位于init_array节当中的函数。请编写Xposed插件,完成对测试apk中位于init_array节中的函数的hook,并获取对应的解密后的字符串。   思路:刚刚开始只是为了解题怎么方便怎么来,app是32位的,所以在android 6下使用这个支持32位的hook库,https://github.com/ele7enxxh/Android-Inline-Hook,在加载Xposed的时候动态载入 libnative-lib.so ,然后对init_array中的函数进行hook,在进行主动调用,打印关键字符串。   0d9ce05cda092d0340f3f5f86bb4a535.gif

解 体 过 程

0d9ce05cda092d0340f3f5f86bb4a535.gif
1. IDA载入libnative-lib.so,简单看了下: a4db71f17c2fc6329e1f19c2facb9081.png 09213408cfc73809e4c158f87b791b3f.png
有静态注册的shell函数,猜想是这个方法sub_87c4里的一个比较,点击进入看看,byte_1B008= v2从一个地址1b008取值跟a1来比较,字符长度为5,重命名mystr。   2. 点击看看byte_1b008,【0x9F, 0x94, 0x99, 0x9F, 0x97, 0xFC, 0, 0】,交叉引用看下,发现解密在datadiv_decode9080531325931451386这个里面, byte_1B008[v11++] ^= 0xFCu; 这样一个异或,计算一下看看,其实已经看到check了。 6d9024a1a0c871d791142638b45edd51.png   3. 继续分析,去.init_array,有2个函数,一个解密的.datadiv_decode,一个里面有对byte_1b008进行参数传值的方法。 791dc826a318773453132de496533dcb.png   4. 这步解密字符串在调用sub_85e4,是不是hook它打印第一个参数就能得到我们要的结果。
unsigned long base = NULL;Dl_info dlinfo;__attribute__ ((visibility ("hidden"))) void hookMyGetstr() {     void *handle = dlopen_compat("libnative-lib.so", RTLD_NOW);    if (handle != nullptr) {        __android_log_print(4, "test02", "libnative-lib.so handle is not nullptr");        void *temp = dlsym_compat(handle, "Java_com_kanxue_hookinit_1array_MainActivity_Shell");        int rc=dladdr(temp,&dlinfo);        if(dlinfo.dli_fbase!= nullptr){            base= reinterpret_cast<unsigned long>(dlinfo.dli_fbase);        }     }      //unsigned long mtem=findBaseOff("libnative-lib.so");    if(base>0L){        //unsigned long func_addr=base + 0x85E4 + 1;        unsigned long func_addr=base + 0x85E4 + 1;        if (ELE7EN_OK == registerInlineHook((uint32_t) func_addr, (uint32_t) mygetstr,                                            (uint32_t **) &getstr)) {            if (ELE7EN_OK == inlineHook((uint32_t) func_addr)) {                __android_log_print(4, "XposedFART", "inlineHook getstr success");            } else {                __android_log_print(4, "XposedFART", "inlineHook getstr failure");            }        }    }else{        LOGD("NOT FOUND THE BASE .SO");    }}
使用dlsym_compat的时候不确定能不能找到需要hook的函数地址,所以我先dlsym_compat有导出函数名的Java_com_kanxue_hookinit_1array_MainActivity_Shell得到基址手动计算函数偏移,thumb模式,所以需要+1。
void *(*getstr)(void*, void*, void*)= nullptr;void *mygetstr(void* str, void*size, void*c){     char* tempStr=(char*)str;    __android_log_print(4, "XposedFART", "getOriArgsStr:%s",tempStr);    void *result = getstr(str, size, c);    __android_log_print(4, "XposedFART", "getResultStr:%s",(char *)result);    return result;}  void zhudongmyGetstry(){    typedef void *(*xxtest)();    if(base>0L){        //随便对一个有执行了hook方法的调用        xxtest xxtestfucnc= reinterpret_cast(base+0x876C+1);        xxtestfucnc();        __android_log_print(4, "XposedFART", "call xxtestfucnc");    }}  extern "C" void _init(void) {    __android_log_print(4, "XposedFART", "go into _init");    hookMyGetstr();    zhudongmyGetstry();}
5. 到处hook模块差不多了,传到手机,Xposed加载验证。   6c83ea60e6a1714e784844b7a60e8614.png
打印出来了~   整个过程还是比较简单的,小菜鸟一枚有什么错误的地方,欢迎指出,特别感谢r0ysue,寒冰老师~~~

844f02d602949215824f4d157e527fef.gif

- End -

8cb287df9c62ed8f45897ea736608df6.png

别致疯子

https://bbs.pediy.com/user-home-491302.htm

 *本文由看雪论坛 别致疯子 原创,转载请注明来自看雪社区。

 安卓应用层抓包通杀脚本发布!

《高研班》2021年3月班开始招生!?

aa8076bd8db13f8beb7153239daa8239.png

* 戳图片了解详情

# 往期推荐

  • IDA7.5 启动基础配置
  • 安卓应用层抓包通杀脚本发布!《高研班》2021年3月班开始招生!

  • Kraken攻击恶意样本

  • CVE-2017-0263 win32k.sys内核漏洞分析

  • Go恶意样本分析

dc3c8c8aba9bc04a73b29607d70bce55.png 公众号ID:ikanxue 官方微博:看雪安全 商务合作:wsc@kanxue.com c4513a40347878e279d21f8979b8d385.gif

球分享

c4513a40347878e279d21f8979b8d385.gif

球点赞

c4513a40347878e279d21f8979b8d385.gif

球在看

1d7793572eb7249d9c6bbbd86ca4ee18.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值