用Fiddler实现某干教网App学习记录修改(秒刷学时)

查看 144|回复 11
作者:swordwind   
注册吾爱这么长时间来,一直是看别人的帖子,这几天居家办公,闲时也学着用Fiddler做了一下安卓的App抓包分析,找来找去,还是用最“熟悉”的某干教网来练手了。最终效果是在Fiddler的帮助下,实现网上学习课程暂停后直接退出即完成学习(学时到手),无视课程所需学习时间。


IMG_5714.JPG (11.39 KB, 下载次数: 0)
下载附件
2022-12-5 23:09 上传

        这就是今天的主角,相关部门人员每年有50个学时的线上学习任务,大多数课都是要看几十分钟到2、3个小时的视频不等。看完诸多大神关于Fiddler的帖子以后,感觉本地学习的数据必定是上传到服务器进行记录,理论上让用Fiddler作中转代{过}{滤}理,截获相关信息并篡改后,直接告诉服务器我已经学完这门课不是就OK了吗?说干就干。新手小白动手实践起来!

1.准备工作
        首先当然是下载安装和配置Fiddler,基本上是按照论坛里bigbirdl大神写的教程一步一步做的,https://www.52pojie.cn/thread-1171662-1-1.html
        因为我用的是MACOS,只能在虚拟机里进行安装,需要注意的是因为Fiddler所运行的主机(既我的Windows虚拟机)需要和手机在同一个局域网(Wifi)里,所以在虚拟机的网络设置里,需要改为“桥接网络(Wifi)”,否则无法正常抓取手机上的数据包。Fiddler设置好并运行后如下图


step1.png (148.21 KB, 下载次数: 0)
下载附件
1
2022-12-5 23:09 上传

        另外,个人习惯是把“Rules”菜单下的“Hide CONNECTs”选项给勾选上,这样可以不看建立连接用的数据包(这些数据包里没有我们关心的数据),避免刷屏。另外,抓手机的数据包里,可以暂停本机(电脑)数据包的抓取,方法是单击一下左下角的那个“Capturing”字样处,该处无显示时即可。
2.开始抓包
        手机打开某干教网程序,登录后进入在线学习页面,在开始学习前,可以在Fiddler当前Session列表(即显示一大堆已经抓到的数据包相关信息的窗口)里按“Ctrl+X”快捷键把之前操作过程中抓到的数据清除,准备寻找和分析学习记录上传的相关数据包。


IMG_5713.JPG (265.5 KB, 下载次数: 0)
下载附件
2022-12-5 23:09 上传



IMG_5712.JPG (204.67 KB, 下载次数: 0)
下载附件
2022-12-5 23:09 上传

        选了一个2学时的课程,获得学时需要1小时2分24秒。老实说课讲得都非常好,但是我们只要学时,就对不起王老师了😂。开始播放后,我点击了暂停(实际上在后来的分析中发现,App会定时自动回传学习记录,也会在用户暂停的时候马上回传一次学习记录)。Fiddler上马上抓到了一系列数据包,我们来逐个看一看。


step2.png (139.13 KB, 下载次数: 0)
下载附件
2
2022-12-5 23:09 上传

        先是几个"isLogin",应该是判断登录信息是否过期的,跳过。然后重点来了,这个"addStudyRecord.json"你们觉得可疑不可疑?这命名简直太规范了,还有下面那个"addNtStudyTime.json",初步锁定就是这两个文件之一了,至于后面的coursedetail这些课程信息相关的,直接忽略不计了。然后分别点开两个包观察了一下,addNtStudyTime.json里并没有相关数据,而addStudyRecord.json这个请求里,可以看到如上图中的studyRecordList这个值,里面的字段也很好辨认(确实是命名很规范),前面是课程和学生的ID,然后是进入视频的时间accessTimeStr、退出(暂停)时间exitTimeStr,接下来是playlength和playTime这两个字段,从两个字段的值可以明显看出来应该是playlength,因为它的值正好就是退出时间减进入时间,单位看来是秒。那么只要把这个值改为我们想要的时长,在服务器端不作数据验证(比如用exitTime减accessTime,算一下是否和playlength一致)的情况下,应该就可以达到我们速刷的目的了。
3.手动修改数据包
        在Fiddler里设置断点,当App向服务器上传数据的时候截获并暂停,待我们修改相关数据以后再放行。


step3.png (116.47 KB, 下载次数: 0)
下载附件
3
2022-12-5 23:09 上传



step3-2.png (75.48 KB, 下载次数: 0)
下载附件
3-2
2022-12-5 23:09 上传

        上面两个图中的办法都可以,也可以参考右图上的快捷键,我们需要设的断点是“Before Requests”,也就是App的请求发出前。然后回到手机上,恢复播放后再一次暂停。这时Fiddler上会显示有请求被截获并暂停,一开始可能并没有我们关心的addStudyRecord请求,可以直接点工具栏上的“Go”(绿色小三角那个图标)放行,直到addStudyRecord出现,直接双击该数据包session,在右边的窗口中修改。


