返回列表 发新帖

【实战分析】一木记账之伪造新用户绕过服务器验证

    [复制链接]

162

主题

8064

回帖

2万

积分

博士后

滑稽

Rank: 8Rank: 8

金币
754
好评
474
信誉
210

MT论坛新人MT论坛最佳新人MT论坛活跃会员考神MT论坛帅哥MT论坛灌水老大

QQ
发表于 2025-2-13 05:16:06 来自手机  | 显示全部楼层 | 阅读模式  来自 福建
本帖最后由 逗比_滑稽 于 2025-2-13 05:40 编辑

Hello,各位好久不见,自从上班之后没多少兴趣再搞逆向了,要不是现在上班太无聊了,想着写篇帖子打发打发时间,正好想到去年9月份有研究过一个软件,废话不多说,Start。

此篇的逆向对象就是
一木记账
关于此应用也是发了很多破解会员的教程,但是大部分都是破解了本地会员功能的,部分会员功能还是无法使用。

例如:语音记账,截图导入。

如果破解了本地会员使用这两个功能都会提示
  1. 鉴权失败,会员已过期或网络异常
复制代码



而本次教程核心内容就是破解这两个服务器验证功能,并不是破解全部服务器功能,其它服务器功能大伙感兴趣可以自行研究


————————————————

回归正题,既然这两个功能是服务器功能,那么我们该采取什么方式破解?我们不妨先看此图。

这是开通会员权益页面,从这里我们能了解到开发者会给新注册的用户一天的时间体验会员功能,这时有的小伙伴应该就想到了,我们可以伪造成新用户,让服务器认为我们是新用户,一直白嫖这两个功能。既然思路有了,说干就干。

我们抓取一下语音记账的网络请求,记住下关键词
  1. getNewBaiduSpeechToken
复制代码

等下我们要在dex分析这网络请求。


通过这个网络请求,我们知道请求头有一段数字,而参数会传入账号Token,也就是令牌。而我们的目的就是伪造这两段信息,让服务器认定我们是新用户。

我们回到dex,通过刚刚得到的关键词搜索这个网络请求。

很轻松的就找到了,而且注释已经标明告诉了我们那串数字代表着用户id

这方法的两个参数,String是令牌,int是用户id

通过查找这网络请求方法的调用,我们就得到传入这两参数的核心方法
  1. getSpeechToken
复制代码


以此法我们也能得到截图导入的网络请求核心方法(这里就不多解释了)
  1. getOcrToken
复制代码


收集到这么多信息,我们来捋一下。
现在得知了网络请求所会传入的参数
  1. 1.用户id
  2. 2.用户token
复制代码

而且找到了这两功能的网络请求核心方法
  1. 语言记账:getSpeechToken
  2. 截图导入:getOcrToken
复制代码

以及了解到传入这两参数的具体位置

现在还差最后一步,我们需要在返回用户id和用户令牌的地方替换成新用户的id和令牌,从而欺骗服务器,那该怎么得到新用户的id和令牌呢

答:抓取注册账号的网络请求

抓取到了注册账号的请求后,响应中就有我们所需要的令牌和id

