人不輕狂枉少年

大神的辭職,帶走了騷豆腐和烤洋芋溶锭,帶走了星辰大海宝恶,也帶走了破解的自動(dòng)打卡。已被懶惰侵蝕的我趴捅,早已無法按時(shí)起床垫毙。為了回到我溫暖的被窩,經(jīng)過python的指引驻售,終于完成了自動(dòng)打卡的代碼露久。


抓包分析

之前使用Burpsuite來抓包,后來嫌窗口切來切去麻煩就在windows上裝了Fiddler4欺栗,其實(shí)還是比較好用的。首先做的第一部就是設(shè)置代理了,因?yàn)楣敬蚩ㄊ褂胊pp實(shí)現(xiàn)的迟几。在Fiddler4的菜單選擇Tools->options,在下圖紅色框內(nèi)打上勾消请。接下來Ipconfig看下自己電腦的IP,手機(jī)和電腦連接到同一局域網(wǎng)类腮,在手機(jī)中把電腦IP地址設(shè)置為代理地址臊泰。就可以抓包了。


代理.png
第一個(gè)包蚜枢,打開應(yīng)用

打開手機(jī)中公司的應(yīng)用缸逃,抓到第一個(gè)包,可以看出手機(jī)以POST方式像服務(wù)器提交了phoneType和userId厂抽,兩個(gè)數(shù)據(jù)需频,先將他們存下來,包1-1是http請求頭信息筷凤。


包1-1.png

包1-2是手機(jī)客戶端主動(dòng)向服務(wù)器發(fā)送的數(shù)據(jù)昭殉。


包1-2.png
第二個(gè)包,客戶端登錄

接下來手機(jī)模擬登錄截到第二個(gè)包藐守。包2-1顯示的為手機(jī)客戶端登錄請求的地址目錄為/mobile/login 挪丢。


包2-1.png

包2-2為手機(jī)客戶端向服務(wù)器發(fā)送的數(shù)據(jù):
system=android
password=SO1Nc4KbrsEl3KKV1rwY3A%3D%3D
account=我的賬號
serialNumbe=869949028710182
version=7
model=FRD-AL10


包2-2.png

登錄成功后服務(wù)器將會(huì)回復(fù)如下信息:
這里比較重要的信息為token,使用基于 Token 的身份驗(yàn)證方法卢厂,在服務(wù)端不需要存儲用戶的登錄記錄乾蓬。大概的流程是這樣的:
1、客戶端使用用戶名跟密碼請求登錄
2慎恒、服務(wù)端收到請求任内,去驗(yàn)證用戶名與密碼
3、驗(yàn)證成功后巧号,服務(wù)端會(huì)簽發(fā)一個(gè) Token族奢,再把這個(gè) Token 發(fā)送給客戶端
4、客戶端收到 Token 以后可以把它存儲起來丹鸿,比如放在 Cookie 里或者 Local Storage 里
5越走、客戶端每次向服務(wù)端請求資源的時(shí)候需要帶著服務(wù)端簽發(fā)的 Token
服務(wù)端收到請求,然后去驗(yàn)證客戶端請求里面帶著的 Token,如果驗(yàn)證成功,就向客戶端返回請求的數(shù)據(jù)


包2-2.png
第三個(gè)包管怠,考勤打卡

最后一個(gè)包就是打卡的包了豹障,點(diǎn)擊打卡發(fā)現(xiàn)打卡請求地址為/mobile/busUserClock/saveOrUpdateNewUserClock,其實(shí)頭文件都是一樣的只有上傳的長度不同。


包3-1.png

