起点读书QDSign QDInfo signature算法分析_疯雨的博客-程序员秘密

技术标签: 破解  signature  android篇  起点读书  QDSign  

需要完整算法加QQ:848416881
会持续更新
源代码下载链接:https://github.com/lavender1203/QDreaderApp
Apktool 反编译加 回编译后 启动app死在splash界面进不去登录界面。

动态调试下:
1.Manifest.xml 文件加入<application android:debuggable=“true” …>

编译出来有5个dex,mutidex被禁止。。。。sdk24之后建议打包成一个dex

invoke-static {p0}, La/b;->c(Landroid/content/Context;)V #加载load-jni库 —然后dead。。。。。
加载了一个so文件然后AndroidStudio+smali调试死掉,找到libload-jni.so文件,IDA来干它

1.adb shell am start -D com.qidian.QDReader/.ui.activity.SplashActivity
2.启动调试服务,进行端口转发
./data/local/tmp/android_server
adb forward tcp:23946 tcp:23946
3.附加so或进程,在执行函数打断点。
4.使用jdb连接apk的java层(需要关闭Android selinux)
HWFRD:/ # getenforce
Enforcing
HWFRD:/ # setenforce 0
HWFRD:/ # getenforce
Permissive
adb forward tcp:8000 jdwp:pid
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8000

F1085218+11CC= F10863E4

6000 – 6E64数据丢失

adb shell dumpsys activity activities 查看当前活动activity
-签名验证(已破解)—
com.qidian.QDReader.ui.activity;->QDLoginActivity->loginByPassWord()->
this.mPresenter.a(str1, str2); #str1= nickname str2 = password

登录所需参数:
首次登录:
auth_request+username+passwd 获取 id_token

以后登录:
Request + id_token

Filtter抓包:
参考文章地址:https://bbs.125.la/thread-14053235-1-1.html
账号=xf71320 密码=1212aaq

POST https://ptlogin.qidian.com/sdk/staticlogin HTTP/1.1
referer: http://android.qidian.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 619
Host: ptlogin.qidian.com
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.9.1

password=1212aaq&devicename=Honor%208&loginType=23&source=1000031&signature=JAtW2i9cmk06eSFBn6G4%2BusAXP8s%2FVUwg0vj7bSPrWqmQxtEUjU0%2B6Pab5hc%20d2MC&appid=12&referer=http%3A%2F%2Fandroid.qidian.com&auto=1&ticket=0&devicetype=Huawei_FRD-AL00&qimei=43757bd7111bb806&code=%40VMH&format=json&osversion=Android7.0_7.8.5_380&username=xf71320&imei=862679037204730&sdkversion=121&autotime=30&version=380&returnurl=http%3A%2F%2Fwww.qidian.com&areaid=30&sessionkey=sig8e31c8ac7e094b07940328a27d6b4af6&sig=t02EMF-zI53IY3TSY8cAhFDg4qgXt2fIwtFn2BNeklrPD7pUYRDtojQy8_0g9_F2u2eIZUgR16hx1HTkXgnr8f6u3ckZCzw4lvt-xt0LOZ3ntseY2kzXpNmlA**

Response:
HTTP/1.1 200 OK
Server: nginx
Date: Sun, 24 Mar 2019 08:27:09 GMT
Content-Type: text/html
Content-Length: 479
Connection: keep-alive
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
P3p: CP=CAO PSA OUR