到这里就要有代码基础的小伙伴了,你可以选择自写一个伪造用户注册账号的网络请求,或者说直接cv注册账号的代码来实现获取新用户id和新用户令牌。
我是直接取软件的代码进行请求的,这里就不展示怎么找了,直接给代码。
代码.zip【download】
  1. import com.wangc.bill.http.HttpManager;
  2. import com.wangc.bill.http.HttpService;
  3. import com.wangc.bill.http.entity.User;
  4. import com.wangc.bill.http.httpUtils.MyCallback;
  5. import com.wangc.bill.http.protocol.CommonBaseJson;
  6. import java.util.Random;
  7. import retrofit2.Call;
  8. import retrofit2.Response;
  9. import android.content.Context;
  10. import android.content.SharedPreferences;
  11. import android.content.SharedPreferences.Editor;
  12. import java.lang.reflect.Method;

  13. public class Main extends MyCallback {

  14.         private int Ordinal;

  15.         private String Name;

  16.         private static Main Instance;

  17.         private SharedPreferences.Editor Editor;

  18.         private Main(String token, int id) {
  19.                 Ordinal = id;
  20.                 Name = token;
  21.         }

  22.         private Main(String str) {
  23.                 Post(str);
  24.         }

  25.         public static void main(String[] args) {
  26.                 init(null);
  27.                 new Main(getName(), getValue());
  28.                 setUserData(null);
  29.     }

  30.         public static String getName() {
  31.                 return Instance.Name;
  32.         }

  33.         public static int getValue() {
  34.                 return Instance.Ordinal;
  35.         }

  36.         public static void setUserData(Object obj) {
  37.                 if (obj instanceof User) {
  38.                         User user = (User) obj;
  39.                         user.setVipType(2);
  40.                         user.setVipTime(3755260800000L);
  41.                 }
  42.         }

  43.         public static void init(Context c) {
  44.                 SharedPreferences sp = c.getSharedPreferences("hjData", 0);
  45.                 long Time = System.currentTimeMillis();
  46.                 long Time2 = sp.getLong("Time", 0);
  47.                 if (Time2 == 0 || Time - Time2 > 43200000L) {
  48.                         StringBuffer sb = new StringBuffer("1");
  49.                         String str = "0123456789";
  50.                         Random ran = new Random();
  51.                         for (int i = 0; i < 10; i++) {
  52.                                 sb.append(str.charAt(ran.nextInt(10)));
  53.                         }
  54.                         Instance = new Main(sb.toString());
  55.                         Instance.Editor = sp.edit();
  56.                 } else {
  57.                         Instance = new Main(sp.getString("Token", ""), sp.getInt("UserId", 0));
  58.                 }
  59.         }

  60.         private void Post(String qq) {
  61.                 try {
  62.                         //网络请求管理器
  63.                         HttpManager Http = HttpManager.getInstance();
  64.                         //网络请求服务
  65.                         Method HttpService = Http.getClass().getDeclaredMethod("getHttpService");
  66.                         HttpService.setAccessible(true);
  67.                         HttpService Service = (HttpService) HttpService.invoke(Http);
  68.                         //User
  69.                         String email = qq + "@qq.com";
  70.                         //获取实例
  71.                         User user = new User(email, "我爱记账", "");
  72.                         //设置邮箱
  73.                         user.setEmail(email);
  74.                         //设置密码
  75.                         user.setPassword("6201ED0369A2287B417946EA6CCDE21F");
  76.                         //设置apk签名
  77.                         user.setSignInfo("92344a8b478ac913b558ba2d040540ae");
  78.                         //设置渠道
  79.                         user.setChannel("kuan");
  80.                         //设置注册时间
  81.                         user.setRegisterTime(System.currentTimeMillis());
  82.                         //请求
  83.                         Call call = Service.addUserInfo(user);
  84.                         call.enqueue(this);
  85.                 } catch (Exception e) {
  86.                        
  87.                 }
  88.         }

  89.         @Override
  90.         public void onFailure(Throwable th) {

  91.         }

  92.         @Override
  93.         public void onResponse(Response response) {
  94.                 Object obj = response.body();
  95.                 if (obj != null) {
  96.                         CommonBaseJson Json = (CommonBaseJson) obj;
  97.                         if (Json.getCode() == 0) {
  98.                                 Object obj2 = Json.getResult();
  99.                                 if (obj2 != null) {
  100.                                         User result = (User) obj2;
  101.                                         //id
  102.                                         Ordinal = result.getId();
  103.                                         //令牌
  104.                                         Name = Json.getToken();
  105.                                         Editor.putString("Token", Name)
  106.                                                 .putInt("UserId", Ordinal)
  107.                                                 .putLong("Time", System.currentTimeMillis())
  108.                                                 .apply();
  109.                                 }
  110.                         }
  111.                 }
  112.         }

  113. }
复制代码

最后展示下如何使用这份代码,该代码除了提供破解服务器功能,以及提供破解本地会员,我一个一个讲。

注意:在修改前记得用mt管理器去除下签名校验哦

1.破解本地会员
搜索
  1. com.wangc.bill.http.protocol.CommonBaseJson
复制代码

定位getResult方法,在以下插入调用即可破解本地会员。
  1. invoke-static {v0}, Lcom/doubihuaji/Call;->setUserData(Ljava/lang/Object;)V
复制代码



2.破解服务器功能
因为我代码中采用的是12小时更换一次新用户,所以需要进行初始化,而且代码是有缺陷的,它是以1开头然后随机10位数字➕QQ邮箱,因为去年随便写的,如果本身存在已注册的账号是会出问题的,有精力的大佬可以稍微改进一下

搜索类
  1. com.wangc.bill.activity.MainActivity
复制代码

在onCreate方法插入调用进行初始化
  1. invoke-static {p0}, Lcom/doubihuaji/Call;->init(Landroid/content/Context;)V
复制代码



1.语音识别
搜索getSpeechToken方法,打开第一个结果在以下方法插入调用
  1. #新用户令牌
  2. invoke-static {}, Lcom/doubihuaji/Call;->getName()Ljava/lang/String;

  3. move-result-object v1

  4. #新用户id
  5. invoke-static {}, Lcom/doubihuaji/Call;->getValue()I

  6. move-result v2
复制代码


截图导入也按此法即可,搜索getOcrToken方法,在第一个结果插调用


最后我们重新打开软件(需要登录账号哦)

