原帖地址:https://bbs.binmt.cc/thread-98991-1-1.html
屏幕截图 2023-01-07 211721.jpg (83.41 KB, 下载次数: 0)
下载附件
2023-1-7 21:52 上传
一、看
IMG_20230107_211412.jpg (41.75 KB, 下载次数: 0)
下载附件
2023-1-7 21:52 上传
只有一个dex,是用了lspatch处理过的
IMG_20230107_211439.jpg (47.38 KB, 下载次数: 0)
下载附件
2023-1-7 21:52 上传
用lspatch内置了一个模块,这显然有问题,先看看
IMG_20230107_211524.jpg (271.51 KB, 下载次数: 0)
下载附件
2023-1-7 21:52 上传
模块的MainHook类里,结合“dexClassLoader”,“setDexElements”,一看便知是一代dex动态加载,这段代码在网络上流传很广,搜索全都是。
IMG_20230107_211855.jpg (111.98 KB, 下载次数: 0)
下载附件
2023-1-7 21:52 上传
这是“copyassets”,顾名思义,将dex从assets目录复制出来。
果然,assets目录有众多dex,或加密,或未加密,或混淆视听。
IMG_20230107_212300.jpg (87.59 KB, 下载次数: 0)
下载附件
2023-1-7 21:52 上传
二、析
到这里,显然关键代码都是动态加载的。那怎么处理呢?
两个方式:
1.脱壳
2.在xp模块的合适的地方插入代码,将动态加载的dex文件单独复制出来。
他这个crackme难度适宜,思路巧妙,不是无意义的全篇dcc,各位喜欢逆向的可以尝试一下。
三、解
简单起见,采用脱壳的方式(
当然,将dex复制出来也很简单,例如:在copyAssets的时候,加载两次,第一次按照他的逻辑,复制到data/.../cache,第二次按照你的逻辑,复制到你指定的地方;再例如,他最后进行dex数组修改的方法中,即“Crash666(String )”中,参数就是他的dex路径,在这直接加个fileoutputstream直接写出也行。
)
IMG_20230107_213137.jpg (121.91 KB, 下载次数: 0)
下载附件
2023-1-7 21:52 上传
四、改
脱壳后,将dex放入origin.apk,之前的classes.dex可以删掉,因为是个无用的幌子,根本不是dex文件
IMG_20230107_212346.jpg (40.4 KB, 下载次数: 0)
下载附件
2023-1-7 21:52 上传
回填后打开Mainactivity
IMG_20230107_213706.jpg (89.98 KB, 下载次数: 0)
下载附件
2023-1-7 21:52 上传
对唯一的Button设置onclick监听
IMG_20230107_213732.jpg (112.3 KB, 下载次数: 0)
下载附件
2023-1-7 21:52 上传
click后,传入数据验证。
IMG_20230107_213750.jpg (316.28 KB, 下载次数: 0)
下载附件
2023-1-7 21:52 上传
这么一大堆,显然就是关键点了。
这里,最简单的方式是log注入看看(
当然,未必有效,比如他转而比较hashcode,或转成char[],转成byte[]后一系列操作就不行
)
IMG_20230107_213926.jpg (86.39 KB, 下载次数: 0)
下载附件
2023-1-7 21:52 上传
打印方式选择所有返回值为String的函数。
运行,看看结果。
IMG_20230107_214236.jpg (194.16 KB, 下载次数: 0)
下载附件
2023-1-7 21:53 上传
在“密码错误”上面的“CrashErrorCrash”就很像密码,事实证明也确实是。
看了这个app后的一些想法:
一、自己hook自己,修改自己本身的逻辑
二、像一些签名校验相关,通过PLT或inline hook IO相关的函数,那我自己也把自己重定向了呢,然后二次重定向会发生什么?
三、用破解的办法来保护,例如MT 的新过签,置换Packageinfo的CREATOR,那大可以再次置换回去,抄一下CREATOR原始的代码,自己写一个置换回去。