{“code”:0,“data”:{“appId”:12,“areaId”:30,“ywGuid”:0,“ticket”:"",“autoLoginSessionKey”:"",“autoLoginKeepTime”:0,“ywKey”:"",“nextAction”:11,“contextId”:“sigea0ad4936ab84cdb91b03e4243c49b53”,“imgSrc”:“https://ssl.captcha.qq.com/TCaptcha.js”,“deviceType”:"",“challenge”:"",“deviceDisplaytype”:"",“inputUserId”:"",“loginType”:1,“autoLoginFlag”:1,“isRiskAccount”:false,“ywOpenId”:"",“sessionKey”:“sigea0ad4936ab84cdb91b03e4243c49b53”,“autoLoginExpiredTime”:1553416029},“message”:""}

以上为登录抓到的数据,我们发现账号和密码都没有加密 但是有一个signature 这个是变化的 加密的 找到了加密参数我们就开始分析APP
调试app获取这些参数:

Jeb分析signature怎么计算出来的?
ywlogin下搜索signature c/d.f()函数
加密方式 由两部分组成:Java层和so层
Java层好办直接copy, so层函数需要写成python或java代码

public class d {
private static final char[] a;

static {
    d.a = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
}

public static String a(byte[] arg9) {
    int v4 = arg9.length;
    StringBuilder v5 = new StringBuilder(arg9.length * 3 / 2);
    int v6 = v4 - 3;
    int v2 = 0;
    int v0;
    for(v0 = 0; v0 <= v6; v0 = v3) {
        int v3 = (arg9[v0] & 255) << 16 | (arg9[v0 + 1] & 255) << 8 | arg9[v0 + 2] & 255;
        v5.append(d.a[v3 >> 18 & 63]);
        v5.append(d.a[v3 >> 12 & 63]);
        v5.append(d.a[v3 >> 6 & 63]);
        v5.append(d.a[v3 & 63]);
        v3 = v0 + 3;
        v0 = v2 + 1;
        if(v2 >= 14) {
            v5.append(" ");
            v0 = 0;
        }

        v2 = v0;
    }

    if(v0 == -2 + v4) {
        v0 = (arg9[v0 + 1] & 255) << 8 | (arg9[v0] & 255) << 16;
        v5.append(d.a[v0 >> 18 & 63]);
        v5.append(d.a[v0 >> 12 & 63]);
        v5.append(d.a[v0 >> 6 & 63]);
        v5.append("=");
    }
    else if(v0 == -1 + v4) {
        v0 = (arg9[v0] & 255) << 16;
        v5.append(d.a[v0 >> 18 & 63]);
        v5.append(d.a[v0 >> 12 & 63]);
        v5.append("==");
    }

    return v5.toString();
}

}

c函数在so层,libd-lib.so
由于so层函数是和硬件相关的,所以要用python将其重写

从java层传进来的参数arg1,变成了R0=EDF23A10,R1=E23FB300这是个地址,(g)去查看下,发现arg1存放的地方就在R1寄存器这块内存,那么R0是干嘛的呢?然后继续调用了
sub_83C(v1, (int)v3)这个函数,实际上调用sub_96C((char *)a2, &v6)
int __fastcall sub_83C(int a1, int a2)
{
int v2; // r4
int v3; // ST10_4
int v4; // r5
int result; // r0
int v6; // [sp+10h] [bp-14h]
int v7; // [sp+14h] [bp-10h]

v2 = a1;
v3 = sub_96C((char )a2, &v6);
v4 = (
(int (__fastcall **)(int, int))((_DWORD )v2 + 704))(v2, v6);
(
(void (__fastcall **)(int, int, _DWORD, int, int))(
(_DWORD *)v2 + 832))(v2, v4, 0, v6, v3);
result = _stack_chk_guard - v7;
if ( _stack_chk_guard == v7 )
result = v4;
return result;
}

int __fastcall Java_a_d_c(int a1)
{
int v1; // r5
int v2; // r4
void *v3; // r6

v1 = a1;
v2 = 0;
if ( a1 )
{
v3 = (void )((int (**)(void))(*(_DWORD *)a1 + 676))();
v2 = sub_83C(v1, (int)v3);
if ( v3 )
free(v3);
}
return v2;
}

void DES_ede3_cbc_encrypt(const unsigned char *input,unsigned char *output,
long length,
DES_key_schedule *ks1,DES_key_schedule *ks2,
DES_key_schedule *ks3,DES_cblock *ivec,int enc);
Key1=sewxf03h
Key2=hz3ew9qc
Key3=CXMHiDMK
Ivec =0

Frida hook: key 和ivec
adb push /data/local/tmp frida-server
root# chmod 777 /data/local/tmp/frida-server
Root#data/local/tmp/frida-server
adb forward tcp:27042 tcp:27042

Com/yuewen/Ywlogin/d/b/a 验证码

QDSign:

signParams( context, postParams, timestamp, userToken, deviceID, v5, arg9, arg10)

postParams: r=ODYyNjc5MDM3MjA0NzMwfDAuMHwwLjB8Ny44LjV8MTA4MHwxNzk0fDEwMDAwMzF8Ny4wfDF8RlJELUFMMDB8ZjQ2OTE0Yzc0MmYxOTM1OTQ4NzZhODMxMTFjZmI4ZjRmYzBlNWJlZnwwMjowMDowMDowMDowMDowMHxudWxsfDAwMDAwMDAwMDAwMDAwMDB8NC4xLjE4LWdmNjQwMmQwNy4wRlJELUFMMDBOUkQ5ME0gdGVzdC1rZXlzfDQzNzU3YmQ3MTExYmI4MDZ8MXw0Mzc1N2JkNzExMWJiODA2

第一步:
Md5(postParams) = a8d97ea8ae07d8a99e253787a2be6b40

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010346967/article/details/94386414

智能推荐

数组越界问题_判断索引是否越界了_呼hu呼的博客-程序员秘密

首先一点是明白数组是有固定的大小的,然后是数组的下标是从0开始到定义的数组size-1。数组越界常发生在非法索引访问数组,非法是指索引值为负值或大于等于数组大小,这里最常迷惑人的是大于等于数组大小。首先,因为在往数组中插入数据时,数组此时的大小是等于数组中数据长度的,并不是你之前的规定的值。那之前规定的值有什莫用呢?之前规定的值是用来限制数组长度的,规定数组中只能存放这么多数据。所...

模拟布朗运动与几何布朗运动_三生断绝的博客-程序员秘密

模拟标准布朗运动,布朗运动,集合布朗运动

普通话测试第四题评分标准_【2016年普通话测试的试卷构成及评分标准】- 环球网校..._weixin_39839541的博客-程序员秘密

【摘要】为了叫大家更方便快捷的了解普通话水平测试,环球网校教师资格频道整理了2016年普通话测试的试卷构成及评分标准,希望大家喜欢,环球网校教师资格频道时时更新行业最新动态,发布复习考试资料,欢迎【摘要】为了叫大家更方便快捷的了解普通话水平测试,环球网校教师资格频道整理了2016年普通话测试的试卷构成及评分标准,希望大家喜欢,环球网校教师资格频道时时更新行业最新动态,发布复习考试资料,欢迎大家关注...

vs code设置python相对路径_CSDN...小李的博客-程序员秘密

vs code设置python相对路径最近换了vs写写代码,奈何每次运行文件都是报出路径错误,一次两次的绝对路径还好,时间长实在受不了。索性看看有没有什么办法能一劳永逸,看了很多方法大都是老版适用的,于是自己研究了下,只需勾选一个选项即可,下面看图。...

搬家琐记_cuixi3605的博客-程序员秘密

终于搬完家了。生性懒惰,到深圳九年,也就挪过一次窝。前阵子随口一提,想找个舒服又靠工厂近的屋子,被领导当圣旨领了去。被驱赶着看了几处所谓的高尚社区,环境如画,可是进房就变了样。或者是出租标配,满屋粗陋廉价的家具电器;或者是业主的...

CSS 多种布局方式_当多种元素都是一个的话 怎么区分设置css样式布局_满天过海_春的博客-程序员秘密

​css布局是工作中最常碰到的,同时也是笔试 or 面试中会被问到的问题,故在本文整理了css多种布局方式,以供参考。此篇较长四千五百字左右,读者可分三部分阅读,水平居中布局,垂直居中布局,水平居中对齐。水平居中布局水平居中布局,指当前元素在父级元素中的水平方向上是居中,如:实现水平居中的方法有很多,我们一个一个来看。1、inline-block + text-align 设置子元素为一个inline-block元素 设置父元素text-align: c...

随便推点

查找与排序_linlinlin45的博客-程序员秘密

查找的相关概念查找是什么呢?我准备打个电话给朋友,懒得重新输入电话号码,需要查找通讯录或者通话记录;我想买件衣服或者买双鞋,需要在网购app上搜索关键字,来查找心仪的商品;我LOL想练一个没玩过的英雄,不知道该点什么天赋,出什么装备,需要去浏览器去查找玩法攻略;…由此可见,查找或搜索,在我们的生活中随处可见,甚至说是必不可少的。所以我们来讲一下查找的相关概念:在数据结构中,我们把所有被查的数据所在的集合,统称为查找表查找表(Search Table)是 同一类型 的数据元素(或记录

遇见狂神说JAVA笔记 --- Mybatis 学习_小智RE0的博客-程序员秘密

传送门==&gt;B站遇见狂神说–Mybatis教程笔记和练习只是跟着视频整理的;有的知识点并没有整理进来.ML1.什么是 Mybatis1.1如何获取/下载Mybatis1.2 什么是持久化,持久层1.3 为什么需要Mybatis2. 先试试Mybatis程序2.1 首先是搭建环境2.1.1先创建一个数据库;建个数据表,一会儿要对数据库进行操作;顺便存入几行数据2.1.2 新建一个普通的maven项目;2.1.3 把创建的项目中的src目录删掉;那么这个项目就作为父级工程2.1.4 导入项目需要

php扩展安装--OpenSSL扩展_ouyang-web之路的博客-程序员秘密

先安装依赖包:yum install openssl openssl-devel进入PHP安装包里的OpenSSL文件夹,根据个人的安装包位置不同,此处是cd /home/local/php.5.6.25/ext/openssl/phpize可能会报错:Cannot find config.m4.Make sure that you run /usr/local/bin/phpize i...

GDB再学习(6):断点调试之软件断点_gdb 软件断点_Stoneshen1211的博客-程序员秘密

文章目录1 断点简介2 软件断点3 程序准备4 指令介绍4.1 通过函数名设置断点 break func [ if cond ]4.2 通过行号的方式来设置断点 break line_number [ if cond ]4.3 通过文件名和行号的方式来设置断点break file.c:line_number [ if cond ]4.4 一次有效指令 tbreak4.5 与正则表达式regex匹配的所有函数上设置断点 rbreak regex4.6 查看断点信息 info breakpoints4.7 使断

精通oracle10g系统管理课后答案_yunlonglove的博客-程序员秘密

11.C D E2.A3.C4.A B C D5.C6.A C7.B8.A9.B10.A11.A12.A13.B14.C15.A B16 A B C17 C18 A B C19 A C D20 B31.B2.A B3 A4 D5.SCOTT会话:c:\&amp;gt;sqlplus scott/ti...

SpringBoot#DispatcherServlet_weixin_30505751的博客-程序员秘密

_amazing!转载于:https://www.cnblogs.com/luohaonan/p/11271187.html

推荐文章

热门文章

相关标签