关于安卓逆向

发布于:2023-05-22 ⋅ 阅读:(253) ⋅ 点赞:(0)

Apktool一定要用最新版
Jadx可视化逆向工具,拖入APK可以直接把Smali代码反汇编成Java代码,可读性比Jeb好,有时候有的地方反汇编不了
Jeb收费,好就好在可以动态调试,需要把APK重新打包,打开开发者选项,然后修改全局可调试 ro.debuggable 1
或者修改AndroidManifest.xml,在application节点下添加属性 android:debuggable="true",然后Jeb动态调试有D标识就可以动态调试了
AndroidKiller里面有个全局文件搜索器挺好用的,可以搜索某目录下所有子目录的文件是否包含某一字符串,如果搜索中文把编码设置成UTF-8

如果反编译出现 
Exception in thread "main" org.jf.dexlib2.dexbacked.DexBackedDexFile$NotADexFile: Not a valid dex magic value: cf 77 4c c7 9b 21 01 cd
提示很明显,就是非法Dex,这是因为apk里有加密过后的dex文件,比如有些apk的assets目录下有加密后的Dex文件,添加–only-main-classes参数即可
--------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------
关于Cocos2D
用Apktool反编译,lib目录下有libcocos2dlua.so文件或者类似的文件,基本断定是cocos2d引擎做的。这种情况下几乎从源码里看不出来有用的东西,所有的游戏逻辑一般都是放在lua里面执行,java代码调用lua。assets目录下一般会有编译好的luac文件,用记事本打开会是乱码,因为已经加密了(类似这样:SQLLiteData旜,貇寥埘|┠L泚?熸瑼曹鈼激B?←阸?8{A釉2OD\餆契f贅?.椠je洳,s▏坏%鵯Hjw瞙)
SQLLiteData这个是签名值,这时候需要用IDA Pro打开libcocos2dlua.so文件,然后打开string窗口去搜索这个签名值,如果能搜索到一般在附近就会出现秘钥Key,然后用XXTEA这个软件输入签名和Key就能得到解密后的lua源码。如果搜不到或者不是用XXTEA加密的就需要在so文件里动态找解密函数,然后还原,大概就是根据cocos2d-lua的加载过程去找解密方法(LoadBuffer函数)。得到解密过的lua代码就好分析了
*****如果游戏有热更新一般逆向APK里面的lua代码是过时的,想分析现在这个版本的lua代码需要用adb push导入和adb pull导出。把apk私有目录下的文件导出到硬盘,会有最新的lua代码,动态调试的话,大概就是修改过lua代码过之后,然后在导入到APK私有目录下重新运行游戏,最好导入过之后再导出一遍,确保修改过的lua代码已经覆盖。
--------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------
关于Fiddler
如果抓Https的包需要先安装Fiddler的证书才能抓到。
如果响应体是用的gzip压缩的,一般Fiddler会自动解码。
如果请求体是这样的(       A  E  ׵    &  Θ h1  i     y  3 Luw   3c   jJ =  Ԩ h   xbI 9ĭe   G ٖ r   vN }S~  i  
  7k      )东西,不要慌,看看请求头里是不是有这个(Accept-Encoding: gzip),这种一般不是软件加密了,而是传输用的gzip压缩了,Fiddler只会自动解析响应体的gzip压缩,想看请求体传的是是什么,Fiddler右键这个链接,保存请求体到电脑,保存过是没有后缀的,更改成.zip后缀的打开,把里面的那个文件解压出来,用记事本打开就会是明文。
--------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------
关于BASE64编码还原成字符串
用在线解码的网站,建议用能输出十六进制解码结果的网站,比如这个The-X 在线工具箱 Base64 解码 AES RAS 解码 加密
因为很多网站只支持解码结果是字符串的,如果编码之前根本就不是字符串的话,去解码之后,只能输出字符串的网站是显示空白的。
因为这事儿,逆向一个app密码加密算法的时候,困惑了我好久。因为看代码像是先把一个BASE64编码解码之后,得到的秘钥,然后用这个秘钥和明文密码进行的DES加密,但是这个BASE64编码在普通的在线解码网站解析出来的都是空白,直到我突然想到会不会解码出来的根本不是字符串而是十六进制,找到了上面那个网站,解码成十六进制,再用这个网站的在线DES,用这个十六进制做秘钥才验证了密码是这样加密的(有很多在线加密的网站秘钥只能输入字符串,而如果秘钥是十六进制的弄到死也不可能验证出来是不是用的这种加密算法)
--------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------
关于ReactNative
如果APK是用ReactNative框架做的,基本上反汇编之后的Java代码也是没什么用的,也是java代码调用RN。
判断是不是用ReactNative做的方法就是,去反汇编目录下assets目录下有没有index.android.bundle这个文件
ReactNative写的app,所有逻辑一般都在这个文件里,这个文件用记事本打开是JS代码。
 找关键代码的思路要么就是搜字符串(明文或者转换成Unicode编码搜索)
要么搜createElement,因为ReactNative会把生成界面的Html标签最后转换成这个函数创建
 关于ReactNative的动态调试,就是找到要调试的函数的代码里有输出log或者toast的地方直接输出,然后重新打包APK。如果当前函数没有,调用者函数里有输出的,可以直接把想输出的东西返回给调用者,下面代码直接reten。因为我还不知道怎么改函数的依赖关系,如果当前函数源代码里没有调用输出函数,而自己发现别的函数里调用过输出函数,复制过来,直接调用,就会因为没有添加依赖关系程序崩溃

--------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------

关于修改版本号
AndroidManifest里如果没有,就在apktool.ym把build文件夹和dist文件夹删除再打包,不然他会用上次编译的版本号

本文含有隐藏内容,请 开通VIP 后查看