step4.png (71.16 KB, 下载次数: 0)
下载附件
4
2022-12-5 23:09 上传

        将playlength改为3600(即1小时),修改完以后一定要按“回车”(好像要这样才能保存修改,新手小白表示不明真相),之后点“Go”放行。在手机上看一下,修改生效了。


IMG_5711.JPG (203.13 KB, 下载次数: 0)
下载附件
2022-12-5 23:09 上传

        学习进度从0%直接到96%了,实际上刚才修改的时候再多改一点(比如7200秒),就能直接学完课程拿学时。至此,目的达到,学时到手。不过还没完,还有一个小彩蛋。
4.自动修改数据包
        既然上一章叫手动修改数据包,当然会有一个自动修改数据包的彩蛋。虽然能够直接修改学习时长,比拿手机看1小时快多了,但是还是需要反复操作,挺麻烦不是。Fiddler还有一个很强大的功能,可以自动修改request数据(response当然也能)。进入Fiddler的Rules菜单,点击Customize Rules...,快捷键CTRL+R,进入Fiddler ScriptEditor,直接修改Fiddler的自动化脚本。


step5.png (47.04 KB, 下载次数: 0)
下载附件
5
2022-12-5 23:09 上传



step6.png (33.93 KB, 下载次数: 0)
下载附件
6
2022-12-5 23:09 上传



step7.png (58.6 KB, 下载次数: 0)
下载附件
7
2022-12-5 23:09 上传

        方便起见,几张图我就放一起了。在Fiddler ScriptEditor中进入Go菜单下的to OnBeforeRequest,跳转到相应的函数里,然后在函数的最后面加上如下代码。
[JavaScript] 纯文本查看 复制代码if (oSession.fullUrl.Contains("http://mstudy-bjce.bjdj.gov.cn/mobile/module/mobile/mobileinterface/v1/mobilecourse/addStudyRecord.json")){
                        var reqStr=oSession.GetRequestBodyAsString();
                        //将playlength中的值修改
                        var prevInd=reqStr.indexOf('playlength%22%3A')+16;
                        var nextInd=reqStr.indexOf('%2C%22playTime');
                        var myReqStr=reqStr.substring(0,prevInd)+'3600'+reqStr.substr(nextInd);
                        Fiddler.FiddlerApplication.Log.LogString(myReqStr);
                        oSession.utilSetRequestBody(myReqStr);}
        需要说明的是if判断里的那个URL是在抓到addStudyRecord数据包后,右击该数据包,选择copy菜单下的Just URL,然后再粘贴出来的,也就是只针对这个请求进行修改。实际上,我自己在写这段代码的时候遇到很多麻烦,首先是RequestBody的值我一开始一直以为是JSON格式,但后来仔细看了一下数据包的TextView,发现并非如此。想用正则来替换playlength部分,在网上查了半天,发现Fiddler Script好像并不支持正则(如果有大神知道如何用正则烦请告知为谢),于是就只好用了个笨办法,先找到playlength的位置,再找到后面playtime的位置,把两头的字符串都截出来,再加上我想要的学习时长,拼接成想要的RequestBody,然后发送。

下载次数, 数据包

swordwind
OP
  


ydjhome 发表于 2022-12-13 18:26
我按照您的教程试着修改我单位的学习记录,抓包后有两个包应该是更新学习记录。
第一个:

从截图来看,应该是第一个包,即update-progress那个request,需要修改的应该是studyTime。
相关数据明显是加密了,但是你可以试试直接把resourceTotalTime的值复制到studyTime里(前者是课程总时长,如果studyTime是我所猜的已学时长的话,那应该就能直接学完)。
PS:保险起见的话,干脆把lessonLocation的值也用resourceTotalTime的值替换掉,这个字段应该是你当前观看视频位置。
psp7456   


半杯不倒 发表于 2022-12-8 09:27
麻烦问下PC上多开不会挤掉账号吗?求详细方法,谢谢了

我指的是多开课程同时学。这个也看学习平台的,一个账号正常只允许学一门课,不允许多开同时学。但是,如果这个反刷课的检测是浏览器端实现的,就可以关闭反刷课检查。具体方法也是抓包,大多有个配置文件(比如知学云的ANTI_BRUSH_COURSE_MECHANISM),里面有个参数(enableAuti=1)可以控制反刷课测检测,用fiddler、mitmproxy或者油猴子脚本都可以修改这个参数,最终实现多开课程同时学。
feiyu361   

很不错,学习了
满不懂   

这个方法很好,很实用,感谢分享。
bester   

fiddler学习教程在哪能看,我B站找的都是,哎 一言难尽
三滑稽甲苯   

没记错的话fiddlerScript是基于javascript的,可以网上找找javascript中的正则表达式
elitest   

感谢楼主分享!很详细的教程!
12member   

谢谢楼主分享
6497649   

感谢楼主分享!
您需要登录后才可以回帖 登录 | 立即注册

返回顶部