逆向学习(三)

APP逆向实战

常规hook是被动,hook的函数/方法要被动等待触发,不能主动调用要hook的代码。而rpc可以主动调用要hook的代码。

rpc:

# rpc
rpc.exports = {
    var sig = "";
    get_hello: function(str){
        Java.perform(
            function(){
                var some = Java.use('XXXX');
                sig = some.get_sig()
            }
        )
    }
}


# 可以使用python主动调用。
get_hello(str)


# 常规写法
Java.perform(
            function(){
                var some = Java.use('XXXX');
                some.get_sig.implemtation = function(){
                    // do something
                }
            }
        )

抓取分析思路:
先分析目标产品形态有几种(PC,H5,小程序,APP);对目标产品形态和各功能/界面使用和了解;确定抓取哪种产品状态。

常规抓取分析:
先抓包,找到要抓的目标URL(通常是列表URL和详情URL)。通过抓包要弄清楚:请求参数的差异和特点、搞清楚哪些参数是固定值,哪些是变化值,哪些可有可无、哪些参数是主要控制返回内容的、如何翻页等。
写简单程序模拟目标URL的请求(从抓包工具中复制信息和URL到程序中)。模拟请求分三种:
    1、复制抓包header信息,模拟请求能成功。此时需要确定该header信息有无时效性,能否一直使用,时效性是多久。尝试五分钟/一小时/一天的时间间隔,使用header信息,再次模拟,检查是否请求成功。如果有时效性,可以结合抓包工具,使用定时更新header的方式进行抓取;如果没有时效性,一支可以用,则直接使用抓包的参数一直抓取。
    2、模拟请求不成功。需要逆向分析APP
    3、难度是在太大,分析APP其他版本的抓取难度(大型APP会分版本,lite版,国际版,大型节日特殊版,老版)有的老版本还需要指定版本的android系统。

复杂抓包:
即配置代理后抓不到包的几种情况:
    1、APP不走设置的代理:
        表现为:打开抓包软件,抓不到包,但APP能正常访问;关闭抓包软件后APP仍能正常访问。
        解决:ProxyDroid APP 全局代理,强制把IP转发到代理端口。
    2、APP做ssl证书验证:
        表现为:打开抓包软件后APP不能正常访问
        解决:justtrustme等Hook 校验代码,让APP信任代理证书或不做证书验证。
    3、APP做双向证书验证:
        表现为:打开抓包软件后,APP不能访问,但抓包软件上会有服务端返回的错误。
        解决:抠出APP的SSL证书,导入抓包软件
    4、APP的网络请求库代码有混淆(okhttp HttpURLConnection等):
        表现为:打开抓包软件后APP不能访问
        解决:方法一:使用升级版JustMePlus姿势配Hook混淆后的网络请求库代码(自适配okhttp);方法二:使用sll_logger Hook系统ssl_read ssl_write函数,在手机上抓包,无需配置代理和安装证书。
    5、APP不是发的应用层http协议,使用socket走的是网络层tcp协议
        表现为:打开抓包软件,抓不到饱,但APP正常反问,关闭抓包软件后也能正常访问。
        解决:tcpdump或wireshark抓tcp包,找线索hook app代码,抓到发包和解包的代码出。发送的数据通常是私有协议,需要逆向解密。
    6、能抓包,但返回数据加过密,看不懂。
        解决:找线索HookAPP找到加解密代码。

各种APP
网络请求库由第三方提供,HTTP/HTTPS/WebSocket协议、JustTrustMeHook没混淆的网络库、JustMePlusHook混淆后的网络库(非100%)
ssl(系统提供,ssl_logger,抓到的包输出为.pcap文件,需要用专门软件打开。使用方式:python ssl_logger.py -pcap xin.pcap -verbos com.touchtv.touchtv(可以换成进程id))
socket(系统提供,Tcp链接)
AndroidIOS

tcpdump
https://www.androidtcpdump.com/android-tcpdump/downloads
adb push tcpdump /data/local/tmp/
chmod 777 tcpdump
/data/local/tcpdump -p -s 0 -w /sdcard/test/dp.pcap
-p不使用混杂模式
-s 0抓取完整长度的包
iptables -A OUTPUT -j DROP -d w.x.y.z
-d 目标ip

frida-rpc远程调用
手机上运行frida server(./firda_server -l 0.0.0.0&)
开发机:
    device_manager = frida.get_device_manager()
    device = device_manager.add_remote_device("192.168.0.107")
    session = device.attach('com.XX.XX')