能够看到,这两个服务器功能都能正常使用了,我们顶着老用户账号id,实则用这两个功能的时候是顶着新用户账号id,下课。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
已有31人评分好评 金币 理由
逆行逆行 + 1 + 1 很给力!
©麟杰 + 1 + 1
不晚 + 1 + 1
3088123359 + 1 + 1 软件用不到,但教程很给力!
、千空 + 1 + 1
乐鱼634510992 + 1 + 1
天青色等烟雨i + 1 + 1
mykeyoo + 1 + 1 赞一个!
龙一 + 1 + 1 赞一个!
Raymondman + 1
‭不知夜雨 + 1 + 1 赞一个!
pdc9911 + 1 + 1 赞一个!
XiaoTaiyang + 1 + 1
cmyy0622 + 1
学学雪 + 1 + 1
APP柠檬 + 1 + 1 神马都是浮云
bet365 + 1 + 1 很给力!
向大佬学习 + 1 + 1
沧海笑 + 1 + 1 赞一个!
chengdragon + 1 感谢分享

查看全部评分 总评分:好评 +27  金币 +30 

回复

使用道具 举报

162

主题

8064

回帖

2万

积分

博士后

滑稽

Rank: 8Rank: 8

金币
754
好评
474
信誉
210

MT论坛新人MT论坛最佳新人MT论坛活跃会员考神MT论坛帅哥MT论坛灌水老大

QQ
发表于 2025-2-13 05:16:40 来自手机  | 显示全部楼层  来自 福建
最后麻烦各位如果觉得这篇帖子不错的或者有学习到什么的麻烦点个赞或投个币,因为这是我最后的动力
回复

使用道具 举报

94

主题

1113

回帖

5962

积分

硕士生

Rank: 6Rank: 6

金币
1049
好评
1
信誉
97
发表于 2025-2-13 05:23:13 来自手机  | 显示全部楼层  来自 重庆
看看隐藏
回复

使用道具 举报

19

主题

1545

回帖

6423

积分

硕士生

Rank: 6Rank: 6

金币
3554
好评
6
信誉
100

MT论坛帅哥MT论坛新人考神

发表于 2025-2-13 05:27:27 来自手机  | 显示全部楼层  来自 浙江
感谢大佬的教程
回复

使用道具 举报

0

主题

926

回帖

2388

积分

大学生

Rank: 5Rank: 5

金币
2352
好评
0
信誉
100

考神

发表于 2025-2-13 05:29:02 来自手机  | 显示全部楼层  来自 江苏
看看隐藏
回复

使用道具 举报

16

主题

1778

回帖

1万

积分

博士生

阿巴阿巴

Rank: 7Rank: 7Rank: 7

金币
2219
好评
244
信誉
190
发表于 2025-2-13 05:30:50 来自手机  | 显示全部楼层  来自 贵州
看看你的
回复

使用道具 举报

0

主题

265

回帖

821

积分

高中生

Rank: 4

金币
395
好评
0
信誉
100
发表于 2025-2-13 05:51:19 来自手机  | 显示全部楼层  来自 重庆
感谢分享
回复

使用道具 举报

34

主题

4921

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
1256
好评
25
信誉
103

考神MT论坛新人MT论坛帅哥

发表于 2025-2-13 06:01:21 来自手机  | 显示全部楼层  来自 江苏
看看内容
回复

使用道具 举报

0

主题

531

回帖

2427

积分

大学生

Rank: 5Rank: 5

金币
937
好评
0
信誉
100
发表于 2025-2-13 06:05:57 来自手机  | 显示全部楼层  来自 河北
感谢大佬分享
回复

使用道具 举报

7

主题

790

回帖

2556

积分

大学生

Rank: 5Rank: 5

金币
3271
好评
0
信誉
100
发表于 2025-2-13 06:11:24 来自手机  | 显示全部楼层  来自 广东
看看隐藏学习学习
回复

使用道具 举报

9

主题

7184

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
6290
好评
5
信誉
100

考神

发表于 2025-2-13 06:12:58 来自手机  | 显示全部楼层  来自 安徽
感谢楼主分享
回复

使用道具 举报

1

主题

6029

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
8129
好评
0
信誉
100
发表于 2025-2-13 06:13:15 来自手机  | 显示全部楼层  来自 江苏–无锡–江阴
感谢大佬分享,学习
回复

使用道具 举报

349

主题

3981

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
3561
好评
95
信誉
196

MT论坛最佳新人MT论坛新人考神

发表于 2025-2-13 06:18:59 来自手机  | 显示全部楼层  来自 山东
看看
回复

使用道具 举报

12

主题

5248

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
1595
好评
16
信誉
578

考神MT论坛帅哥MT论坛新人MT论坛最佳新人MT论坛活跃会员

发表于 2025-2-13 06:21:24 来自手机  | 显示全部楼层  来自 广东
感谢分享
回复

使用道具 举报

5

主题

2100

回帖

7247

积分

硕士生

Rank: 6Rank: 6

金币
2691
好评
16
信誉
100

考神MT论坛最佳新人MT论坛帅哥MT论坛新人

发表于 2025-2-13 06:22:53 来自手机  | 显示全部楼层  来自 河南
看看
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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