點(diǎn)擊打卡后客戶端向服務(wù)器端發(fā)送的數(shù)據(jù)為:
1徽诲、之前登錄成功后獲取的token,這里的token和之前的截圖不符是因?yàn)椋沂謾C(jī)打過卡就無法再打,為了提到截圖用的是同事的手機(jī)肋殴;
2囤锉、longitude(精度)、latitude(緯度)护锤,中間我省略了幾個(gè)請求的包官地,公司打卡的定位是通過調(diào)用百度地圖API獲得定位的,這里的經(jīng)緯度也是從那里來的烙懦;
3驱入、在第一次打開應(yīng)用時(shí),客戶端主動(dòng)向服務(wù)器發(fā)送的userId氯析;
4亏较、startTime、endTime我們上下班時(shí)間=掩缓。=#雪情;
5、position這個(gè)是打卡的地址拾因。


包3-2.png

服務(wù)器返回的數(shù)據(jù)為簽退成功旺罢。
包3-3.png

python實(shí)現(xiàn)

終于到了激動(dòng)人心的時(shí)刻,使用python模擬上述發(fā)包的過程實(shí)現(xiàn)客戶端與服務(wù)器的交互绢记。這里先自己檢討下扁达,我寫的代碼就跟一坨屎一樣,但是一邊抓包一邊寫蠢熄,最后直接拼在一起的跪解,相當(dāng)?shù)拇植冢戎苣┰俸煤酶南麓a吧=签孔。=#

#! /usr/bin/python
# coding:utf - 8

"""
autho:czy
僅用于自己使用
"""
import requests

url_init = 'http://服務(wù)器地址:端口號/mobile/person/getNewVersion'
url_login = 'http://服務(wù)器地址:端口號/mobile/login'
url_clock = "http://服務(wù)器地址:端口號/mobile/busUserClock/saveOrUpdateNewUserClock"

#打開應(yīng)用頭請求
headers_init = {
        "User-Agent": "Dalvik/2.1.0 (Linux; U; Android 7.0; FRD-AL10 Build/HUAWEIFRD-AL10)",
        "Accept-Encoding": "gzip",
        "Content-Length": "52",
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        "Connection": "Keep-Alive"
}

#登錄頭請求
headers_login = {
        "User-Agent": "Dalvik/2.1.0 (Linux; U; Android 7.0; FRD-AL10 Build/HUAWEIFRD-AL10)",
        "Accept-Encoding": "gzip",
        "Content-Length": "129",
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        "Connection": "Keep-Alive"
}

#打卡頭請求
headers_clock = {
        "User-Agent": "Dalvik/2.1.0 (Linux; U; Android 7.0; FRD-AL10 Build/HUAWEIFRD-AL10)",
        "Accept-Encoding": "gzip",
        "Content-Length": "461",
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        "Connection": "Keep-Alive"
}

#打開應(yīng)用傳送的數(shù)據(jù)
payload_init = {
        "phoneType": "1",
        "userId": "402880f25c620dd7015c76227a2019da"
}

#登錄傳送的數(shù)據(jù)
payload_login = {
        "system":"android",
        #注意這里UTF-8編碼會(huì)將=號轉(zhuǎn)化為%3D,所以發(fā)送數(shù)據(jù)時(shí)應(yīng)使用=號
        "password":"SO1Nc4KbrsEl3KKV1rwY3A==",
        "account":"我的賬號叉讥,這里就公開了",
        "serialNumber":"869949028710182",
        "version":"7.0",
        "model":"FRD-AL10",
}

#模擬發(fā)送打開應(yīng)用的包
r = requests.post(url_init,data = payload_init,headers = headers_init)
#print r.text  可以用于檢查服務(wù)器是否正常返回?cái)?shù)據(jù)

#模擬發(fā)送登錄數(shù)據(jù)的包
r2 = requests.post(url_login,data = payload_login,headers = headers_login)
#從返回的數(shù)據(jù)中提取token
token = str(r2.text[466:654])
#print token  可以用于檢查服務(wù)器是否正常返回?cái)?shù)據(jù)

