滴答清單PC破解原理分析(可同步嘲碱、修復(fù)登錄秒退)

前言

今天本著學(xué)習(xí)研究的態(tài)度,下載了一個(gè)滴答清單PC pj版局蚀,發(fā)布日期大概是19年4月左右麦锯。

下載之后登錄時(shí)卻遇到了問(wèn)題,輸完賬號(hào)密碼點(diǎn)擊登錄琅绅,然后就會(huì)提示Login_OutDate扶欣,大概就是說(shuō)用戶(hù)不是VIP了,不能用,請(qǐng)重新登錄

由于比較好奇為什么之前能用料祠,現(xiàn)在不能用了骆捧,于是逆了一下代碼,然后就有了這篇文章髓绽,成功的繞過(guò)了登錄后彈窗的問(wèn)題敛苇,以及無(wú)法同步的限制

正文

首先根據(jù)關(guān)鍵字定位到彈窗代碼

可以從上圖看到,程序彈窗之后就會(huì)關(guān)閉當(dāng)前窗體顺呕,重置界面登錄狀態(tài)枫攀,顯示登錄窗體,那么我們就可以通過(guò)return大法很輕松的讓程序不退出登錄并繼續(xù)執(zhí)行

進(jìn)行修改后株茶,我們繼續(xù)分析函數(shù)關(guān)系来涨,找到上級(jí)調(diào)用,看看還有沒(méi)有其他檢測(cè)

可以看到启盛,上面其實(shí)也是對(duì)當(dāng)前登錄的用戶(hù)信息進(jìn)行了一個(gè)重置的操作的蹦掐,所以這邊也是要繼續(xù)return掉的

保險(xiǎn)起見(jiàn)繼續(xù)回溯,看上級(jí)調(diào)用

從這里可以看出來(lái)僵闯,程序請(qǐng)求了滴答清單的API接口來(lái)獲取用戶(hù)信息卧抗,如果檢測(cè)到用戶(hù)非法,就執(zhí)行剛剛我們找到的那一系列函數(shù)進(jìn)行登出操作棍厂。

那么做到這一步之后颗味,就解決了PC端登錄秒退的問(wèn)題,用戶(hù)已經(jīng)可以正常本地使用原破解版的所有功能了牺弹,但目前還不能同步,會(huì)提示網(wǎng)絡(luò)錯(cuò)誤

所以我們繼續(xù)看為什么會(huì)走到:response.StatusCode == HttpStatusCode.Unauthorized时呀,能否通過(guò)修改判斷邏輯實(shí)現(xiàn)數(shù)據(jù)同步

為了方便大家理解张漂,我把上面那張圖中所在函數(shù)的關(guān)鍵邏輯貼出來(lái)

嫌亂的可以跳過(guò)這部分代碼,我一會(huì)還會(huì)用文字解釋

            HttpClient httpClient = ProxyHelper.GetHttpClient();
            httpClient.DefaultRequestHeaders.Add("Authorization", "OAuth " + **auth**);
            httpClient.DefaultRequestHeaders.Add("User-Agent", "TickTickClient/1.0");
            httpClient.DefaultRequestHeaders.Add("x-device", Utils.GetDeviceInfo());
            string domain = BaseUrl.GetDomain();
            string uriString;
            if (!**fulluri**)
            {
              uriString = domain + **api**;
            }
            else
            {
              uriString = **api**;
            }
            string mode2 = **mode**;
            if (!(mode2 == "POST"))
            {
              if (!(mode2 == "GET"))
              {
                if (!(mode2 == "PUT"))
                {
                  if (mode2 == "DELETE")
                  {
                    response = httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Delete, new Uri(uriString))
                    {
                      Content = new StringContent(**content**, Encoding.UTF8, "application/json")
                    }).Result;
                  }
                }
                else
                {
                  response = httpClient.PutAsync(new Uri(uriString), new StringContent(**content**, Encoding.UTF8, "application/json")).Result;
                }
              }
              else
              {
                response = httpClient.GetAsync(new Uri(uriString)).Result;
              }
            }
            else if (**paramList** == null || **paramList**.Count == 0)
            {
              response = httpClient.PostAsync(new Uri(uriString), new StringContent(**content**, Encoding.UTF8, "application/json")).Result;
            }
            else
            {
              response = httpClient.PostAsync(new Uri(uriString), new FormUrlEncodedContent(**paramList**)).Result;
            }
            if (response != null && (response.StatusCode == HttpStatusCode.OK | **isNeedErrorReturn**))
            {
              responseReturn = response.Content.ReadAsStringAsync().Result;
              if (App.ProExpiredSyncError)
              {
                App.ProExpiredSyncError = false;
              }
            }
            else if (response != null && response.StatusCode == HttpStatusCode.InternalServerError)
            {
              responseReturn = response.Content.ReadAsStringAsync().Result;
              if (!string.IsNullOrEmpty(responseReturn))
              {
                NetWork.HandleApiError(responseReturn);
              }
            }
            else if (response != null && response.StatusCode == HttpStatusCode.Unauthorized)
            {
              Utils.TokenOutDate();
            }

