<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          [系統(tǒng)安全] 一.什么是逆向分析、逆向分析應(yīng)用及經(jīng)典掃雷游戲逆向

          共 12444字,需瀏覽 25分鐘

           ·

          2020-10-05 15:19

          娜璋AI安全之家于2020年8月18日開(kāi)通,將專(zhuān)注于Python和安全技術(shù),主要分享Web滲透、系統(tǒng)安全、CVE復(fù)現(xiàn)、威脅情報(bào)分析、人工智能、大數(shù)據(jù)分析、惡意代碼檢測(cè)等文章。真心想把自己近十年的所學(xué)所做所感分享出來(lái),與大家一起進(jìn)步。

          系統(tǒng)安全系列作者將深入研究惡意樣本分析、逆向分析、攻防實(shí)戰(zhàn)等,通過(guò)在線筆記和實(shí)踐操作的形式分享給大家,希望能與您一起進(jìn)步。第一篇文章先帶領(lǐng)大家學(xué)習(xí)什么是逆向分析,然后詳細(xì)講解逆向分析的典型應(yīng)用,接著通過(guò)OllyDbg工具逆向分析經(jīng)典的游戲掃雷,再通過(guò)Cheat Engine工具復(fù)制內(nèi)存地址獲取,實(shí)現(xiàn)一個(gè)自動(dòng)掃雷程序。

          該篇文章也是作者學(xué)習(xí)科銳錢(qián)林松老師在華中科技大學(xué)的分享視頻,這里非常推薦大家去看看。話不多說(shuō),讓我們開(kāi)始新的征程吧!您的點(diǎn)贊、評(píng)論、收藏將是對(duì)我最大的支持,感恩安全路上一路前行,如果有寫(xiě)得不好的地方,可以聯(lián)系我修改。基礎(chǔ)性文章,希望對(duì)您有所幫助,作者的目的是與安全人共同進(jìn)步,加油~

          文章目錄:

          • 一.什么是逆向分析

          • 二.掃雷游戲逆向分析

          • 三.掃雷游戲檢測(cè)工具

            1.Cheat Engine確定起始位置

            2.Cheat Engine確定邊界

            3.C++編寫(xiě)鼠標(biāo)坐標(biāo)獲取案例

            4.C++編寫(xiě)自動(dòng)掃雷程序

          作者的github資源:

          • https://github.com/eastmountyxz/

          聲明:本人堅(jiān)決反對(duì)利用教學(xué)方法進(jìn)行犯罪的行為,一切犯罪行為必將受到嚴(yán)懲,綠色網(wǎng)絡(luò)需要我們共同維護(hù),更推薦大家了解它們背后的原理,更好地進(jìn)行防護(hù)。(參考文獻(xiàn)見(jiàn)后)


          一.什么是逆向分析

          1.逆向工程

          科銳錢(qián)老師真的是大佬,擁有十余年的逆向工作經(jīng)驗(yàn),專(zhuān)注于先進(jìn)技術(shù)的算法還原及逆向?qū)嵱?xùn)。作者從中學(xué)習(xí)到很多知識(shí)。本次課程分享的是逆向分析技術(shù)的引導(dǎo),課程目標(biāo)是帶領(lǐng)大家了解下逆向分析是干什么的,在安全領(lǐng)域中是什么地位,并且穿插各種實(shí)戰(zhàn)示例,盡量提高大家的興趣。逆向分析是安全的基礎(chǔ)行業(yè),喜歡的人覺(jué)得很好玩,不喜歡的人覺(jué)得很苦逼。

          在講逆向分析前,大家思考下:你有沒(méi)有把別人的產(chǎn)品或Demo還原出源代碼來(lái)過(guò)呢?而且就是作者的源代碼,包括里面的BUG。

          • 反匯編:一次編譯技術(shù),閱讀匯編代碼反推出對(duì)應(yīng)的高級(jí)代碼,比如VC、GCC、Delphi等。

          • 反編譯:通常在C#、Java、.NET框架等,因?yàn)樗梢灾苯影言獢?shù)據(jù)還原成高級(jí)代碼,反編譯其實(shí)更難,但是對(duì)使用的人更簡(jiǎn)單,比如Android的APK反編譯成JAVA源代碼。

          下面開(kāi)始吧!第一個(gè)大家需要知道的是“什么是逆向工程?”

          什么是逆向工程?

          簡(jiǎn)單而言,一切從產(chǎn)品中提取原理及設(shè)計(jì)信息并應(yīng)用于再造及改進(jìn)的行為,都是逆向工程。在信息安全中,更多的是調(diào)查取證、惡意軟件分析等,不管你用什么工具或手段,能達(dá)到其目的就算逆向分析。下圖是《變形金剛》里面對(duì)它的描述,2007年的時(shí)候國(guó)內(nèi)對(duì)信息安全重視程度也不高,對(duì)逆向分析也沒(méi)有什么概念,真正重視是從老大提出“沒(méi)有網(wǎng)絡(luò)安全就沒(méi)有國(guó)家安全”之后。而那時(shí)候的國(guó)外電影就已經(jīng)用到了“reverse engineered”,說(shuō)明國(guó)外導(dǎo)員對(duì)這個(gè)技術(shù)及應(yīng)用場(chǎng)景都是了解的。

          逆向工程最早是在二Z時(shí)的船舶工業(yè),分析船的弱點(diǎn),通過(guò)外形反推內(nèi)部結(jié)構(gòu),其中粉紅色是Amuno、黃色是引擎室、藍(lán)色是龍骨、綠色是推進(jìn)器等等。只有知道怎么造一個(gè)船后,才能進(jìn)行逆向分析。

          當(dāng)然還有模具逆向、材料逆向、軟件逆向,在我們的軟件行業(yè),就稱(chēng)為軟件逆向。同樣,在網(wǎng)絡(luò)攻防中,你不可能先給出源碼再進(jìn)行攻擊,通常在安全對(duì)抗中第一步要做的就是逆向分析,不管你用什么方式進(jìn)行逆向分析,你都需要搞清楚:

          • 它是什么:樣本是什么,良性的還是惡意的

          • 它干了什么:樣本做了哪些事情

          • 我們?cè)趺崔k:知道做了什么才能進(jìn)行反制,如刪除注冊(cè)表啟動(dòng)項(xiàng)、清理感染的勒索病毒等


          2.逆向分析的典型應(yīng)用

          軟件逆向有很多實(shí)現(xiàn)辦法達(dá)到我們的目標(biāo),典型的應(yīng)用包括軟件工程、網(wǎng)絡(luò)安全、司法取證、商業(yè)保護(hù)等。

          逆向應(yīng)用——病毒分析

          對(duì)于逆向分析,最大的行當(dāng)就是病毒分析。對(duì)于一個(gè)安全企業(yè)來(lái)說(shuō),比如360,它的病毒分析團(tuán)隊(duì)屬于它的主業(yè),包括360、金山毒霸、騰訊醫(yī)生等,它們主要業(yè)務(wù)就是根據(jù)一些惡意樣本的行為,給出解決方案(專(zhuān)業(yè)查殺、完善引擎、應(yīng)急響應(yīng)),比如WannaCry爆發(fā)時(shí),立刻分析其原因和傳播漏洞,分析其影響程度及給出解決方案。所以,研究逆向病毒的人很多,當(dāng)然壞的行當(dāng)做游戲WG也很多,它們的對(duì)抗也是沒(méi)有源碼的,游戲安全人員會(huì)分析WG樣本進(jìn)行完善及修補(bǔ)。

          2000年早期制作病毒的人都比較單純,寫(xiě)病毒是為了技術(shù)炫耀或開(kāi)玩笑,典型的比如乒乓球病毒,每個(gè)周末都爆發(fā),開(kāi)啟計(jì)算機(jī)后就有個(gè)乒乓球在電腦上彈,導(dǎo)致電腦不能用,而周一到周五恢復(fù)正常(可能是討厭加班),此時(shí)的病毒沒(méi)有獲取用戶隱私、刪除數(shù)據(jù)等行為。

          逆向利用——游戲保護(hù)

          從2005年開(kāi)始,隨著網(wǎng)游普及和網(wǎng)絡(luò)虛擬財(cái)產(chǎn)(游戲裝備)出現(xiàn),大家也沒(méi)有安全意識(shí),出現(xiàn)了很多惡意程序和病毒,比如熊貓燒香,它是由李俊制作并肆虐網(wǎng)絡(luò)的一款電腦病毒,是一款擁有自動(dòng)傳播、自動(dòng)感染硬盤(pán)能力和強(qiáng)大的破壞能力的病毒,它不但能感染系統(tǒng)中exe、com、pif、src、html、asp等文件,它還能中止大量的反病毒軟件進(jìn)程并且會(huì)刪除擴(kuò)展名為gho的系統(tǒng)備份文件。

          同時(shí),游戲WG也開(kāi)始增多,并形成了包括私服、生產(chǎn)、PJ、DH等功能的生產(chǎn)線,通過(guò)分析游戲的關(guān)鍵數(shù)據(jù)結(jié)構(gòu),找到關(guān)鍵數(shù)據(jù)并對(duì)數(shù)據(jù)做修改以達(dá)到提升的效果。比如吃雞游戲,如果你通過(guò)逆向分析找到每個(gè)玩家的坐標(biāo)位置了,你是不是可以寫(xiě)一個(gè)透視G,前提是你知道其數(shù)據(jù)以什么形式存放在哪里,這就屬于PJ掛。你甚至還可以修改攻擊力、防御值,游戲的碰撞檢測(cè)(兩者間距離小于某個(gè)值)也可以取消實(shí)現(xiàn)飛天、穿墻等。

          當(dāng)然,我們的信息安全是正能量的,逆向分析主要是剖析病毒,包括:

          • 逆向病毒,獲取病毒傳播方法,可以遏制病毒傳播

          • 逆向病毒,獲取病毒隱藏手段,可以根除病毒

          • 逆向分析病毒,獲取功能目的,可以溯源定位攻擊者


          逆向應(yīng)用——漏洞挖掘
          逆向應(yīng)用還包括漏洞挖掘和漏洞利用,其中黑客挖掘漏洞的常用方法為:
          • 通過(guò)分析開(kāi)源軟件的源代碼,獲取漏洞

          • 通過(guò)分析產(chǎn)品本身獲取漏洞

          • 通過(guò)分析可以利用漏洞的軟件樣本

          • 通過(guò)比較軟件前后補(bǔ)丁的差異

          大家是否有研究過(guò)shellcode、緩沖區(qū)溢出?漏洞利用溢出緩沖區(qū),首先要把關(guān)鍵內(nèi)存、關(guān)鍵代碼定位出來(lái),這就屬于逆向分析。在漏洞利用過(guò)程中,只有你越熟悉周?chē)h(huán)境則可利用的漏洞就越多,比如逆向服務(wù)端,調(diào)用shell創(chuàng)建新用戶功能,這個(gè)時(shí)候是沒(méi)有源代碼的,所以需要利用漏洞分析。

          逆向分析是信息安全行業(yè)的基礎(chǔ)技術(shù)、必須技術(shù)和重要技術(shù),只有你功力越深厚,則做的事情就越多。


          漏洞利用——比較補(bǔ)丁

          下圖展示了比較補(bǔ)丁前后差異的工具。比如官方軟件在網(wǎng)上有安全更新,關(guān)注安全行情和漏洞公告的行當(dāng)或企業(yè)會(huì)對(duì)比官方的補(bǔ)丁,在拿到官方升級(jí)后的軟件,他們會(huì)對(duì)兩個(gè)流程做比較,其中左邊流程多了一個(gè)節(jié)點(diǎn),說(shuō)明升級(jí)就是這個(gè)位置,再詳細(xì)分析為什么多了這個(gè)個(gè)檢測(cè)。注意,官方公告通常會(huì)非常簡(jiǎn)略(補(bǔ)丁號(hào)、造成后果、影響范圍),比如某個(gè)MP3播放器在播放某個(gè)冷門(mén)格式的音頻文件時(shí),會(huì)觸發(fā)一個(gè)遠(yuǎn)程溢出問(wèn)題,接下來(lái)我們就需要去做逆向分析,下載升級(jí)前和升級(jí)后的版本做流程對(duì)比。


          逆向應(yīng)用——電子取證
          通過(guò)樣本追蹤地理位置的實(shí)例,后續(xù)會(huì)給出一個(gè)實(shí)戰(zhàn)案例。


          漏洞利用——無(wú)文檔學(xué)習(xí)

          表示沒(méi)有源碼的情況下獲取程序信息,稱(chēng)為競(jìng)品分析。假設(shè)某個(gè)公司對(duì)同行的產(chǎn)品很感興趣,想知道為什么它們的算法比我們的好,然后需要去分析和算法還原,這也是逆向分析的主要應(yīng)用。最好的競(jìng)品分析,是能夠?qū)⑺惴ㄍ昝肋€原,兩個(gè)代碼再次編譯后,除了地址不一樣其他都一樣(IDA查看)。注意,看懂代碼完善程序并換另一種程序語(yǔ)言復(fù)現(xiàn),算學(xué)習(xí);而如果直接COPY別人的二進(jìn)制或二進(jìn)制序列,這算抄襲。


          二.掃雷游戲逆向分析

          1.游戲介紹

          下面通過(guò)掃雷游戲進(jìn)行逆向分析講解。

          • https://github.com/eastmountyxz/Reverse-Engineering-01-Saolei

          此時(shí)我們打開(kāi)一個(gè)工具,360會(huì)提示危險(xiǎn)操作,點(diǎn)擊“允許本次操作”即可。

          此時(shí)就能夠判斷某個(gè)點(diǎn)是不是雷,從而方便我們點(diǎn)擊完成掃雷游戲,O(∩_∩)O

          接著進(jìn)行逆向分析。掃雷中肯定有雷區(qū)的定義,作為程序員,你會(huì)怎么定義有雷或沒(méi)有雷,或者插個(gè)旗子的狀態(tài)呢?我們會(huì)使用一個(gè)二維數(shù)組來(lái)存儲(chǔ)。那么,什么時(shí)候肯定會(huì)訪問(wèn)這個(gè)二維數(shù)組呢?在繪制整個(gè)游戲區(qū)、點(diǎn)擊方格的時(shí)候都會(huì)訪問(wèn)。

          在繪制游戲區(qū)時(shí),Windows編程有個(gè)關(guān)鍵函數(shù),叫做——BeginPaint。BeginPaint函數(shù)為指定窗口進(jìn)行繪圖工作的準(zhǔn)備,并用將和繪圖有關(guān)的信息填充到一個(gè)PAINTSTRUCT結(jié)構(gòu)中,所以它將是個(gè)突破口。


          2.OllyDbg動(dòng)態(tài)分析

          接著我們使用Ollydbg打開(kāi),在逆向分析中,動(dòng)態(tài)分析(OD)和靜態(tài)分析(IDA)非常多,動(dòng)靜結(jié)合也是常用的分析手段。后續(xù)兩篇文章將介紹它們的基礎(chǔ)用法。

          • 靜態(tài)分析:程序并未運(yùn)行,通過(guò)分析文件的結(jié)構(gòu)(格式)獲取其內(nèi)部原理。

          • 動(dòng)態(tài)分析:在程序運(yùn)行過(guò)程中,分析其內(nèi)部原理。

          • 灰盒分析:既不靜態(tài)也不調(diào)試,通過(guò)一堆監(jiān)控軟件(注冊(cè)表監(jiān)控、文件監(jiān)控、進(jìn)程監(jiān)控、敏感API監(jiān)控)在虛擬機(jī)中跑程序,再分析惡意軟件的大體行為,并形成病毒分析報(bào)告。

          至于哪種方法更好?我們需要具體問(wèn)題具體分析,如果是分析掃雷游戲,因?yàn)闆](méi)有危害可以動(dòng)態(tài)調(diào)試分析,但如果是WannaCry蠕蟲(chóng),你就不能在真機(jī)上動(dòng)態(tài)分析。同時(shí),很多安全公司為了及時(shí)響應(yīng)各種安全事件,會(huì)把樣本自動(dòng)上傳到服務(wù)器中,它們每天會(huì)收到成千上萬(wàn)的惡意樣本,但可能存在某些未知樣本只上傳部分的原因,比如某個(gè)未知樣本是個(gè)動(dòng)態(tài)鏈接庫(kù),此時(shí)沒(méi)有運(yùn)行條件,只能進(jìn)行靜態(tài)分析或者模擬接口分析。

          軟件靜態(tài)分析包括分析文件格式、分析網(wǎng)絡(luò)協(xié)議、分析軟件日志、修改存檔文件等,下圖展示了通過(guò)修改文件游戲作弊的示例。

          軟件動(dòng)態(tài)調(diào)試可以用于HH翻譯,比如《仙劍奇?zhèn)b傳》。

          OllyDbg是一個(gè)新的動(dòng)態(tài)追蹤工具,將IDA與SoftICE結(jié)合起來(lái)的思想,Ring 3級(jí)調(diào)試器,非常容易上手,是當(dāng)今最為流行的調(diào)試解密工具之一。它還支持插件擴(kuò)展功能,是目前最強(qiáng)大的調(diào)試工具之一。OllyDbg打開(kāi)如下圖,包括反匯編窗口、寄存器窗口、信息窗口、數(shù)據(jù)窗口、堆棧窗口。

          • 反匯編窗口:顯示被調(diào)試程序的反匯編代碼,包括地址、HEX數(shù)據(jù)、反匯編、注釋

          • 寄存器窗口:顯示當(dāng)前所選線程的CPU寄存器內(nèi)容,點(diǎn)擊標(biāo)簽可切換顯示寄存器的方式

          • 信息窗口:顯示反匯編窗口中選中的第一個(gè)命令的參數(shù)及跳轉(zhuǎn)目標(biāo)地址、字符等

          • 數(shù)據(jù)窗口:顯示內(nèi)存或文件的內(nèi)容,右鍵菜單可切換顯示方式

          • 堆棧窗口:顯示當(dāng)前線程的堆棧

          下圖是打開(kāi)EXE后顯示的界面。

          OD常用的快捷鍵調(diào)試方式包括:

          • F2:設(shè)置斷點(diǎn),如下圖所示的紅色位置,程序運(yùn)行到此處會(huì)暫停,再按一次F2鍵會(huì)刪除斷點(diǎn)。

          • F9:按下這個(gè)鍵運(yùn)行程序,如果沒(méi)有設(shè)置相應(yīng)的點(diǎn),被調(diào)試的程序直接開(kāi)始運(yùn)行。

          • F8:單步步過(guò),每按一次這個(gè)按鍵,將執(zhí)行反匯編窗口中的一條指令,遇到CALL等子程序不進(jìn)入其代碼。

          • F7:單步步入,功能通過(guò)單步步過(guò)(F8)類(lèi)似,區(qū)別是遇到CALL等子程序時(shí)會(huì)進(jìn)入其中,進(jìn)入后首先停留在子程序的第一條指令上。如下圖進(jìn)入CALL子程序。

          • F4:運(yùn)行到選定位置,即運(yùn)行到光標(biāo)所在位置處暫停。

          • CTRL+F9:執(zhí)行到返回,按下此鍵會(huì)執(zhí)行到一個(gè)返回指令時(shí)暫停,常用于從系統(tǒng)領(lǐng)空返回到我們調(diào)試的程序領(lǐng)空。

          • ALT+F9:執(zhí)行到用戶代碼,從系統(tǒng)領(lǐng)空快速返回我們調(diào)試的程序領(lǐng)空。


          接著正式分析掃雷程序。

          第一步:?jiǎn)?dòng)OllyDbg軟件,選擇菜單“文件”,打開(kāi)winmine.exe文件。

          這里我們猜測(cè)游戲中存在一個(gè)二維數(shù)組,當(dāng)我們顯示界面時(shí)會(huì)訪問(wèn)這個(gè)二維數(shù)組,并且調(diào)用BeginPaint函數(shù)來(lái)顯示界面。所以接下來(lái)需要找到調(diào)用BeginPain的位置。

          第二步:在反匯編窗口右鍵鼠標(biāo),選擇“查找”->“當(dāng)前模塊中的名稱(chēng)”。

          當(dāng)我們?cè)阪I盤(pán)上輸入“BEGINPAINT”時(shí),能夠迅速找到對(duì)應(yīng)的函數(shù)。

          第三步:點(diǎn)擊右鍵選擇“在每個(gè)參考上設(shè)置斷點(diǎn)”。

          接著點(diǎn)擊下圖所示的“B”進(jìn)行斷點(diǎn)設(shè)置界面。

          雙擊該斷點(diǎn)會(huì)進(jìn)入到反匯編窗口BeginPaint對(duì)應(yīng)位置。

          第四步:按下“F9”運(yùn)行程序,可以看到在BeginPaint和EndPaint之前有一個(gè)CALL函數(shù)。

          選中該行右鍵“跟隨”之后,去到0x01002AC3位置,發(fā)現(xiàn)又存在很多個(gè)CALL函數(shù)。

          一種方法是一個(gè)一個(gè)函數(shù)分析,這里使用另一種方法。當(dāng)我們?cè)谑褂脪呃讜r(shí),發(fā)現(xiàn)它的界面并沒(méi)有閃爍,所以懷疑使用了 雙緩存技術(shù),這是我們的突破口。雙緩存是在緩存中一次性繪制,再把繪制的結(jié)果返回在界面上。比如,你要在屏幕上繪制一個(gè)圓、正方形、直線,需要調(diào)用GDI的顯示函數(shù),操作顯卡畫(huà)一個(gè)圓,再畫(huà)一個(gè)正方形和直線,它需要訪問(wèn)硬件三次;此時(shí)依賴(lài)硬件的訪問(wèn)速度,而且如果繪制錯(cuò)誤擦除再繪制,需要反復(fù)的訪問(wèn)硬件,為了減少硬件操作,我們?cè)趦?nèi)存中把需要繪制的圖像準(zhǔn)備好,然后一切妥當(dāng)之后提交給硬件顯示。

          PS:當(dāng)然,為什么是雙緩存技術(shù)呢?目前的我也無(wú)法理解。只有當(dāng)我們做了大量的逆向分析后,才會(huì)養(yǎng)成一定的經(jīng)驗(yàn)來(lái)幫助我們判斷。任何行業(yè)和技術(shù)都是這樣的,包括作者自己,目前也是一步一個(gè)腳印的去學(xué)習(xí),去總結(jié),去進(jìn)步。期待與您前行,加油~

          第五步:繼續(xù)在反匯編窗口右鍵鼠標(biāo),選擇“查找”->“當(dāng)前模塊中的名稱(chēng)”,找到雙緩存技術(shù)的核心函數(shù)BitBlt。
          BitBlt是將內(nèi)存中的數(shù)據(jù)提交到顯示器上,該函數(shù)對(duì)指定的源設(shè)備環(huán)境區(qū)域中的像素進(jìn)行位塊(bit_block)轉(zhuǎn)換,以傳送到目標(biāo)設(shè)備環(huán)境。

          點(diǎn)擊右鍵選擇“在每個(gè)參考上設(shè)置斷點(diǎn)”,如下圖所示,此時(shí)繪制了兩個(gè)斷點(diǎn)。

          第六步:運(yùn)行程序去到第二個(gè)斷點(diǎn)BitBlt位置。

          注意,此時(shí)顯示了兩層循環(huán),剛好符合我們二維數(shù)組的遍歷,按F8單步步過(guò)可以動(dòng)態(tài)調(diào)試觀察其效果。

          第七步:在0x01002700位置按下F2取消斷點(diǎn),并在該函數(shù)的起始位置0x010026A7設(shè)置斷點(diǎn),接下來(lái)需要詳細(xì)分析這個(gè)雙緩存函數(shù)繪制過(guò)程。

          代碼中,ESI首先通過(guò)XOR進(jìn)行清零,然后再加1;接著ESI會(huì)調(diào)用CMP進(jìn)行比較,說(shuō)明ESI是循環(huán)變量。接下來(lái)“MOV AL, BYTE PTR [EBX+ESI]”表示將EBX和ESI相加賦值給AL,然后AL判斷一個(gè)值再做其他的,這有點(diǎn)像訪問(wèn)數(shù)據(jù),后面的顯示特性隨著AL做改動(dòng),即AL影響后面顯示的內(nèi)容。

          MOV指令是數(shù)據(jù)傳送指令,也是最基本的編程指令,用于將一個(gè)數(shù)據(jù)從源地址傳送到目標(biāo)地址(寄存器間的數(shù)據(jù)傳送本質(zhì)上也是一樣的)。

          第八步:下面看看寄存器,其中EBX是基址寄存器,ESI是它的偏移量,猜測(cè)這個(gè)EBX基址寄存器和關(guān)鍵數(shù)據(jù)有關(guān)。

          選擇EBX基址寄存器,然后選擇“數(shù)據(jù)窗口中跟隨”,顯示如下圖所示的數(shù)據(jù)。

          數(shù)據(jù)窗口顯示如下,我們發(fā)現(xiàn)“0F”出現(xiàn)較多,猜測(cè)多的這個(gè)可能是空的,少的那個(gè)是雷“8F”。

          第九步:數(shù)據(jù)區(qū)詳細(xì)分析。我們選擇0x010026A7位置,然后按下F2取消斷點(diǎn),然后繼續(xù)運(yùn)行程序,此時(shí)彈出掃雷主界面。游戲中通常會(huì)存在邊界(圍墻),這里“10”應(yīng)該是邊界位置,而0x01005361則為起始位置。

          如果第一個(gè)不是雷、第二個(gè)不是雷、第三個(gè)不是雷,第四個(gè)才是雷,我們“0F”是空格,“8F”是雷的猜測(cè)則正確。

          我們?nèi)∠?x01002700位置的斷點(diǎn),然后運(yùn)行程序彈出掃雷界面,根據(jù)下面的二維矩陣進(jìn)行掃雷。

          如下圖所示,前面3個(gè)果然是空格,而第四個(gè)則是雷。“8A”是雷,“0F”是空格實(shí)錘,而且點(diǎn)過(guò)的地方會(huì)變成數(shù)字,比如“40”、“41”、“42”等。

          第十步:寫(xiě)個(gè)程序進(jìn)行掃雷數(shù)據(jù)區(qū)詳細(xì)分析。我們重新運(yùn)行程序,選擇“查找”->“當(dāng)前模塊中的名稱(chēng)”,找到雙緩存技術(shù)的核心函數(shù)BitBlt,然后重新找一下,找到代碼位置。如下圖所示,EBX就是雷區(qū)的起始位置,我們要想辦法把它讀取出來(lái),再往前“MOV EBX, 01005360”代碼看到了EBX的賦值定義。

          接著我們輸入F7單步調(diào)試,執(zhí)行完0x010026C4賦值語(yǔ)句后,我們?cè)跀?shù)據(jù)窗口中跟隨EBX寄存器,顯示如下圖所示。前面8個(gè)均為“0F”表示空格,第9個(gè)為雷,再驗(yàn)證一次“01005360位置”,就開(kāi)始準(zhǔn)備寫(xiě)程序了。

          驗(yàn)證成功,開(kāi)始寫(xiě)程序吧!

          第十一步:掃雷輔助程序。我們編寫(xiě)了這樣一個(gè)程序,當(dāng)它開(kāi)啟后,我們鼠標(biāo)移動(dòng)到方格,如果是雷它的標(biāo)題會(huì)變成“掃雪(xue)”,然后我們不點(diǎn)擊它就可以了。哈哈~

          正常是“掃雷”。

          雷區(qū)顯示為“掃雪”。當(dāng)然你也可以寫(xiě)得更隱蔽些,比如和蘋(píng)果電話手表建立連接,如果是“雷”讓手表震動(dòng)一下,否則正常。

          注意,基本原理知道后,就需要開(kāi)發(fā)解決問(wèn)題了。對(duì)于安全行業(yè)來(lái)說(shuō),不管是做病毒還是研究漏洞利用或游戲防護(hù)的,逆向分析都是基礎(chǔ),開(kāi)發(fā)解決問(wèn)題才是關(guān)鍵。比如,某個(gè)病毒樣本的行為已經(jīng)分析清楚了,這個(gè)病毒在哪里創(chuàng)建系統(tǒng)文件、修改哪個(gè)系統(tǒng)文件、注入到哪個(gè)進(jìn)程、動(dòng)了哪個(gè)注冊(cè)表等等,逆向分析第一步完成,但更重要的是怎么解決問(wèn)題,創(chuàng)建注冊(cè)表就需要?jiǎng)h除注冊(cè)表,修改系統(tǒng)文件就要還原文件。

          我們?cè)诰W(wǎng)上搜索某些病毒資料時(shí),有些逆向工程師會(huì)給出手工修復(fù)方案,比如關(guān)閉哪個(gè)服務(wù)、刪除哪個(gè)隱藏文件、手工清除注冊(cè)表哪一項(xiàng)等。但是對(duì)于安全公司來(lái)說(shuō),比如360公司,你安全掃描完成之后,不可能彈框提示用戶手工修復(fù),而是需要提供自動(dòng)化方案一鍵修復(fù),最終結(jié)果是需要修改殺毒軟件的引擎代碼,或者提供專(zhuān)殺工具給用戶,這個(gè)時(shí)候工具需要自動(dòng)化完成相關(guān)操作。

          很多新手會(huì)看不起開(kāi)發(fā),覺(jué)得搞逆向、搞網(wǎng)安的是王道,不用學(xué)開(kāi)發(fā),這是不對(duì)的。 針對(duì)上面的實(shí)戰(zhàn),我們就發(fā)現(xiàn)逆向是站在開(kāi)發(fā)基礎(chǔ)上,反向推導(dǎo)作者是怎么做的,比如掃雷需要思考作者會(huì)用什么方式表示雷區(qū),然后怎么用UI體現(xiàn)出來(lái)以及調(diào)用什么函數(shù)實(shí)現(xiàn)。所以,逆向分析之前都要教開(kāi)發(fā)類(lèi)的課程,《數(shù)據(jù)結(jié)構(gòu)》《操作系統(tǒng)》《計(jì)算機(jī)組成原理》《編譯原理》等課程掌握越深入越好。


          三.掃雷游戲檢測(cè)工具

          通過(guò)第二部分,我們知道以下信息:

          • 掃雷的首地址為0x01005360

          • 顯示“0F”表示空格,顯示“8F”表示雷

          • 雷區(qū)的邊界為0x10

          原理是找到雷在內(nèi)存中的值,只要不是雷值我們把它點(diǎn)擊開(kāi)來(lái)。接下來(lái)作者再補(bǔ)充一個(gè)逆向輔助工具,通過(guò)CheatEngine實(shí)現(xiàn)雷區(qū)檢測(cè)。

          Cheat Engine又稱(chēng)CE修改器,是一款內(nèi)存修改編輯工具。你可以通過(guò)Cheat Engine軟件來(lái)修改游戲中的內(nèi)存數(shù)據(jù)、人物屬性、金幣數(shù)值等等,功能強(qiáng)大且操作簡(jiǎn)單,可以為你帶來(lái)良好的更好的體驗(yàn)游戲。

          1.Cheat Engine確定起始位置

          第一步,打開(kāi)Cheat Engine軟件,點(diǎn)擊“選擇打開(kāi)一個(gè)程序”按鈕,如下圖所示。

          打開(kāi)掃雷軟件設(shè)置為初級(jí)。

          第二步,選擇掃描類(lèi)型為“未知的初始數(shù)值”,選擇“數(shù)值類(lèi)型”為字節(jié),然后點(diǎn)擊“首次掃描”。

          此時(shí)顯示7,290,880個(gè)數(shù)據(jù),如下圖所示:

          第三步,接著我們點(diǎn)擊掃雷,然后在“掃描類(lèi)型”中選擇“變動(dòng)的數(shù)值”,點(diǎn)擊“再次掃描”,此時(shí)返回結(jié)果183,169個(gè)。最終通過(guò)反復(fù)的篩選找到首地址。

          繼續(xù)點(diǎn)擊掃描,如下圖所示。

          第四步,如果出現(xiàn)地雷則選擇“未變動(dòng)的數(shù)值”,點(diǎn)擊“再次掃描”,接著繼續(xù)新一輪的掃雷游戲。

          始終以第一個(gè)方格的狀態(tài)為目標(biāo)進(jìn)行重復(fù)的操作。

          • 開(kāi)始掃描:設(shè)置“未知的初始數(shù)值”

          • 掃描第一個(gè)格子:設(shè)置“變動(dòng)的值”

          • 繼續(xù)掃描,結(jié)果是雷:設(shè)置“未變動(dòng)的值”

          • 繼續(xù)掃描,結(jié)果非雷:設(shè)置“未變動(dòng)的值”

          • 重新開(kāi)始:設(shè)置“變動(dòng)的值”

          • 重新開(kāi)始如果第一個(gè)格子和上一次一樣,則設(shè)置“未變動(dòng)的值”,否則“變動(dòng)的值”

          下圖展示了最后5個(gè)結(jié)果,接著繼續(xù)反復(fù)篩選。

          最終獲取如下圖所示的結(jié)果,其初始地址為——0x01005361,和前面OD軟件分析的一樣。

          第五步,雙擊該行移動(dòng)至底部,然后右鍵選擇“瀏覽相關(guān)內(nèi)存區(qū)域”選項(xiàng)。

          顯示內(nèi)容如下圖所示,它同樣和我們前面OD分析的內(nèi)容一致。其中“8F”表示雷,“40”表示空格,“41”到“49”表示數(shù)字,“10”表示邊界,同時(shí)“0F”表示隔一行。

          如下圖所示,成功完成了掃雷游戲,O(∩_∩)O


          2.Cheat Engine確定邊界

          第一步,我們查看掃雷初級(jí)的高度是“9”,然后重新打開(kāi)建立“新的掃描”。

          輸入數(shù)字“9”再點(diǎn)擊“首次掃描”,返回7174個(gè)結(jié)果。

          第二步,選擇中級(jí)難度,對(duì)應(yīng)的高度是“16”,然后重新打開(kāi)建立“再次掃描”,僅剩4個(gè)結(jié)果。

          第三步,選擇高級(jí)難度,設(shè)置高度最高即“24”,然后重新打開(kāi)建立“再次掃描”

          最終剩2個(gè)結(jié)果,高度可能是:

          • 0x01005338

          • 0x010056A8

          第四步,使用同樣的方法找到寬度。寬度返回兩個(gè)結(jié)果:

          • 0x01005334

          • 0x010056AC


          3.C++編寫(xiě)鼠標(biāo)坐標(biāo)獲取案例

          接下來(lái)我們開(kāi)始編寫(xiě)代碼,首先給大家看看鼠標(biāo)坐標(biāo)獲取的一段代碼,我們鼠標(biāo)通常是(x, y)的形式。

          第一步,創(chuàng)建空項(xiàng)目,名稱(chēng)為“MouseMsg”。

          第二步,為該工程添加一個(gè)“main.cpp”文件,并且添加啟動(dòng)項(xiàng)。

          第三步,配置graphics.h文件。graphics.h是一個(gè)針對(duì)Windows的C語(yǔ)言圖形庫(kù),分為像素函數(shù)、直線和線型函數(shù)、多邊形函數(shù)、填充函數(shù)等。在學(xué)習(xí)C++游戲編程時(shí),通常會(huì)發(fā)現(xiàn)VS中沒(méi)有”graphics.h”頭文件,因此需要配置。

          (1) 先從作者github中下載好所需要的文件,如下所示:

          下載完后打開(kāi)下載好的 Inlcude 文件夾,里面有兩個(gè)頭文件:

          (2) 將里面的兩個(gè)文件進(jìn)行復(fù)制,然后粘貼到VS安裝目錄的include文件夾中。

          • C:\Program Files (x86)\Microsoft Visual Studio\

            2019\Community\VC\Tools\MSVC\14.26.28801\include

          (3) 打開(kāi)下載好的文件夾中的 lib2015子文件夾,將里面的東西全部選中復(fù)制,粘貼到VS2015安裝目錄的 lib 文件夾中。

          • C:\Program Files (x86)\Microsoft Visual Studio\

            2019\Community\VC\Tools\MSVC\14.26.28801\lib\x86

          • C:\Program Files (x86)\Microsoft Visual Studio\

            2019\Community\VC\Tools\MSVC\14.26.28801\lib\x64

          (4) 接下來(lái)就可以在VS中添加“graphics.h”頭文件了,里面有很豐富的繪圖函數(shù)可供我們使用。

          #include               // 引用圖形庫(kù)頭文件#include 
          int main(){ initgraph(640, 480); // 創(chuàng)建繪圖窗口,大小為 640x480 像素 setlinecolor(RGB(255, 0, 0)); // 設(shè)置當(dāng)前線條顏色 setfillcolor(RGB(0, 255, 0)); // 設(shè)置當(dāng)前填充顏色 fillcircle(200, 200, 100); // 畫(huà)圓,圓心(200, 200),半徑 100 _getch(); // 按任意鍵繼續(xù) closegraph(); // 關(guān)閉圖形環(huán)境}

          第四步,編寫(xiě)鼠標(biāo)事件代碼。

          #include               // 引用圖形庫(kù)頭文件#include 
          int main(){ //定義鼠標(biāo) MOUSEMSG m; //初始化窗口 500寬度 500高度 initgraph(500, 500);
          while (1) { //獲取鼠標(biāo)消息 m = GetMouseMsg(); char buff[256];
          //鼠標(biāo)左鍵按下 if (m.uMsg == WM_LBUTTONDOWN) { //清空數(shù)組 memset(buff, 0, 256); sprintf_s(buff, "X坐標(biāo):%d, Y坐標(biāo):%d", m.x, m.y); MessageBox(NULL, buff, "坐標(biāo)", MB_OK); } } return 0;}

          運(yùn)行前需要設(shè)置編碼方式為“使用多直接字符集”,否則會(huì)報(bào)錯(cuò)。

          運(yùn)行結(jié)果如下圖所示,可以看到鼠標(biāo)點(diǎn)擊會(huì)顯示對(duì)應(yīng)的坐標(biāo)位置。

          其中GetMouseMsg函數(shù)表示獲取鼠標(biāo)消息,通過(guò)Spy++可以看到很多Windows系統(tǒng)自帶的鼠標(biāo)操作、鍵盤(pán)操作、消息操作等,同時(shí)能獲取鼠標(biāo)是左鍵或右鍵按下以及對(duì)應(yīng)坐標(biāo)。


          4.C++編寫(xiě)自動(dòng)掃雷程序

          接下來(lái)是通過(guò)C++實(shí)現(xiàn)一鍵掃雷功能,主要是模擬鼠標(biāo)在雷區(qū)的點(diǎn)擊操作,并且按下所有非雷區(qū)域從而實(shí)現(xiàn)一鍵掃雷。利用的是Windows應(yīng)用程序的消息機(jī)制,通過(guò)SendMessage函數(shù)向指定窗口發(fā)送消息,也就是在獲取到掃雷的窗口句柄后,利用這個(gè)函數(shù)向該窗口發(fā)送鼠標(biāo)按鍵消息,從而實(shí)現(xiàn)模擬鼠標(biāo)的操作。

          第一步,創(chuàng)建一個(gè)應(yīng)用程序名叫“SaoleiHelp”,并添加主函數(shù)。

          第二步,分析掃雷的區(qū)域及坐標(biāo)定義。坐標(biāo)是基于客戶區(qū)的左上角,但是這個(gè)客戶區(qū)是怎么定義的呢?如下圖所示,究竟A點(diǎn)是客戶區(qū)的左上角,還是說(shuō)B點(diǎn)才是呢?如果A點(diǎn)為坐標(biāo)原點(diǎn),那么第一塊雷區(qū)的坐標(biāo)就應(yīng)為(AC,CE),如果B點(diǎn)為坐標(biāo)原點(diǎn),那么第一塊雷區(qū)的坐標(biāo)就應(yīng)為(BD,DE)。經(jīng)過(guò)實(shí)際測(cè)試,MSDN中所謂的客戶區(qū),其實(shí)是以B點(diǎn)作為起點(diǎn)的位置,即原點(diǎn)坐標(biāo)(0,0),而雷區(qū)中心即E點(diǎn)的坐標(biāo)為(16,61),每個(gè)雷區(qū)小方塊的大小為16×16,于是可以知道,這里需要循環(huán)計(jì)算出雷區(qū)每一個(gè)小方塊的坐標(biāo),這個(gè)坐標(biāo)與保存有雷區(qū)的二維數(shù)組下標(biāo)緊密相關(guān)。

          假設(shè)這個(gè)二維數(shù)組是mine[y1][x1],其中y1表示的是雷區(qū)有多少行,x1表示雷區(qū)的列數(shù),那么每個(gè)雷區(qū)方塊的坐標(biāo)為:

          1. x = x1 * 16 + 16;

          2. y = y1 * 16 + 61;

          在獲得了坐標(biāo)以后,就可以通過(guò)如下語(yǔ)句來(lái)模擬鼠標(biāo)的點(diǎn)擊操作了:

          SendMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELONG(x, y));SendMessage(hWnd, WM_LBUTTONUP, MK_LBUTTON, MAKELONG(x, y));

          第三步,分析掃雷游戲的雷區(qū)長(zhǎng)寬數(shù)據(jù)。結(jié)合之前寬度、高度的分析,發(fā)現(xiàn)高度位置為0x01005338,寬度位置為0x01005334。我們進(jìn)一步推斷,從0x01005330開(kāi)始,這里的一行綠色數(shù)據(jù)包含有0x0A、0x09以及0x09這三個(gè)數(shù)值,很明顯這三個(gè)數(shù)據(jù)正是當(dāng)前雷區(qū)的地雷數(shù)量以及寬、高等信息

          • 雷數(shù):0x01005330

          • 寬度:0x01005334

          • 高度:0x01005338

          同時(shí),我們上面的逆向分析已經(jīng)知道雷區(qū)分布的信息。

          • “8F”表示地雷

          • “8E”表示旗子

          • “40”表示空格

          • “41”到“49”表示數(shù)字

          • “10”表示邊界

          • “0F”表示隔一行

          還有一個(gè)重要信息是雷區(qū)的分布起始地址,即:

          • 0x01005361

          但如果計(jì)算含有邊界的情況,雷區(qū)的分布情況則為:

          • 起始地址:0x01005340

          • 結(jié)束地址:0x0100567F

          完整代碼如下:

          #include #include #include 
          int main() { DWORD Pid = 0; HANDLE hProcess = 0;
          DWORD result1, result2;
          // 獲取掃雷游戲?qū)?yīng)的窗口句柄 HWND hWnd = FindWindow(NULL, L"掃雷"); if (hWnd != 0) { // 獲取掃雷進(jìn)程ID GetWindowThreadProcessId(hWnd, &Pid); // 打開(kāi)掃雷游戲獲取其句柄 hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Pid); if (hProcess == 0) { printf("Open winmine process failed."); return 0; }
          // 存放雷區(qū)的起始地址 DWORD dwBoomAddr = 0x01005340;
          // 雷區(qū)的最大值(包含邊界) DWORD dwSize = 832; PBYTE pByte = NULL; pByte = (PBYTE)malloc(dwSize);
          // 讀取整個(gè)雷區(qū)的數(shù)據(jù) ReadProcessMemory(hProcess, (LPVOID)dwBoomAddr, pByte, dwSize, 0); int i = 0; int j = 0; int n = dwSize;
          // 讀取雷區(qū)的長(zhǎng)和寬 DWORD dwInfo = 0x01005330; DWORD dwHeight = 0, dwWidth = 0; ReadProcessMemory(hProcess, (LPVOID)(dwInfo + 4), &dwWidth, sizeof(DWORD), 0); //寬度 ReadProcessMemory(hProcess, (LPVOID)(dwInfo + 8), &dwHeight, sizeof(DWORD), 0); //高度
          int h = dwHeight; int count = 0;
          // 雷區(qū)轉(zhuǎn)換,去掉雷區(qū)多余的數(shù)據(jù) PBYTE pTmpByte = NULL; pTmpByte = (PBYTE)malloc(dwHeight * dwWidth); while (i < dwSize) { //邊界判斷 if (pByte[i] == 0x10 && pByte[i + 1] == 0x10) { i = i + dwWidth + 2; continue; } else if (pByte[i] == 0x10) { for (j = 1; j <= dwWidth; j++) { pTmpByte[count] = pByte[i + j]; count++; } i = i + dwWidth + 2; continue; h--; if (h == 0) break; } i++; }
          // 獲取雷區(qū)方塊的坐標(biāo),然后模擬鼠標(biāo)進(jìn)行點(diǎn)擊 int x1 = 0, y1 = 0; int x = 0, y = 0; for (i = 0; i < dwHeight * dwWidth; i++) { if (pTmpByte[i] != 0x8F) { //雷 x1 = i % dwWidth; y1 = i / dwWidth; x = x1 * 16 + 16; y = y1 * 16 + 61; SendMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELONG(x, y)); //鼠標(biāo)按下 SendMessage(hWnd, WM_LBUTTONUP, MK_LBUTTON, MAKELONG(x, y)); //鼠標(biāo)抬起 } }
          free(pByte); CloseHandle(hProcess); } else { printf("Get hWnd failed."); } return 0;}

          運(yùn)行結(jié)果如下圖所示,一秒實(shí)現(xiàn)掃雷。


          四.總結(jié)

          寫(xiě)到這里,這篇文章就介紹完畢,希望對(duì)您有所幫助,最后進(jìn)行簡(jiǎn)單的總結(jié)下。

          • 一.什么是逆向分析

            1.逆向工程

            2.逆向分析的典型應(yīng)用

          • 二.掃雷游戲逆向分析

            1.游戲介紹

            2.OllyDbg動(dòng)態(tài)分析

          • 三.掃雷游戲檢測(cè)工具

            1.Cheat Engine確定起始位置

            2.Cheat Engine確定邊界

            3.C++編寫(xiě)鼠標(biāo)坐標(biāo)獲取案例

            4.C++編寫(xiě)自動(dòng)掃雷程序

          學(xué)安全一年,認(rèn)識(shí)了很多安全大佬和朋友,希望大家一起進(jìn)步。這篇文章中如果存在一些不足,還請(qǐng)海涵。作者作為網(wǎng)絡(luò)安全初學(xué)者的慢慢成長(zhǎng)路吧!希望未來(lái)能更透徹撰寫(xiě)相關(guān)文章。同時(shí)非常感謝參考文獻(xiàn)中的安全大佬們的文章分享,深知自己很菜,得努力前行。

          《珈國(guó)情》
          明月千里兩相思,
          清風(fēng)縷縷寄離愁。
          燕歸珞珈花已謝,
          情滿景逸映深秋。
          最感恩的永遠(yuǎn)是家人的支持,知道為啥而來(lái),知道要做啥,知道努力才能回去。夜已深,雖然笨,但還得奮斗。寫(xiě)了近十年文章,真心想把自己所學(xué)所感所做分享出來(lái),還請(qǐng)各位多多指教,真誠(chéng)邀請(qǐng)您的關(guān)注!謝謝。

          (By:娜璋AI之家 2020-09-21 星期一 晚于武漢)


          參考文獻(xiàn):

          真心推薦大家好好看看這些視頻和文章,感恩這些大佬!

          • 科銳逆向的錢(qián)林松老師受華中科技大學(xué)邀請(qǐng)- “逆向分析計(jì)算引導(dǎo)”

          • c++學(xué)習(xí)筆記——VS2015中添加graphics.h頭文件

          • 逆向工程第007篇:掃雷輔助的研究——0秒實(shí)現(xiàn)一鍵自動(dòng)掃雷

          • https://www.bilibili.com/video/BV18W411U7NH

          • [網(wǎng)絡(luò)安全自學(xué)篇] 五.IDA Pro反匯編工具初識(shí)及逆向工程解密實(shí)戰(zhàn)

          瀏覽 61
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  爱爱短视频电影无码免费 | 男插女视频网站 | 97A片在线观看播放 | 欧美精品导航 | 亚洲色婷婷久久精品AV蜜桃 |