吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 10532|回复: 54
收起左侧

[Android 原创] 一个非常简单的安卓逆向练手app

  [复制链接]
ogli324 发表于 2021-3-4 13:15
本帖最后由 ogli324 于 2021-3-4 13:21 编辑

一个非常简单的安卓逆向练手app 8

抓包如图所示

20210304111644.png

base解码

20210304111910.png

经过定位确定在这儿

jadx

20210304112048.png

ida中直接有导出函数

20210304112142.png

jstring __fastcall Java_com_goldze_mvvmhabit_utils_NativeUtils_encrypt(JNIEnv *a1, int a2, int a3)
{
  char *v4; // r0
  int v5; // r0
  const char *v6; // r1
  jstring v7; // r4
  char v9[12]; // [sp+4h] [bp-74h] BYREF
  unsigned __int8 v10; // [sp+10h] [bp-68h] BYREF
  _BYTE v11[11]; // [sp+11h] [bp-67h] BYREF
  char v12[12]; // [sp+1Ch] [bp-5Ch] BYREF
  _DWORD v13[3]; // [sp+28h] [bp-50h] BYREF
  char v14[12]; // [sp+34h] [bp-44h] BYREF
  char v15[12]; // [sp+40h] [bp-38h] BYREF
  char v16[12]; // [sp+4Ch] [bp-2Ch] BYREF
  _DWORD v17[3]; // [sp+58h] [bp-20h] BYREF

  v17[2] = 0;
  v17[0] = 0;
  v17[1] = 0;
  v4 = (*a1)->GetStringUTFChars(a1, a3, 0);
  std::string::basic_string<decltype(nullptr)>(v16, v4);
  sub_E490(v17);
  std::string::~string(v16);
  v5 = time(0); // 时间戳
  std::to_string(v16, v5);
  sub_E4A0(v17);
  join(v14, v17, 44);
  sha1(v15, v14); // 初步看sha1加密
  std::string::~string(v14);
  v13[2] = 0;
  v13[0] = 0;
  v13[1] = 0;
  sub_E4A0(v13);
  sub_E4A0(v13);
  join(v12, v13, 44);
  std::string::basic_string(v9, v12);
  b64encode(&v10, v9); //重点特征
  std::string::~string(v9);
  v6 = *&v11[7];
  if ( !(v10 << 31) )
    v6 = v11;
  v7 = (*a1)->NewStringUTF(a1, v6);
  std::string::~string(&v10);
  std::string::~string(v12);
  std::__vector_base<std::string>::~__vector_base(v13);
  std::string::~string(v15);
  std::string::~string(v16);
  std::__vector_base<std::string>::~__vector_base(v17);
  return v7;
}

只需要知道一点点sha1加密

20210304112618.png
20210304112715.png
20210304120427.png

// sha1原型参考, 核心就是和md5差不多, hash算法,没有key。 多余的信息自行查看 https://en.wikipedia.org/wiki/SHA-1
int SHA1_Update(SHA_CTX *c, const void *data,
                  unsigned long len);
// 猜测对应位置 SHA1::add(a2, v6, v7); 

上frida脚本测试下看看

// 这是一个写好的完整脚本, 需要会frida姿势哟。
function hookjava(){
    Java.perform(function(){
        var encrypt = Java.use("com.goldze.mvvmhabit.utils.NativeUtils").encrypt;
        encrypt.implementation = function(str){
            console.log("java input:" + str)
            var ret = this.encrypt(str);
            console.log("java output:" + ret);
            return ret;
        }
    })
}

function hook(){
   var base = Module.findBaseAddress(lib_so);
   // SHA1::add
   var offset = base.add(0xF075);
   Interceptor.attach(offset, {
       onEnter:function(args){
        console.log("native:"+ Memory.readCString(args[1]))
        }
    }
    )
}
var lib_so = "libnative.so"
var is_hook_libart = false;
function main(){
    Interceptor.attach(Module.findExportByName(null, "dlopen"), {
        onEnter: function (args) {
            var pathptr = args[0];
            if (pathptr !== undefined && pathptr != null) {
                var path = ptr(pathptr).readCString();
                // console.log("dlopen:", path);
                if (!this.path){
                    return
                }
                if (path.indexOf(lib_so) >= 0) {
                    this.can_hook_libart = true;
                    console.log("[dlopen:]", path);
                }
            }
        },
        onLeave: function (retval) {
            if (this.can_hook_libart && !is_hook_libart) {
                hook();
                is_hook_libart = true;
            }
        }
    })

    Interceptor.attach(Module.findExportByName(null, "android_dlopen_ext"), {
        onEnter: function (args) {
            var pathptr = args[0];
            if (pathptr !== undefined && pathptr != null) {
                var path = ptr(pathptr).readCString();
                // console.log("android_dlopen_ext:", path);
                if (path.indexOf(lib_so) >= 0) {
                    this.can_hook_libart = true;
                    console.log("[android_dlopen_ext:]", path);
                }
            }
        },
        onLeave: function (retval) {
            if (this.can_hook_libart && !is_hook_libart) {
                hook();
                is_hook_libart = true;
            }
        }
    });
}