這段代碼大概說(shuō)了個(gè)啥呢谨娜?其實(shí)邏輯很簡(jiǎn)單航攒,就下面4個(gè)步驟:

  1. 獲取當(dāng)前設(shè)備信息
  2. 獲取需要同步的數(shù)據(jù)(比如新增、刪除趴梢、修改待辦事項(xiàng)這些)
  3. 將需要同步的數(shù)據(jù)和當(dāng)前設(shè)備信息發(fā)送到滴答清單的遠(yuǎn)程API接口
  4. 根據(jù)遠(yuǎn)程API返回判斷是否同步成功

總的來(lái)說(shuō)漠畜,這些邏輯是通過(guò)傳參數(shù)到服務(wù)端進(jìn)行校驗(yàn),本地并沒(méi)有做會(huì)員狀態(tài)檢測(cè)坞靶,直接調(diào)用的服務(wù)端API接口

但憔狞!滴答清單有一個(gè)比較特殊的地方,他的手機(jī)端數(shù)據(jù)是可以相互同步的

也就是說(shuō)彰阴,我們或許可以通過(guò)修改電腦端發(fā)出的請(qǐng)求瘾敢,使服務(wù)端API認(rèn)為我們是一個(gè)手機(jī)APP,這樣我們就可以繞過(guò)檢測(cè)直接同步了

通過(guò)手機(jī)APP抓包對(duì)比,我發(fā)現(xiàn)只需要修改:

httpClient.DefaultRequestHeaders.Add("x-device", Utils.GetDeviceInfo());

為:

httpClient.DefaultRequestHeaders.Add("x-device", “手機(jī)端UA”);

即可模擬成手機(jī)請(qǐng)求

修改的過(guò)程中我發(fā)現(xiàn)其實(shí)原破解作者也是相同的思路簇抵,他修改了Utils里的GetDeviceInfo函數(shù)庆杜,強(qiáng)制返回一個(gè)iPad的UA,按理說(shuō)是可以同步的(并且前幾個(gè)月確實(shí)能正常使用)

那么我可以做出合理推測(cè)碟摆,原作者發(fā)布破解版本后晃财,被大家廣泛使用,最后滴答清單官方團(tuán)隊(duì)取得了破解樣本典蜕,進(jìn)行分析后断盛,對(duì)該UA進(jìn)行了拉黑處理

也就是說(shuō)——目前網(wǎng)上流傳的那些破解版本沒(méi)準(zhǔn)都是出自一人之手。嘉裤。所以一個(gè)UA封掉之后全部不能用了

總而言之郑临,通過(guò)修改UA的值,即可繞過(guò)服務(wù)端API檢測(cè)屑宠,實(shí)現(xiàn)數(shù)據(jù)同步

后記

回顧了一下整個(gè)流程厢洞,其實(shí)官方應(yīng)該是拉黑了破解版的UA,所以只要換掉UA典奉,應(yīng)該就不會(huì)出現(xiàn)異常檢測(cè)了躺翻,也就是說(shuō)不需要去在函數(shù)內(nèi)做return。


博客文章遷移: 2020-01-12 01:23

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末卫玖,一起剝皮案震驚了整個(gè)濱河市公你,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌假瞬,老刑警劉巖陕靠,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異脱茉,居然都是意外死亡剪芥,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)琴许,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)税肪,“玉大人,你說(shuō)我怎么就攤上這事榜田∫嫘郑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵箭券,是天一觀的道長(zhǎng)净捅。 經(jīng)常有香客問(wèn)我,道長(zhǎng)邦鲫,這世上最難降的妖魔是什么灸叼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任神汹,我火速辦了婚禮,結(jié)果婚禮上古今,老公的妹妹穿的比我還像新娘屁魏。我一直安慰自己,他們只是感情好捉腥,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布氓拼。 她就那樣靜靜地躺著,像睡著了一般抵碟。 火紅的嫁衣襯著肌膚如雪桃漾。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,785評(píng)論 1 290
  • 那天拟逮,我揣著相機(jī)與錄音撬统,去河邊找鬼。 笑死敦迄,一個(gè)胖子當(dāng)著我的面吹牛恋追,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播罚屋,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼苦囱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了脾猛?” 一聲冷哼從身側(cè)響起撕彤,我...
    開(kāi)封第一講書(shū)人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎猛拴,沒(méi)想到半個(gè)月后羹铅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡愉昆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年睦裳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撼唾。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖哥蔚,靈堂內(nèi)的尸體忽然破棺而出倒谷,到底是詐尸還是另有隱情,我是刑警寧澤糙箍,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布渤愁,位于F島的核電站,受9級(jí)特大地震影響深夯,放射性物質(zhì)發(fā)生泄漏抖格。R本人自食惡果不足惜诺苹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雹拄。 院中可真熱鬧收奔,春花似錦、人聲如沸滓玖。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)势篡。三九已至翩肌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間禁悠,已是汗流浹背念祭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碍侦,地道東北人粱坤。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像祝钢,于是被迫代替她去往敵國(guó)和親比规。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348