陆金所自动抢标,简单实现。希望各位大大给出更好的方案。
本帖最后由 xuyuahui001 于 2017-12-16 23:12 编辑怎么从有道云笔记markdown发到论坛里面啊。。格式老是乱。。只能复制到word了。。
0、效果
由于水平所限,无法破解梆梆加固导致无法静态分析,无法动态调试。
无法抓https包,解包。
希望各位大大给出更好的方案。
所以笨方法实现的效果是:
1、通过http请求网页,获取关键的productId sid
2、通过hook自动点击按钮,跳转到付款界面。
3、自动付款。
4、由于界面跳转比较耗时,所以大概需要3秒完成。
一、背景
闲钱基本都放陆金所买稳赢安E了,但是现在二手安E基本抢不到。网上也没有卖秒杀器的。所以想自己做一个。
二、调查
a) 陆金所最新版本采用了梆梆加固。
b) 大部分请求采用https。
三、方案
采用xposed hook,追踪代码。
四、具体实现
1、首先hook Application的onCreate 主要获取ClassLoader
```
"com.secneo.apkwrapper.ApplicationWrapper", "onCreate",
```
2、通过ClassLoader hook所有Activity Fragmen Button,方便跟踪逻辑。
3、通过Hook的Activity可以看到,service.lufax.common.RootControllerActivity为项目详情页,传递过来的参数为
Intent { cmp=com.lufax.android/service.lufax.common.RootControllerActivity (has extras) } Extras=Bundle[{h5params=, subProductCategory=, isOnlineH5=true, productCategory=R01, title_style_white=true, from=list, productId=***, productType=LOAN_REQUEST, backTag=null, LAST_PAGE_DATA={"webUrl":"***","lastPageData":{"h5params":"","iconTag":"","from":"list","salesArea":"","productCategory":"R01","productId":"***"},"naviBarTitle":"项目详情","alias":"financeDetail","refreshType":"1","localParams":"userInfo","webViewLoadType":"1"}, fragment_instace=service.lufax.controller.LufaxRootViewController, key_ui_plugin=class com.lufax.android.v2.app.h5.taskplugin.FinanceDetailCompatibleH5UiPlugin}]
4、com.lufax.android.v2.app.finance.invest.InvestBaseActivity为投资详情页,传递过来的参数:
Intent { cmp=com.lufax.android/.v2.app.finance.invest.InvestBaseActivity (has extras) } Extras=Bundle[{sid=****, fragment_instace=com.lufax.android.v2.app.finance.invest.confirm.InvestConfirmFragment, preInvestNotifyUrl=null, investModel=InvestModel{tradeChannel='2', productCategory='R01', salesArea='', productId='****', amount='**.8', from='list', insuranceFeeFlag='', subProductCategory='', productCode='', productType='LOAN_REQUEST', bidFee='', backTag='', h5params=''}}]
5、com.lufax.android/.v2.app.finance.invest.pay.InvestPayActivity为投资付款确认页,传递的参数:
Intent { cmp=com.lufax.android/.v2.app.finance.invest.pay.InvestPayActivity (has extras) } Extras=Bundle[{payAmount=6,756.80, sid=***, coinString=***, coins=[***], investModel=InvestModel{tradeChannel='2', productCategory='R01', salesArea='', productId='***', amount='6756.8', from='list', insuranceFeeFlag='', subProductCategory='', productCode='', productType='LOAN_REQUEST', bidFee='', backTag='', h5params=''}, externalInfo=, addressData=null, fragment_instace=com.lufax.android.v2.app.finance.invest.pay.InvestPayFragment, productName=稳盈-***}]
6、通过界面启动的跟踪,可以发现,我们只要有了productId sid 就可以直接启动InvestBaseActivity。
由于加固无法分析,InvestPayActivity需要的coinString和coins是如何生存的,所以不能直接启动InvestPayActivity
productId可以通过http请求网页https://list.lu.com/list/transfer-p2p解析后直接获得。
sid,通过网页的Debug跟踪,发现可以通过请求https://secmkt.lu.com/secmkt/service/investment/v1/invest-check获取。
启动InvestBaseActivity后通过hook OnResume方法,直接自动点击按钮 跳入InvestPayActivity界面。
7、进入到InvestPayActivity界面,通过Hook Button跟踪到两个关键的按钮,自动点击就可以了。
8、自动输入密码
final Class BasicEditItem = XposedHelpers.findClass("com.lufax.android.ui.BasicEditItem", cl);
XposedHelpers.findAndHookMethod(BasicEditItem, "b",int.class,new XC_MethodHook(){
@Override
protected void afterHookedMethod(MethodHookParam param)
throws Throwable {
super.afterHookedMethod(param);
LinearLayout item = (LinearLayout) param.thisObject;
String csName = param.thisObject.getClass().getName();
if(csName.contains("BasicEditPasswordItem")){
EditText edit = (EditText)
edit.setText("****");
}
}
});
9、hook所有按钮 方便逻辑跟踪
XposedHelpers.findAndHookMethod(View.class, "setOnClickListener",OnClickListener.class,new XC_MethodHook(){
@Override
protected void afterHookedMethod(MethodHookParam param)
throws Throwable {
super.afterHookedMethod(param);
if(param.thisObject instanceof Button){
Button bt = (Button) param.thisObject;
int id = bt.getId();
if(2131692405 == id){//投资付款界面的下一步按钮
mHandler.removeMessages(0);
mHandler.sendEmptyMessageDelayed(0, 10);
mHandButton = bt;
}else if(id == 2131690401){//投资付款界面的立即投资按钮
mHandler.removeMessages(0);
mHandler.removeMessages(1);
mHandler.sendEmptyMessageDelayed(0, 10);
mHandler.sendEmptyMessageDelayed(1, 10000);
mHandButton = bt;
}
}
}
10、陆金所 大部分Acitivity继承此类
final Class LufaxBaseActivityV2 = XposedHelpers.findClass("com.lufax.android.v2.base.component.LufaxBaseActivityV2", cl);
XposedHelpers.findAndHookMethod(LufaxBaseActivityV2, "onCreate",Bundle.class,new XC_MethodHook(){
@Override
protected void afterHookedMethod(MethodHookParam param)
throws Throwable {
super.afterHookedMethod(param);
LOG.d("onCreate:"+param.thisObject.getClass().toString());
Activity act = (Activity) param.thisObject;
if(act.getClass().getName().contains("InvestBaseActivity")// 投资确认界面
||act.getClass().getName().contains("RootControllerActivity")//投资信息界面
||act.getClass().getName().contains("InvestPayActivity")//投资付款界面
){
if(act.getClass().getName().contains("InvestPayActivity")){
mInvestPayActivity = act;
}
//输出界面启动传递的参数信息。
if(act.getClass().getName().contains("InvestBaseActivity")){
mInvestBaseActivity = act;
}
Intent it = act.getIntent();
LOG.d("it="+it + " Extras="+it.getExtras());
if(param.args != null){
Bundle b = (Bundle) param.args;
LOG.d("b="+b);
}
}
}
});
表示看不懂,不能作成成品吗 bandhzh 发表于 2018-1-13 21:50
我最近也在研究陆金所, 稍微看了下 ,手机端最后是不是又调用回类似webView访问网页端啊
一些节目是html的。。 楼主分析了那么多呀,支持你
支持你
楼主厉害了
这么牛逼 厉害的无以伦比了 如果谁能帮忙提取出陆金所加固的代码,或者怎么抓HTTPS的包,就能达到更好的效果。 我最近也在研究陆金所, 稍微看了下 ,手机端最后是不是又调用回类似webView访问网页端啊 bandhzh 发表于 2018-1-15 18:50
我最近也在摸索陆金所的
方便加下QQ 我们一起讨论下
763518276
有什么进展直接在论坛说吧。。。
页:
[1]
2