精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 资源出售

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

2019年好项目,每月多挣好多钱收抖音火山王者引流:1513888885长期 包养全网交友粉大户┏ E3 E5各种配置电脑出租 ┓找软件作者合作/收购引流软件★微鲤活动粉20元收★无预付日结★
2019年好项目,每月多挣好多钱收抖音火山王者引流:1513888885长期 包养全网交友粉大户┃单进程单IP,模拟器稳定24开┃找软件作者合作/收购引流软件★微鲤活动粉20元收★无预付日结★
全国PPTP秒换IP 动态IP仅35元/月诺宾混拨动态vps/PPTP多地区换IP长期 包养全网交友粉大户┗ E3/8元 E5/10元 双路12元 ┛找软件作者合作/收购引流软件★微鲤活动粉20元收★无预付日结★
出兼职,网赚,交友粉,扫码进群出微信qq交友粉网赚粉精准粉兼职长期 包养全网交友粉大户█IP精灵█最强大的动态IP加速器找软件作者合作/收购引流软件★微鲤活动粉20元收★无预付日结★
长期出QQ群QQ号微信精准粉网挣粉出网赚粉/精准粉/独家引流软件各种【活粉变现点这里】客服①———邮件群fa/WZ最新资源合作找软件作者合作/收购引流软件★微鲤活动粉20元收★无预付日结★
┏集团收购:一手短信、邮箱群fa┓███████████████各种【活粉变现点这里】客服①收购代加QQ单项好友找软件作者合作/收购引流软件★微鲤活动粉20元收★无预付日结★
┃集团收购:一手短信、邮箱群fa┃ █         高 分 成         █各种【活粉变现点这里】客服②收购代加QQ单项好友找软件作者合作/收购引流软件★微鲤活动粉20元收★无预付日结★
┃集团收购:,一手精准群发用户┃ █         高 转 化         █各种【活粉变现点这里】客服②收购代加QQ单项好友找软件作者合作/收购引流软件★微鲤活动粉20元收★无预付日结★
┃集团收购:,一手精准群发用户┃█         高 留 存         █各种【活粉变现点这里】客服③收购代加QQ单项好友实力团队大量收粉入群找管理★微鲤活动粉20元收★无预付日结★
┗集团收购:-爬取QQ达人会员号┛█ 独立后台  实时刷新 █各种【活粉变现点这里】客服③收购代加QQ单项好友实力团队大量收粉入群找管理★微鲤活动粉20元收★无预付日结★
长期大量收一手精准网赚粉█        C   游  戏        ███大量收婚恋宝妈 快手 火山██出高质量粉,日产多、实力来谈实力团队大量收粉入群找管理出售长短效HTTP-S5私密IP-高质量
长期收各种精准网赚资源█        P   分  成        ███ 稳定收交友粉,找我换钱 ██精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理出售长短效HTTP-S5私密IP-高质量
长期收各种小视频网赚资源█        S   合  作        ███收婚恋粉宝妈粉,找我换钱██精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理公司实力收粉进群滴滴管理
长期收各种引流精准网赚粉█   8 2 5 1 3 7 7 7 7  ███收快手火山虎牙,找我换钱██精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理公司实力收粉进群滴滴管理
大量收粉真实粉商长期合作█████████████████长期大量收粉量大量小都吃██精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理公司实力收粉进群滴滴管理
加华缘社群支持免费担保█长期大量收购各种活粉███ 婚恋/抖音/宝妈/空间/快手██精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理公司实力收粉进群滴滴管理
欢迎粉商渠道客户进QQ群█ 长期收购各种引流软件 ████有量有质量,找我换钱███精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理公司实力收粉进群滴滴管理
长期收各种粉真实长期合作大量收代加QQ各种单双向群███实力大型公司收媒体量███精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理公司实力收粉进群滴滴管理
真实网赚量点击进华缘社群现加/拉群/现货单双向群通吃███大量资金,来一手代理███精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理公司实力收粉进群滴滴管理
华缘社Q群号码364884407怕你没量,别怕我没钱███有量就有钱,速度来撩███精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理公司实力收粉进群滴滴管理
公司实力收引流软件渠道收网赚粉 兼职粉 宝妈粉 9703796┃  全网大量收  ┃精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理公司实力收粉进群滴滴管理
公司实力收引流软件渠道收网赚粉 兼职粉 宝妈粉 9703796┃ 各种App交友粉 ┃精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理公司实力收粉进群滴滴管理
公司实力收引流软件渠道大量出各种粉联系QQ222561┃   网赚粉   ┃精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理公司实力收粉进群滴滴管理
公司实力收引流软件渠道大量出各种粉联系QQ222561┃   游戏粉   ┃精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理公司实力收粉进群滴滴管理
公司实力收引流软件渠道┃集团高价回收 WZ 兼职 精准粉┃┃   婚恋粉   ┃出高质量粉,日产多、实力来谈实力团队大量收粉入群找管理公司实力收粉进群滴滴管理
公司实力收引流软件渠道┃ 收一切可用资源QQ:293950 ┃┃  各种活人粉  ┃『实力收扫码进群量』实力团队大量收粉入群找管理公司实力收粉进群滴滴管理
公司实力收引流软件渠道┃集团高价回收 WZ 兼职 精准粉┃┃   短视频粉  ┃『你量真,我需求大』实力团队大量收粉入群找管理公司实力收粉进群滴滴管理
公司实力收引流软件渠道┃ 收一切可用资源QQ:293950 ┃┃ 全网最高单价收购 ┃『 你不乱,我不断 』实力团队大量收粉入群找管理收男粉微信扫码进群QQ584121900
公司实力收引流软件渠道┃集团高价回收 WZ 兼职 精准粉┃无限收学生粉,宝妈,女性粉,游戏粉
『 →qq:12587210←』
寻引流高手合作/1万粉以下勿扰收男粉微信扫码进群QQ584121900
公司实力收引流软件渠道┃ 收一切可用资源QQ:293950 ┃无限收学生粉,宝妈,女性粉,游戏粉
『欢迎实力粉商来撩』
寻引流高手合作/1万粉以下勿扰收男粉微信扫码进群QQ584121900
公司实力收引流软件渠道出QQ群微信QQ号交友粉网赚粉兼职粉无限收学生粉,宝妈,女性粉,游戏粉长期收网赚粉 QQ8904040寻引流高手合作/1万粉以下勿扰收男粉微信扫码进群QQ584121900
公司实力收引流软件渠道█实力招收朋友圈 QQ群 邮件 推广无限收学生粉,宝妈,女性粉,游戏粉实力团队收粉 QQ8904040寻引流高手合作/1万粉以下勿扰收男粉微信扫码进群QQ584121900
公司实力收引流软件渠道国内外长短效HTTP-Socks5高质量IP无限收学生粉,宝妈,女性粉,游戏粉长期收网赚粉 QQ8904040寻引流高手合作/1万粉以下勿扰██████五年推广█邮件代发█
公司实力收引流软件渠道█拨号VPS服务器4元/天免费测试█无限收学生粉,宝妈,女性粉,游戏粉实力团队收网赚粉入群找管理寻引流高手合作/1万粉以下勿扰大量收微信扫码进群男粉2820301656
公司实力收引流软件渠道███高价收购任何粉QQ84888591█无限收学生粉,宝妈,女性粉,游戏粉实力团队收网赚粉入群找管理寻引流高手合作/1万粉以下勿扰高价收网吧量联系QQ1908886662
〓〓〓收粉〓〓〓工作室出-交友粉-速度快-产量高无限收学生粉,宝妈,女性粉,游戏粉实力出粉,诚心来谈,眼子勿扰寻引流高手合作/1万粉以下勿扰高价收网吧量家庭量q2221333978
出精准网赚粉兼职粉
出售QQ群fa网赚精准粉 QQ13395509
无限收学生粉,宝妈,女性粉,游戏粉出抖音热门WZ精准粉Q159907寻引流高手合作/1万粉以下勿扰常年出精准粉 认证空间粉 加群量
出粉QQ克隆代开企业Q群fa短信 95达到率无限收学生粉,宝妈,女性粉,游戏粉
每天大量出邮箱交友粉,求稳定客户
寻引流高手合作/1万粉以下勿扰我要租广告位
查看: 3120|回复: 77
收起左侧