setImmediate(hookjava)
setImmediate(main)

20210304122032.png

前面分析过的, 返回是个base64, 重新解码看下

20210304122117.png

20210304122315.png

native:/api/movie,1614831596 重新sha1后结果与base64解开一样。

分析过程结束~~~
python脚本 完结傻花~~~

20210304124507.png

from base64 import b64encode
import hashlib
import time
import requests

def sha1(data):
    m = hashlib.sha1()
    m.update(data.encode())
    return m.hexdigest()

def encrypt():
    t = round(time.time())
    text = f"/api/movie,{t}"
    result = sha1(text)
    text = f"{result},{t}"
    token = b64encode(text.encode()).decode()
    return token

def main():
    token = encrypt()

    url = f"https://app8.scrape.center/api/movie/?offset=0&limit=10&token={token}"

    headers = {
        "log-header": "I am the log request header.",
        # "Host": "app8.scrape.center",
        "Connection": "Keep-Alive",
        "Accept-Encoding": "gzip",
        "User-Agent": "okhttp/3.10.0"
    }
    resp = requests.get(url, headers=headers)
    print(resp.json())

if __name__ == '__main__':
    main()
app和分析文件打包附件, 需要解压, 无密码。
https://wwa.lanzouj.com/iLChomh2i4d
该app来着老崔的练习网站 app8
第一次写文,小声点骂我。

免费评分

参与人数 15威望 +1 吾爱币 +33 热心值 +14 收起 理由
13X + 1 谢谢@Thanks!
bangefanshi + 1 + 1 谢谢,新手好好学习
Fx14138 + 1 用心讨论,共获提升!
汉瑞大好人 + 1 + 1 我很赞同!
zhuzhuxia111 + 1 + 1 我很赞同!
xzhaojunx + 1 + 1 用心讨论,共获提升!
石碎大胸口 + 1 + 1 用心讨论,共获提升!
我是小窝 + 1 + 1 热心回复!
哈熊 + 1 + 1 我很赞同!
ryan0326 + 1 + 1 热心回复!
qtfreet00 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Tviolet + 1 + 1 谢谢@Thanks!
myheh + 1 + 1 我很赞同!
untest001 + 1 + 1 用心讨论,共获提升!
Q1998 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| ogli324 发表于 2021-3-4 13:24
lyl610abc 发表于 2021-3-4 13:22
先不论内容如何,排版看得有点难受
不过,还是要支持一下原创分析的
加油{:301_99 ...

我以为md文档直接就识别的了, 发完一看, 哦豁, 不过好在很快重新排版好了, 没几个人会发现,偷偷的~
 楼主| ogli324 发表于 2021-3-4 15:27
qwertyuiop1822 发表于 2021-3-4 14:53
大佬, 我的IDA导出函数怎么是这些

可以搜索 过滤下  Java_xxxx(指适用于静态绑定的哟, 动态的不是这样的格式。)  看我发的图
MissJz 发表于 2021-3-4 13:21
lyl610abc 发表于 2021-3-4 13:22
先不论内容如何,排版看得有点难受
不过,还是要支持一下原创分析的
加油
lyl610abc 发表于 2021-3-4 13:27
ogli324 发表于 2021-3-4 13:24
我以为md文档直接就识别的了, 发完一看, 哦豁, 不过好在很快重新排版好了, 没几个人会发现 ...

现在看起来舒服多了,O(∩_∩)O
 楼主| ogli324 发表于 2021-3-4 13:28
lyl610abc 发表于 2021-3-4 13:27
现在看起来舒服多了,O(∩_∩)O

嘻嘻~~~
ljj_1025 发表于 2021-3-4 14:04
感谢楼主分享!
我是东软的学生 发表于 2021-3-4 14:22
感谢分享
bigcarp 发表于 2021-3-4 14:22
nice! xuexi ! 学习了!
OXsmallice 发表于 2021-3-4 14:24
有用,感谢楼主分享。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 15:58

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表