#打卡發(fā)送的數(shù)據(jù)
payload_clock = {
        "token": token,
        "longitude": "102.676988",
        "userId":"402880f25c620dd7015c76227a2019da",
        "latitude": "25.053235",
        #注意這里UTF-8編碼會(huì)將:號轉(zhuǎn)化為%3A,所以發(fā)送數(shù)據(jù)時(shí)應(yīng)使用:號
        "startTime": "09:00",
        "endTime": "18:00",
        #公司打卡分上下班下面注釋的是上班發(fā)送的數(shù)據(jù),沒注釋的是下班發(fā)送的數(shù)據(jù)饥追。
        #"position": "這里寫上打卡的地址",
        #"isStart": "1"
        "position": "這里寫上打卡的地址",
        "isStart": "0"
}

#模擬打卡發(fā)送的包
r3 = requests.post(url_clock,data = payload_clock,headers = headers_clock)
print r3  #查看是否正常打卡

運(yùn)行結(jié)果<Response [200]>http狀態(tài)表返回成功图仓,查看手機(jī)打卡成功。


運(yùn)行結(jié)果.png

服務(wù)器自動(dòng)運(yùn)行python腳本

腳本已經(jīng)可以正常使用了接下來就是讓機(jī)器幫我們運(yùn)行了但绕,如果天天起來自己點(diǎn)腳本就和用手機(jī)打沒區(qū)別了救崔。在公司的KVM上建個(gè)CentOS6.9的服務(wù)器(噓!D笏场六孵!悄悄呢)。
把腳本拷上去取個(gè)帥氣的名字

帥氣的名字.png

這里注意有些同學(xué)運(yùn)行不了會(huì)提示缺少模塊requests
安裝擴(kuò)展源EPEL幅骄。
EPEL(http://fedoraproject.org/wiki/EPEL) 是由 Fedora 社區(qū)打造劫窒,為 RHEL 及衍生發(fā)行版如 CentOS、Scientific Linux 等提供高質(zhì)量軟件包的項(xiàng)目拆座。
~]# yum -y install epel-release
然后再安裝pip
~]# sudo yum -y install python-pip
最后安裝requests模塊
~]#pip install requests

crontab

接下來為服務(wù)器設(shè)置定時(shí)任務(wù)
~]#crontab -e
crontab命令格式:
"* * * * * command"
M H D m d command
M: 分(0-59)
H:時(shí)(0-23)
D:天(1-31)
m: 月(1-12)
d: 周(0-6) 0為星期日


雙休定時(shí)任務(wù).png

可以使用如下命令打開郵件查看定時(shí)任務(wù)執(zhí)行的情況
~]#tail -f /var/spool/mail/root
這里我測試了一下主巍,執(zhí)行成功冠息!


執(zhí)行成功.png

后續(xù)代碼整理

公司更新后軟件重新整理了下代碼,更新如下:

#! /usr/bin/python
# coding:utf - 8

"""
autho:czy
"""
import requests
import json
import time

#請求和打卡地址
url_login = 'http://服務(wù)器地址:端口號/mobileFrame/login'
url_clock = "http://服務(wù)器地址:端口號/mobile/Hr/userClock"

#偽裝頭信息
headers_init = {
        "Accept":"application/json",
        "Accept-Encoding": "gzip,deflate",
        "Accept-Language":"zh-CN,en-US;q=0.8",
        "User-Agent": "Mozilla/5.0 (Linux; Android 7.0; FRD-AL10 Build/HUAWEIFRD-AL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/55.0.2883.91 Mobile Safari/537.36 Html5Plus/1.0 (Immersed/24.0)",
        "X-Requested-With": "XMLHttpRequest",
        "Content-Length": "453",
        "Content-Type": "application/x-www-form-urlencoded",
        "Origin": "file://",
        "Connection": "Keep-Alive"
}

#偽裝登錄請求信息
payload_login = {
        "system":"android",
        "password":"XXXXXX", #這里填寫截取到的密碼
        "account":"XXXXX",  #這里填寫賬號
        "serialNumber":"869949028710182%2C869949027256583",
        "version":"7.0",
        "model":"FRD-AL10",
}