[易语言纯源码] app逆向-服务器校验客户Duan证书分析及代码

  [复制链接]

签到天数:1 天

结帖率:100% (3/3)
发表于 2018-11-15 00:51:24 | 显示全部楼层 |阅读模式
分享源码
界面截图:
是否带模块: 纯源码
备注说明: -
当前app安全越来越受到重视,很多app采取了HTTPS的协议,但是一般app都不会对证书进行校验,一些app只是客户端对服务端证书进行了强校验,也就是通常呢,抓包的时候app提示无网络连接或者网络连接错误,这种情况就是app发现证书是伪造的,并不是服务器的证书,因此中断了通讯。这个时候可以通过逆向app,找到校验的代码,过掉即可,偷懒的话可以尝试justTustMe模块来过掉。今天我们的重点是如何在服务器强校验客户端证书的情况下,抓到数据包,相关内容在网上很少见,以下仅仅抛砖引玉做个简单的示范,不涉及高级逆向。
可能大家遇到过这种情况,在抓包的时候,
fiddler提示:服务器请求客户端证书。
相关访问返回内容为:
<html>
<head><title>400 No required SSL certificate was sent</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<center>No required SSL certificate was sent</center>
<hr><center>nginx</center>
</body>
</html>
这种情况是由于客户端内置了客户端证书。常规条件下,客户端在与服务器进行通讯的时候,会将自己的证书发送给服务器,服务器校验证书的合法性,当我们采用fiddler代理的时候,默认使用的是fiddler的证书,当然对方服务器不认可fiddler的证书,所以会提示错误。
易语言直接访问的时候也提示400 No required SSL certificate was sent。这种情况怎么办?
这儿我们以翼健康app为例进行说明。
使用的工具:
Fiddler,抓数据包
JEB,反编译app
安装好xposed的雷电模拟器
Eclipse,编写xposed模块
易语言,测试通讯
...
以上工具均可以百度到,所以这儿不放链接了。
首先,随便抓一条数据包:
图片1.png
可以看到,对于数据包的内容,我们是可以清楚的看到的,但是服务器返回错误。
我们直接解压app,在./assets目录下,发现客户端证书client.pfx
图片2.png
当我们进行双击安装证书的时候发现需要密码,这个时候没有办法,我们只能尝试逆向app
我们在manifest文件中可以看到,app包名是com.gdhbgh.activity,入口是com.telecom.vhealth.ui.activities.WelcomeActivity,那么在逆向app的时候,要重点关注telecom下的http的相关类或者方法,这个是常规思路,证书操作肯定会和通讯类放在一起。
使用JEB逆向app,果然发现了有com.telecom.vhealth.http.utils.HttpUtils类。这儿给大家解释一下我为什么第一时间找到这个类,首先根据入口定位到了com.telecom.vhealthApp一般代码都是模块化,集成化。所以我们需要第一时间关注相关http包,在包里面我们重点关注工具类或者服务类。当然了,如果比较难找,我们也可以采取别的思路,比如直接搜索证书的名字,定位关键位置,或者搜索网页访问的地址,我们定位一下http访问的类,在进入到类里面看看是怎么样设置证书的等等,方法有很多,大家需要发挥一下,不要拘泥于一种方法。
言归正传,运气很好,在HttpUtils类里面我们发现了getSocketFactory获取连接工厂这个函数。不管是从方法名还是具体的代码,我们都基本确定关键函数就在这儿了。
图片3.png
摘录其中关键语句给出注释:
InputStream v3 = arg7.getAssets().open("client.pfx");  // 读入证书文件
KeyStore v4 = KeyStore.getInstance("PKCS12");  // Key存储器初始化
v4.load(v3, v0_1);  // Key存储器载入客户端证书文件,参数一为证书,参数二为密码
我们向上找找v0_1是从哪儿蹦出来的,发现关键语句:
char[] v0_1 = EncryptUtils.getHttpSign(arg7).toCharArray();
进入EncryptUtils类,发现是两个native函数,相关代码在so里面:

分析so还是比较麻烦的,直接省略分析so文件,我们使用xposedhook这个参数。这儿呢,我选择hookKeyStoreload的方法。原因呢,我个人认为容错性比较高,省的来回写代码。
相关xposed的入门教程请大家百度。Xposed还是很容易入门以及上手的。
贴出代码:
图片5.png
运行模块,成功拿到证书密码:vhealth2016
图片6.png
拿到密码,我们转到电脑端,首先双击client.pfx,将证书文件安装进电脑,然后本地在证书管理里面将证书导出为base64编码的cer证书文件或者百度证书转换工具,将pfx证书转换为pem文件,pem文件包含了公钥和私钥,我们手动提取出公钥数据新建一个cer文件就ok,觉得不够严谨可以使用openssl命令来转换。Cer文件是用于存储公钥证书的文件格式
图片7.png
图片8.png
我们把生成的ClientCertificate.cer文件放入fiddler的文件目录下。然后重启fiddler,就可以发现成功抓包:
图片9.png
对于数据中的sign,我们也可以顺便分析一下:
以下是跟踪路径,自己分析就好,我列的代码可直接忽略:
((Map)v4).put("sign", HttpUtils.getHttpSign());
接下来:
public static String getHttpSign() {
        UnifiedUserInfo v1 = c.c();
        String v0 = "";
        if(v1 != null) {
            v0 = v1.getPhoneNumber();
        }
        return HttpUtils.getSign("|", new String[]{String.valueOf(System.currentTimeMillis()), v0});
}
接下来:
    public static String getSign(String arg3, String[] arg4) {
        StringBuilder v1 = new StringBuilder();
        int v0;
        for(v0 = 0; v0 < arg4.length; ++v0) {
            v1.append(arg4[v0]);
            if(!TextUtils.isEmpty(((CharSequence)arg3)) && v0 < arg4.length - 1) {
                v1.append(arg3);
            }
        }
        return HttpUtils.encryptByPk(v1.toString());
}
最后定位到:
private static String encryptByPk(String arg5) {
        String v0_2;
        String v1 = null;
        try {
            Object v0_1 = new ObjectInputStream(YjkApplication.getContext().getAssets().open("public.ppk")).readObject();
            byte[] v2 = arg5.getBytes("utf-8");
            Cipher v3 = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            v3.init(1, ((Key)v0_1));
            v0_2 = f.a(v3.doFinal(v2));
        }
        catch(Exception v0) {
            s.a(((Throwable)v0));
            v0_2 = v1;
        }
        return v0_2;
}
发现sign是采用了assets目录下的public.ppk文件作为公钥,RSA/ECB/PKCS1Padding为加密方式。我们顺便在xposed代码hook一下相关地方,瞅瞅加密前数据是什么,加密后的数据是什么,密钥是什么。
贴出完整xposed代码:
import java.io.InputStream;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import java.security.Key;
public class Hook implements IXposedHookLoadPackage {
       