远程调用(在一个局域网内):
s = frida.get_remote_device()
session = a.attach('')
http://www.matools.com/api/java8

如何确定APP没走HTTP而是走TCP:
1、配置好代理抓包,打开抓包软件,APP能正常访问;
2、使用抓包软件抓不到想要的请求;
3、关闭抓包软件(配置不取消),APP也能正常访问。
该现象和APP不走代理的现象相似。
在手机装httpcany APP(可以抓http/https tcp udp),对指定APP进行抓包,观察有无数据包比较大的tcp包(10K以上),如果有可以确定APP走的TCP连接。
wireshark/tcpdump抓网卡的tcp/udp包的缺点:数据包太多,不能指定对象抓包,过滤麻烦。

搞定app走socket通信的抓包方案:
方案一:
部分APP备有两套通信方案,当其走不通socket时会切换走http。
此时使用iptables屏蔽走tcp的IP:
    屏蔽指定IP:iptables -A OUTPUT -j DROP -d 111.111.111.111
    清空屏蔽规则:iptables -F
    手机重启也会使iptables的规则失效
在httpcany上识别要屏蔽的IP,持续观察和屏蔽数据包,直到APP切换走http为止。
缺点:有的APP只有一套通信方案(如游戏),屏蔽之后,APP将不能正常访问。
方案二:
APP有两套方案时,使用Hook的办法让APP不走socket,走http。
使用mtopsdk(Android Mtop网关接入文档。https://help.aliyun.com/document_detail/69785.html)Hook Mtop让其不走socket。其sdk对外开放,使用sdk的APP均可以使用。
方案三:
直接抓包socket,破解socket里的通信内容。

Java.choose的使用
原型:Java.choose(className, callbacks)
作用:在内存中扫描Java的堆(heap)找到指定类(className)的实例化对象
例子:Java.choose('com.Tester.Mtop.a', {"onMatch":functnion(instance){}, "onComplete":function(){}})

TCP抓包
wireshark:可视化,windows/linux/mac都能用,不能运行在手机上。(https://www.wireshark.org/download.html)
tcpdump:命令行,运行在手机上,抓取的数据存为pcap格式,需要用wireshark打开分析。(tcpdump -i wlan0 -p -s 0 -w dp.pcap    -i 指定网卡。-p不使用混杂模式。-s 0抓取完整长度的包。-w数据包写入指定文件。https://www.androidtcpdump.com/android-tcpdump/downloads)
以上两者抓的无关数据包太多,过滤很麻烦。
httpcanary:可视化,主要抓http/https的,运行在手机上,对tcp的解析不太好观看,可以指定app的包。
配合用法:先用Httpcanary抓包,找到该APP发送TCP的IP地址;再用tcpdump重新在手机上抓包,拷贝到本地电脑上来;使用wireshark打开数据包,过滤出目标IP的数据包(ip.dst==x.x.x.x)。
通过抓包tcp暴力的可见自负作为线索,反向定位代码,实现Tcp的Hook抓取。

protobuf协议逆向解析
是google开源的,数据序列化工具,相比json序列化后更节省空间,解析速度更快,传输速度更快。
中文翻译:https://colobu.com/2017/03/16/Protobuf3-language-guide/
下载地址:https://github.com/protocolbuffers/protobuf/releases/
安装python模块:python setup.py build    python setup install

数据--->protobuf数据
protobuf协议由:protobuf编译工具编译.proto语法文件,同时生成protobuf处理程序,用处理程序来解析/反解析protobuf数据。
编写.proto语法文件--->.proto文件编译成代码--->利用编译后的代码对传输数据开始加密。
将.proto文件编译成python代码:protoc --python_out=.test.proto

protobuf数据--->数据
利用工具解析并格式化protobuf数据--->根据解析后的数据,还原出.proto语法文件--->把.proto文件编译成代码--->利用编译后的代码反解protobuf数据。
反protobuf数据命令:protoc --decode_raw < test.bin
辅助解析工具:https://github.com/nevermoe/protobuf-decoder    https://protogen.marcgravell.com/decode

python crypt加密库
pip3 install pycryptodome -i https://mirrors.aliyun.com/pypi/simple/

aes加密:https://itmangoto.cn/2018/06/30/aes-key-mode-iv-padding/

你可能感兴趣的:(学习过程)