#模擬登錄系統(tǒng)抓取token
server_request_login = requests.post(url_login,data = payload_login,headers = headers_init)
server_response_login = dict(json.loads(server_request_login.text))
#相比上次切片截取煤禽,使用字典截取更為嚴(yán)謹(jǐn)
response_token = server_response_login['data'][0]['token']

#獲取當(dāng)前時(shí)間
now_time = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())

#判斷上下班時(shí)間(上次腳本做了兩個(gè)這里加入判斷就避免寫兩個(gè)腳本了)
if int(time.strftime("%H%M%S"))<85959:
        State = "SIGN"
else:
        State = "SIGN_OUT"

#偽裝打卡請求信息
payload_clock = {
        "token": response_token,
        "lng": 102.677008,
        "lat": 25.053206,
        "distance": 46.01784908422327,
        "signState": State,
        "nowTime": now_time,
        "position": "打卡的地址",
}

#模擬打卡
server_request_clock = requests.post(url_clock,data = payload_clock,headers = headers_init)
print(server_request_clock)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铐达,一起剝皮案震驚了整個(gè)濱河市岖赋,隨后出現(xiàn)的幾起案子檬果,更是在濱河造成了極大的恐慌,老刑警劉巖唐断,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件选脊,死亡現(xiàn)場離奇詭異,居然都是意外死亡脸甘,警方通過查閱死者的電腦和手機(jī)恳啥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丹诀,“玉大人钝的,你說我怎么就攤上這事∶猓” “怎么了硝桩?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長枚荣。 經(jīng)常有香客問我碗脊,道長,這世上最難降的妖魔是什么橄妆? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任衙伶,我火速辦了婚禮,結(jié)果婚禮上害碾,老公的妹妹穿的比我還像新娘矢劲。我一直安慰自己,他們只是感情好慌随,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布芬沉。 她就那樣靜靜地躺著,像睡著了一般儒陨。 火紅的嫁衣襯著肌膚如雪花嘶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天蹦漠,我揣著相機(jī)與錄音椭员,去河邊找鬼。 笑死笛园,一個(gè)胖子當(dāng)著我的面吹牛隘击,可吹牛的內(nèi)容都是我干的侍芝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼埋同,長吁一口氣:“原來是場噩夢啊……” “哼州叠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起凶赁,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤咧栗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后虱肄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體致板,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年咏窿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了斟或。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡集嵌,死狀恐怖萝挤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情根欧,我是刑警寧澤怜珍,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站咽块,受9級特大地震影響绘面,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侈沪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一揭璃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧亭罪,春花似錦瘦馍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至箩祥,卻和暖如春院崇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袍祖。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工底瓣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蕉陋。 一個(gè)月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓捐凭,卻偏偏與公主長得像拨扶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子茁肠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容

  • 從出發(fā)到今天已經(jīng)是第25天了垦梆!一路上走走停停匹颤。休整的時(shí)候出去耍!總是和隊(duì)友慶幸我們奶赔,躲過了泥石流惋嚎、塌方、洪水站刑、下雨...
    董大花不是個(gè)軟妹子閱讀 1,442評論 23 6
  • 青春片+辣眼睛海報(bào)+辣眼睛片名+下跪賣慘宣傳,完美的正中全部雷點(diǎn)鼻百。 《閃光少女》是一部排片量少到大眾點(diǎn)評第一頁都刷...
    f0e95ba20658閱讀 538評論 1 4
  • 風(fēng)吹開了側(cè)窗 吹進(jìn)了花香 窗邊的簾隨風(fēng)輕揚(yáng) 一切都和平常一樣 你我做了三年同窗 如今分頭走進(jìn)考場 你坐在誰的身旁 ...
    步千謹(jǐn)閱讀 523評論 1 3
  • 《母親》 文/鐵木迭兒 (一) 我是歲月绞旅,無情的劊子手 刀下是誰的青春 我是忠于,靈魂的雕刻師 誰的額頭任由我温艇,肆...
    鐵牟閱讀 427評論 0 8