    private static String package_name = "com.gdhbgh.activity";
    //byte[]转16进制
    final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
    public static String bytesToHex(byte[] bytes) {
        char[] hexChars = new char[bytes.length * 2];
        for ( int j = 0; j < bytes.length; j++ ) {
            int v = bytes[j] & 0xFF;
            hexChars[j * 2] = hexArray[v >>> 4];
            hexChars[j * 2 + 1] = hexArray[v & 0x0F];
        }
        return new String(hexChars);
    }
   
    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
        if (!loadPackageParam.packageName.equals(package_name)) {
                return;
        }
        XposedBridge.log(loadPackageParam.packageName +" -> load");
        
        //通过hook密钥加载函数来得到证书密钥
        final Class<?> clazz = XposedHelpers.findClass("java.security.KeyStore", loadPackageParam.classLoader);
        XposedHelpers.findAndHookMethod(clazz,"load", InputStream.class,char[].class,new XC_MethodHook(){
                @Override
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        if((char[])param.args[1]==null) return;
                        String s = new String((char[])param.args[1]);
                        if(s==null) return;
                        XposedBridge.log("java.security.KeyStore.load param1: " + s);
            }
        });
        
        //hook加密方法瞅瞅加密前数据是个啥玩意儿
        XposedHelpers.findAndHookMethod("com.telecom.vhealth.http.utils.HttpUtils",loadPackageParam.classLoader,"encryptByPk", String.class,new XC_MethodHook(){
                @Override
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        XposedBridge.log("com.telecom.vhealth.http.utils.HttpUtils.encryptByPk param0:" + (String)param.args[0]);
            }
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        XposedBridge.log("com.telecom.vhealth.http.utils.HttpUtils.encryptByPk result: " + (String)param.getResult());
            }
        });
        
        //hook一下RSA的公钥数据
        XposedHelpers.findAndHookMethod("javax.crypto.Cipher",loadPackageParam.classLoader,"init", int.class,Key.class,new XC_MethodHook(){
                @Override
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        Key key1=(Key)param.args[1];
                        byte[] keyBytes=key1.getEncoded();
                        XposedBridge.log("javax.crypto.Cipher.init param1:" + bytesToHex(keyBytes));
            }
        });
        
        //hook一下加密前后的数据
        XposedHelpers.findAndHookMethod("javax.crypto.Cipher",loadPackageParam.classLoader,"doFinal", byte[].class,new XC_MethodHook(){
                @Override
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        byte[] data=(byte[])param.args[0];
                        XposedBridge.log("javax.crypto.Cipher.doFinal param0:" + bytesToHex(data));
            }
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        byte[] data=(byte[])param.getResult();
                        XposedBridge.log("javax.crypto.Cipher.doFinal result:" + bytesToHex(data));
            }
        });
        
    }
}
电脑安装了证书,易语言正常访问就行。未安装证书的电脑访问会报400错误。
贴一下易语言代码:
图片10.png
分析完毕!
完整的项目文件,样本文件,相关工具请大家自己动手完成。

