App逆向入门

day05 App逆向快速上手

app逆向课程:

  • 环境搭建 & Java语法基础 & 安卓开发 & NDK
  • 案例

平台:

  • Web框架

今日概要:app逆向的快速上手和必备环境搭建(上)。

  • 安装模拟器( 易mumu)
  • 抓包工具 charles 、Drony
  • 反编译工具:jeb、jadx、GDA(Java代码)

1.安装模式器

PC上的安卓模拟器有很多。

  • windows,逍遥、夜神、 易mumu 等。
  • mac, 易mumu。注意:暂不匹配mac的m1。

下载地址:https://mumu.163.com/mac/index.html

2.抓包工具 charles

2.1 下载并安装

  • mac用户
  • windows用户:

2.2 配置

打开 【Proxy】>【Proxy Settings】设置代理IP端口:

模拟器连接 charles代理:填写IP和端口。

手机上安装证书:

提醒:

  • 在模拟器上配置charles,安装证书。
  • 在安卓手机上配置charles
    • 手机 android7以下,可以用上面的方法 —-> 受信任的证书。
    • 手机不能用上面的方法(获取root权限)—-> 用户级别、系统级别。

安装成功后,就可以在charles中进行抓包了。

案例:链家APP

3.抓包工具 Drony

有些安卓开发在OKHttp设置Proxy.NO_PROXY来屏蔽系统代理。

例如:得物app无法抓到包,无法看到有用数据。

3.2 配置

3.3 成功抓到

  • 请求头中的4个算法,找到。

  • 请求体加密2个算法,找到。【今天来搞它,我来搞,你们看。】

  • 发现请求体发送的是密文,这是怎么回事呢/p>

    那么问题来了果我们要模拟B站发送这个请求,是不是就需要了解他这个请求体到底是用什么方式加密的,然后才能去伪造。

    此时怎么办呢下来就需要一个反编译工具,将B站的apk文件反编译成安卓代码(Java代码),我们通过研究Java代码来查看他的内部算法,从而用Python来直接实现。

    5.反编译工具

    现在比较好用且方便的反编译工具:JEB、JADX、GDA(win)。(依赖JRE)

    5.1 安装JDK

    其实此处安装JRE即可,由于后续我们要学习Java开发,直接安装JDK。(JDK中包含JRE)。

    5.2 jadx

    下载地址:链接: https://pan.baidu.com/s/1urJFD5mMp7W1mlH6UAMlJA 提取码: k9p7

    免安装,直接解压并打开即可。

    反编译出来之后,就需要根据 关键字、调用关系、Hook(后期讲)的方式找到相关代码。

    5.3 jeb

    下载:链接: https://pan.baidu.com/s/15JAJBLROsSG4VEsOL8QoMA 提取码: ucv0

    免安装,解压后直接打开:

    6.案例:B站app播放

    现在,请求包抓到了,反编译的代码也有了,接下来,就要定位到代码具体在哪里了。

    那么问题来了,怎么才能定位到代码的位置呢/p>

    • 根据关键字搜索
    • 看得懂Java代码,掌握安卓开发的基础。
    • 根据经验去猜测 并 验证(配合后期的Hook)

    jeb3.0 版本反编译的代码( B站v6.42版本)

    App逆向入门

    分页和验证过程:

    • 按照key排序进行拼接
    • 将拼接后的内容进行 sha256加密(盐:9cafa6466a028bfb)
    • 再拼接 sign=加密后的值
    • 对最后加密的值再进行 AES加密(key=fd6b639dbcff0c2a1b03b389ec763c4b、iv=77b07a672d57d64c)

    用Python代码实现。

    import base64import requestsimport refrom Crypto.Cipher import AESfrom Crypto.Util.Padding import padimport stringimport randomimport timeimport hashlibSALT = "9cafa6466a028bfb"KEY = "fd6b639dbcff0c2a1b03b389ec763c4b"IV = "77b07a672d57d64c"def get_video_info(bvid):    session = requests.Session()    res = session.get(url="https://api.bilibili.com/x/player/pagelistvid={}&jsonp=jsonp".format(bvid),    )    cid = res.json()['data'][0]['cid']    res = session.get(url="https://api.bilibili.com/x/web-interface/viewid={}&bvid={}".format(cid, bvid),    )    res_json = res.json()    aid = res_json['data']['aid']    view_count = res_json['data']['stat']['view']    # total_duration = res_json['data']['duration'] # 总时长    duration = res_json['data']['pages'][0]['duration']  # 当前视频长度    return aid, bvid, cid, view_count, durationdef create_random_mac(sep=":"):    """ 随机生成mac地址 """    def mac_same_char(mac_string):v0 = mac_string[0]index = 1while index  len(mac_string):    if v0 != mac_string[index]: return False    index += 1return True    data_list = []    for i in range(1, 7):part = "".join(random.sample("0123456789ABCDEF", 2))data_list.append(part)    mac = sep.join(data_list)    if not mac_same_char(mac) and mac != "00:90:4C:11:22:33":return mac    return create_random_mac(sep)def create_device_id(mac):    """    根据mac地址生成 3.device_id    :param mac: 传入参数的格式是 00:00:00:00:00    :return:    """    def gen_sn():return "".join(random.sample("123456789" + string.ascii_lowercase, 10))    def base64_encrypt(data_string):data_bytes = bytearray(data_string.encode('utf-8'))data_bytes[0] = data_bytes[0] ^ (len(data_bytes) & 0xFF)for i in range(1, len(data_bytes)):    data_bytes[i] = (data_bytes[i - 1] ^ data_bytes[i]) & 0xFFres = base64.encodebytes(bytes(data_bytes))return res.strip().strip(b"==").decode('utf-8')    # 1. 生成mac地址(保证mac中的每个元素是不重复的,例如:0000000000)    mac_str = mac    # 2. 去除IP地址中的符 ,只保留 48e1e828e02e(变小写)    mac_str = re.sub("[^0-9A-Fa-f]", "", mac_str)    mac_str = mac_str.lower()    # 3. 获取手续序列     sn = gen_sn()    # 4. 拼接并进行base64加密    total_string = "{}|||{}".format(mac_str, sn)    return base64_encrypt(total_string)def sha_256_encrypt(data_string):    sha = hashlib.sha256()    sha.update(data_string.encode('utf-8'))    sha.update(SALT.encode('utf-8'))    return sha.hexdigest()def aes_encrypt(data_string):    aes = AES.new(key=KEY.encode('utf-8'),mode=AES.MODE_CBC,iv=IV.encode('utf-8')    )    raw = pad(data_string.encode('utf-8'

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2022年7月14日
    下一篇 2022年7月15日

    相关推荐