12306 2.2版本SO的分析和修复

     这篇文章纯粹属于安全分析研究,请勿用于非法用途。如有侵犯到厂家,请告知作者删除

   老早写的,现在已经2.3版本了,把这个放出来,这个方法要比之前的简单很多。

      12306的so加载顺序是先libDexHelper.so后libcheckcode.so

      一、修复libDexHelper.so

      我们先把libDexHelper.so dump出来,并修复,修复后的IDA分析结果如下图:


libDexHelper.so修复好后,备用,后面需要用到这个so来辅助分析。

二、修复libcheckcode.so

先dump出libcheckcode.so

之前在_mmap2函数上dump出原始libcheckcode.so方式2.2版本已经无效了,

那么这次我们就直接等功能已经跑起来后,直接把libcheckcode.so内存dump出来

把这个dump用修复工具修复

三个关键的函数checkcoode,decheckcode,JNI_Onload,如下图所示




IDA分析结果都是arm指令集,但是JNI_OnLoad后面接着的函数却是thumb指令集,很显然,这里其实被故意改了函数的偏移。那么偏移了多少呢?

    对dlsym进行HOOK,输出如下:



JNI_OnLoad的地址是0x525a3d11-0x52585000=0x1ED11

跟IDA分析出的0x1ED50相差了0x3F

把0x1ed10指向的地址分析为函数,如下图所示,已经是正常的函数了:


checkcode和decheckcode两个函数则不行,因为这两个函数是处于加密状态

checkcode和decheckcode两个函数是动态加解密的,该函数运行前被解密,运行完后又加密回去。

那么解密点,就要找到这个动态加解密的位置。




把590c3000-100__Java_com_MobileTicket_CheckCodeUtil_checkcode.dmp文件用IDA打开(指定为arm指令集)


libDexHelper.so的基址是0x51a25000,则可以计算出解密函数地址是0x51a4c305-0x51a25000=0x27305,加密函数是0x51a4c2ed-0x51a25000=0x272ed

解密函数:


在这里的解密函数上进行hook,等其解密完后,把libcheckcode.so dump出来即可。

因为这里有两个函数decheckcode和checkcode,所以需要dump两次。

可以在解密函数里通过输入长度的大小不同来分别dump

 

将直接dlopen完dump出的libcheckcode.so和解密函数执行完dump出来的进行二进制比较,可以看到有一部分是不一样的,不一样的地方,就是被解密的函数。


那么剩下的工作就是把这两个解密后的函数二进制,写个覆盖到dlopen完的dump上,即可。这个工作可以用脚本来实现。

 

剩下需要修复的工作是:

1.把JNI_OnLoad、checkcode、decheckcode三个函数地址减去0x3f

2.修复so,使其可以正常运行

3.把init_proc函数去掉,不让其再进行解密


(创建了一个Android逆向分析群,欢迎有兴趣的同学加入,群号码:376745720)

0


发布了36 篇原创文章 · 获赞 55 · 访问量 34万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章