吐槽一下精易的编辑真的好难受,还有就是不能直接导入word文档。

有钱捧个钱场,没钱就给个好评



点评

这才是 fiddler只抓443的元凶  发表于 2019-2-5 13:57
出个视频教程吧,棒棒哒....  发表于 2018-11-15 22:23

评分

参与人数 19好评 +17 精币 +37 收起 理由
消息通知 + 1 + 2 这么厉害!必须给个红包鼓励下~
idomine + 1 + 2 新技能已get√
六升臣 + 1 + 2 感谢发布原创作品,精易因你更精彩!
a2425924 + 1 + 2 感谢分享,很给力!~
smj328 + 1 + 2 感谢发布原创作品,一定好好学习,天天向上
zxx120 + 1 + 2 支持开源~!感谢分享
¢刀丛里的诗 + 1 + 1 奉上小小红包希望笑纳
太祖长拳 + 1 支持开源~!感谢分享
LeyBc + 1 + 4 新技能已get√
归年 + 1 + 2 新技能已get√
羽傲天 + 1 + 2 感谢分享,很给力!~
BlackMamba + 1 + 2 新技能已get√
搞事 + 1 + 2 新技能已get√
L白泽 + 1 + 2 新技能已get√
hehehero + 1 + 2 此处应该有鼓励~
巫婆 + 1 + 2 新技能已get√
萌萌嗒的小白 + 2 新技能已get√
USA + 1 + 2 新技能已get√
晨曦霸气 + 2 感谢发布原创作品,精易因你更精彩!

查看全部评分


您可以选择打赏方式支持楼主

打赏

参与人数 1 打赏积分 理由 收起 打赏时间
juste +10   精币 不多说,先打赏再看,出个系列视频可好? 2018-11-20 17:35

查看全部打赏

签到天数: 1 天

结帖率:0% (0/1)
发表于 2019-1-24 14:37:58 | 显示全部楼层
厉害了,我的哥
回复

使用道具 举报

签到天数: 1 天

结帖率:33% (1/3)
发表于 2019-1-23 16:57:04 | 显示全部楼层
大神写的文章虽然看不懂,但是必需赞
回复

使用道具 举报

签到天数: 7 天

结帖率:50% (2/4)
发表于 2019-1-21 14:44:01 | 显示全部楼层
好东西。。。
回复

使用道具 举报

签到天数: 7 天

结帖率:50% (2/4)
发表于 2019-1-21 14:43:47 | 显示全部楼层
学习一下         
回复

使用道具 举报

签到天数: 7 天

发表于 2019-1-16 16:19:17 | 显示全部楼层
看不懂~~路过
回复

使用道具 举报

签到天数: 1 天

结帖率:50% (1/2)
发表于 2019-1-14 11:21:06 | 显示全部楼层
感谢大神分享,涉及的点很多啊
回复

使用道具 举报

签到天数: 11 天

结帖率:87% (123/141)
发表于 2019-1-3 21:13:29 | 显示全部楼层
        不多说,先打赏再看,出个系列视频可好?
回复

使用道具 举报

签到天数: 2 天

发表于 2019-1-3 20:49:15 | 显示全部楼层
支持开源~!感谢分享,厉害
回复

使用道具 举报

发表于 2019-1-2 03:27:34 | 显示全部楼层
感谢分享,很给力!~
回复

使用道具 举报

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

本版积分规则 致发广告者

关闭

精易论坛 - 有你更精彩上一条 /1 下一条

快速回复 收藏帖子 返回列表 按钮

sitemap|易语言源码|易语言教程|易语言论坛|诚聘英才|易语言模块|手机版|联系我们|精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
揭阳精易科技有限公司申明:我公司所有的培训课程版权归精易所有,任何人以任何方式翻录、盗版、破解本站培训课程,我们必将通过法律途径解决!
公司简介:揭阳市揭东区精易科技有限公司致力于易语言教学培训/易语言学习交流社区的建设与软件开发,多年来为中小企业编写过许许多多各式软件,并把多年积累的开发经验逐步录制成视频课程供学员学习,让学员全面系统化学习易语言编程,少走弯路,减少对相关技术的研究与摸索时间,从而加快了学习进度!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.2 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125

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