主頁 >  其他 > [系統安全] 一.什么是逆向分析、逆向分析基礎及經典掃雷游戲逆向

[系統安全] 一.什么是逆向分析、逆向分析基礎及經典掃雷游戲逆向

2020-12-12 11:54:50 其他

您可能之前看到過我寫的類似文章,為什么還要重復撰寫呢?只是想更好地幫助初學者了解病毒逆向分析和系統安全,更加成體系且不破壞之前的系列,因此,我重新開設了這個專欄,準備系統整理和深入學習系統安全、逆向分析和惡意代碼檢測,“系統安全”系列文章會更加聚焦,更加系統,更加深入,也是作者的慢慢成長史,換專業確實挺難的,逆向分析也是塊硬骨頭,但我也試試,看看自己未來四年究竟能將它學到什么程度,漫漫長征路,偏向虎山行,享受程序,一起加油~

系統安全系列主要包括惡意樣本分析、病毒逆向分析、系統安全攻防實戰和Windows漏洞利用等,通過在線筆記和實踐操作的形式分享與博友們學習,希望能與您一起進步,第一篇文章先帶領大家學習什么是逆向分析,然后詳細講解逆向分析的典型應用,接著通過OllyDbg工具逆向分析經典的游戲掃雷,再通過Cheat Engine工具復制記憶體地址獲取,實作一個自動掃雷程式,

該篇文章也是作者學習科銳錢林松老師在華中科技大學的分享視頻,這里非常推薦大家去看看,話不多說,讓我們開始新的征程吧!您的點贊、評論、收藏將是對我最大的支持,感恩安全路上一路前行,如果有寫得不好的地方,可以聯系我修改,基礎性文章,希望對您有所幫助,作者的目的是與安全人共同進步,加油~

文章目錄

  • 一.什么是逆向分析
    • 1.逆向工程
    • 2.逆向分析的典型應用
  • 二.掃雷游戲逆向分析
    • 1.游戲介紹
    • 2.OllyDbg動態分析
  • 三.掃雷游戲檢測工具
    • 1.Cheat Engine確定起始位置
    • 2.Cheat Engine確定邊界
    • 3.C++撰寫滑鼠坐標獲取案例
    • 4.C++撰寫自動掃雷程式
  • 四.總結

作者的github資源:

  • 系統安全:https://github.com/eastmountyxz/SystemSecurity-ReverseAnalysis
  • 網路安全:https://github.com/eastmountyxz/NetworkSecuritySelf-study

宣告:本人堅決反對利用教學方法進行犯罪的行為,一切犯罪行為必將受到嚴懲,綠色網路需要我們共同維護,更推薦大家了解它們背后的原理,更好地進行防護,(參考文獻見后)


一.什么是逆向分析

1.逆向工程

科銳錢老師真的是大佬,擁有十余年的逆向作業經驗,專注于先進技術的演算法還原及逆向實訓,作者從中學習到很多知識,本次課程分享的是逆向分析技術的引導,課程目標是帶領大家了解下逆向分析是干什么的,在安全領域中是什么地位,并且穿插各種實戰示例,盡量提高大家的興趣,逆向分析是安全的基礎行業,喜歡的人覺得很好玩,不喜歡的人覺得很苦逼,

在講逆向分析前,大家思考下:你有沒有把別人的產品或Demo還原出源代碼來過呢?而且就是作者的源代碼,包括里面的BUG,

  • 反匯編:一次編譯技術,閱讀匯編代碼反推出對應的高級代碼,比如VC、GCC、Delphi等,
  • 反編譯:通常在C#、Java、.NET框架等,因為它可以直接把元資料還原成高級代碼,反編譯其實更難,但是對使用的人更簡單,比如Android的APK反編譯成JAVA源代碼,

下面開始吧!第一個大家需要知道的是“什么是逆向工程?”


什么是逆向工程?
簡單而言,一切從產品中提取原理及設計資訊并應用于再造及改進的行為,都是逆向工程,在資訊安全中,更多的是調查取證、惡意軟體分析等,不管你用什么工具或手段,能達到其目的就算逆向分析,下圖是《變形金剛》里面對它的描述,2007年的時候國內對資訊安全重視程度也不高,對逆向分析也沒有什么概念,真正重視是從老大提出“沒有網路安全就沒有國家安全”之后,而那時候的國外電影就已經用到了“reverse engineered”,說明國外導員對這個技術及應用場景都是了解的,

在這里插入圖片描述

逆向工程最早是在二Z時的船舶工業,分析船的弱點,通過外形反推內部結構,其中粉紅色是Amuno、黃色是引擎室、藍色是龍骨、綠色是推進器等等,只有知道怎么造一個船后,才能進行逆向分析,

在這里插入圖片描述

當然還有模具逆向、材料逆向、軟體逆向,在我們的軟體行業,就稱為軟體逆向,同樣,在網路攻防中,你不可能先給出原始碼再進行攻擊,通常在安全對抗中第一步要做的就是逆向分析,不管你用什么方式進行逆向分析,你都需要搞清楚:

  • 它是什么:樣本是什么,良性的還是惡意的
  • 它干了什么:樣本做了哪些事情
  • 我們怎么辦:知道做了什么才能進行反制,如洗掉注冊表啟動項、清理感染的勒索病毒等

在這里插入圖片描述



2.逆向分析的典型應用

軟體逆向有很多實作辦法達到我們的目標,典型的應用包括軟體工程、網路安全、司法取證、商業保護等,

在這里插入圖片描述


逆向應用——病毒分析
對于逆向分析,最大的行當就是病毒分析,對于一個安全企業來說,比如360,它的病毒分析團隊屬于它的主業,包括360、金山毒霸、騰訊醫生等,它們主要業務就是根據一些惡意樣本的行為,給出解決方案(專業查殺、完善引擎、應急回應),比如WannaCry爆發時,立刻分析其原因和傳播漏洞,分析其影響程度及給出解決方案,所以,研究逆向病毒的人很多,當然壞的行當做游戲WG也很多,它們的對抗也是沒有原始碼的,游戲安全人員會分析WG樣本進行完善及修補,

2000年早期制作病毒的人都比較單純,寫病毒是為了技術炫耀或開玩笑,典型的比如乒乓球病毒,每個周末都爆發,開啟計算機后就有個乒乓球在電腦上彈,導致電腦不能用,而周一到周五恢復正常(可能是討厭加班),此時的病毒沒有獲取用戶隱私、洗掉資料等行為,

在這里插入圖片描述


逆向利用——游戲保護
從2005年開始,隨著網游普及和網路虛擬財產(游戲裝備)出現,大家也沒有安全意識,出現了很多惡意程式和病毒,比如熊貓燒香,它是由李俊制作并肆虐網路的一款電腦病毒,是一款擁有自動傳播、自動感染硬碟能力和強大的破壞能力的病毒,它不但能感染系統中exe、com、pif、src、html、asp等檔案,它還能中止大量的反病毒軟體行程并且會洗掉擴展名為gho的系統備份檔案,

同時,游戲WG也開始增多,并形成了包括私服、生產、PJ、DH等功能的生產線,通過分析游戲的關鍵資料結構,找到關鍵資料并對資料做修改以達到提升的效果,比如吃雞游戲,如果你通過逆向分析找到每個玩家的坐標位置了,你是不是可以寫一個透視G,前提是你知道其資料以什么形式存放在哪里,這就屬于PJ掛,你甚至還可以修改攻擊力、防御值,游戲的碰撞檢測(兩者間距離小于某個值)也可以取消實作飛天、穿墻等,

在這里插入圖片描述

當然,我們的資訊安全是正能量的,逆向分析主要是剖析病毒,包括:

  • 逆向病毒,獲取病毒傳播方法,可以遏制病毒傳播
  • 逆向病毒,獲取病毒隱藏手段,可以根除病毒
  • 逆向分析病毒,獲取功能目的,可以溯源定位攻擊者

逆向應用——漏洞挖掘
逆向應用還包括漏洞挖掘和漏洞利用,其中黑客挖掘漏洞的常用方法為:

  • 通過分析開源軟體的源代碼,獲取漏洞
  • 通過分析產品本身獲取漏洞
  • 通過分析可以利用漏洞的軟體樣本
  • 通過比較軟體前后補丁的差異

大家是否有研究過shellcode、緩沖區溢位?漏洞利用溢位緩沖區,首先要把關鍵記憶體、關鍵代碼定位出來,這就屬于逆向分析,在漏洞利用程序中,只有你越熟悉周圍環境則可利用的漏洞就越多,比如逆向服務端,呼叫shell創建新用戶功能,這個時候是沒有源代碼的,所以需要利用漏洞分析,

逆向分析是資訊安全行業的基礎技術、必須技術和重要技術,只有你功力越深厚,則做的事情就越多,

在這里插入圖片描述


漏洞利用——比較補丁
下圖展示了比較補丁前后差異的工具,比如官方軟體在網上有安全更新,關注安全行情和漏洞公告的行當或企業會對比官方的補丁,在拿到官方升級后的軟體,他們會對兩個流程做比較,其中左邊流程多了一個節點,說明升級就是這個位置,再詳細分析為什么多了這個個檢測,注意,官方公告通常會非常簡略(補丁號、造成后果、影響范圍),比如某個MP3播放器在播放某個冷門格式的音頻檔案時,會觸發一個遠程溢位問題,接下來我們就需要去做逆向分析,下載升級前和升級后的版本做流程對比,

在這里插入圖片描述


逆向應用——電子取證
通過樣本追蹤地理位置的實體,后續會給出一個實戰案例,

在這里插入圖片描述


漏洞利用——無檔案學習
表示沒有原始碼的情況下獲取程式資訊,稱為競品分析,假設某個公司對同行的產品很感興趣,想知道為什么它們的演算法比我們的好,然后需要去分析和演算法還原,這也是逆向分析的主要應用,最好的競品分析,是能夠將演算法完美還原,兩個代碼再次編譯后,除了地址不一樣其他都一樣(IDA查看),注意,看懂代碼完善程式并換另一種程式語言復現,算學習;而如果直接COPY別人的二進制或二進制序列,這算抄襲,

在這里插入圖片描述



二.掃雷游戲逆向分析

1.游戲介紹

下面通過掃雷游戲進行逆向分析講解,

  • 下載地址:https://github.com/eastmountyxz/Reverse-Engineering-01-Saolei

在這里插入圖片描述

此時我們打開一個工具,360會提示危險操作,點擊“允許本次操作”即可,

在這里插入圖片描述

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

在這里插入圖片描述

接著進行逆向分析,掃雷中肯定有雷區的定義,作為程式員,你會怎么定義有雷或沒有雷,或者插個旗子的狀態呢?我們會使用一個二維陣列來存盤,那么,什么時候肯定會訪問這個二維陣列呢?在繪制整個游戲區、點擊方格的時候都會訪問,

在繪制游戲區時,Windows編程有個關鍵函式,叫做——BeginPaint,BeginPaint函式為指定視窗進行繪圖作業的準備,并用將和繪圖有關的資訊填充到一個PAINTSTRUCT結構中,所以它將是個突破口,



2.OllyDbg動態分析

接著我們使用Ollydbg打開,在逆向分析中,動態分析(OD)和靜態分析(IDA)非常多,動靜結合也是常用的分析手段,

推薦作者上一個系列的兩篇入門文章:

  • [網路安全自學篇] 五.IDA Pro反匯編工具初識及逆向工程解密實戰
  • [網路安全自學篇] 六.OllyDbg動態分析工具基礎用法及Crakeme逆向
  • 靜態分析:程式并未運行,通過分析檔案的結構(格式)獲取其內部原理,
  • 動態分析:在程式的運行程序中,分析其內部原理,
  • 灰盒分析:既不靜態也不除錯,通過一堆監控軟體(注冊表監控、檔案監控、行程監控、敏感API監控)在虛擬機中跑程式,再分析惡意軟體的大體行為,并形成病毒分析報告,

至于哪種方法更好?我們需要具體問題具體分析,如果是分析掃雷游戲,因為沒有危害可以動態除錯分析,但如果是WannaCry蠕蟲,你就不能在真機上動態分析,同時,很多安全公司為了及時回應各種安全事件,會把樣本自動上傳到服務器中,它們每天會收到成千上萬的惡意樣本,但可能存在某些未知樣本只上傳部分的原因,比如某個未知樣本是個元件,此時沒有運行條件,只能進行靜態分析或者模擬介面分析,

在這里插入圖片描述

軟體靜態分析包括分析檔案格式、分析網路協議、分析軟體日志、修改存檔檔案等,下圖展示了通過修改檔案游戲作弊的示例,

在這里插入圖片描述

軟體動態除錯可以用于HH翻譯,比如《仙劍奇俠傳》,

在這里插入圖片描述


OllyDbg是一個新的動態追蹤工具,將IDA與SoftICE結合起來的思想,Ring 3級除錯器,非常容易上手,是當今最為流行的除錯解密工具之一,它還支持插件擴展功能,是目前最強大的除錯工具之一,OllyDbg打開如下圖所示,包括反匯編視窗、暫存器視窗、資訊視窗、資料視窗、堆疊視窗,

  • 反匯編視窗:顯示被除錯程式的反匯編代碼,包括地址、HEX資料、反匯編、注釋
  • 暫存器視窗:顯示當前所選執行緒的CPU暫存器內容,點擊標簽可切換顯示暫存器的方式
  • 資訊視窗:顯示反匯編視窗中選中的第一個命令的引數及跳轉目標地址、字符等
  • 資料視窗:顯示記憶體或檔案的內容,右鍵選單可切換顯示方式
  • 堆疊視窗:顯示當前執行緒的堆疊

下圖是打開EXE后顯示的界面,

OD常用的快捷鍵除錯方式包括:

F2
設定斷點,如下圖所示的紅色位置,程式運行到此處會暫停,再按一次F2鍵會洗掉斷點,

F9
按下這個鍵運行程式,如果沒有設定相應的點,被除錯的程式直接開始運行,

F8
單步步過,每按一次這個按鍵,將執行反匯編視窗中的一條指令,遇到CALL等子程式不進入其代碼,

F7
單步步入,功能通單步步過(F8)類似,區別是遇到CALL等子程式時會進入其中,進入后首先停留在子程式的第一條指令上,如下圖進入CALL子程式,

F4
運行到選定位置,即運行到游標所在位置處暫停,

CTRL+F9
執行到回傳,按下此鍵會執行到一個回傳指令時暫停,常用于從系統領慷訓傳到我們除錯的程式領空,

ALT+F9
執行到用戶代碼,從系統領空快速回傳我們除錯的程式領空,


接著正式分析掃雷程式,

第一步:啟動OllyDbg軟體,選擇選單“檔案”,打開winmine.exe檔案,
這里我們猜測游戲中存在一個二維陣列,當我們顯示界面時會訪問這個二維陣列,并且呼叫BeginPaint函式來顯示界面,所以接下來需要找到呼叫BeginPain的位置,

在這里插入圖片描述


第二步:在反匯編視窗右鍵滑鼠,選擇“查找”->“當前模塊中的名稱”,

在這里插入圖片描述

當我們在鍵盤上輸入“BEGINPAINT”時,能夠迅速找到對應的函式,

在這里插入圖片描述


第三步:點擊右鍵選擇“在每個參考上設定斷點”,

在這里插入圖片描述

接著點擊下圖所示的“B”進行斷點設定界面,
在這里插入圖片描述

雙擊該斷點會進入到反匯編視窗BeginPaint對應位置,

在這里插入圖片描述


第四步:按下“F9”運行程式,可以看到在BeginPaint和EndPaint之前有一個CALL函式,

在這里插入圖片描述

選中該行右鍵“跟隨”之后,去到0x01002AC3位置,發現又存在很多個CALL函式,

在這里插入圖片描述

一種方法是一個一個函式分析,這里使用另一種方法,當我們在使用掃雷時,發現它的界面并沒有閃爍,所以懷疑使用了 雙快取技術,這是我們的突破口,雙快取是在快取中一次性繪制,再把繪制的結果回傳在界面上,比如,你要在螢屏上繪制一個圓、正方形、直線,需要呼叫GDI的顯示函式,操作顯卡畫一個圓,再畫一個正方形和直線,它需要訪問硬體三次;此時依賴硬體的訪問速度,而且如果繪制錯誤擦除再繪制,需要反復的訪問硬體,為了減少硬體操作,我們在記憶體中把需要繪制的影像準備好,然后一切妥當之后提交給硬體顯示,

PS:當然,為什么是雙快取技術呢?目前的我也無法理解,只有當我們做了大量的逆向分析后,才會養成一定的經驗來幫助我們判斷,任何行業和技術都是這樣的,包括作者自己,目前也是一步一個腳印的去學習,去總結,去進步,期待與您前行,加油~


第五步:繼續在反匯編視窗右鍵滑鼠,選擇“查找”->“當前模塊中的名稱”,找到雙快取技術的核心函式BitBlt,
BitBlt是將記憶體中的資料提交到顯示幕上,該函式對指定的源設備環境區域中的像素進行位塊(bit_block)轉換,以傳送到目標設備環境,

在這里插入圖片描述

點擊右鍵選擇“在每個參考上設定斷點”,如下圖所示,此時繪制了兩個斷點,

在這里插入圖片描述


第六步:運行程式去到第二個斷點BitBlt位置,

在這里插入圖片描述

注意,此時顯示了兩層回圈,剛好符合我們二維陣列的遍歷,按F8單步步過可以動態除錯觀察其效果,

在這里插入圖片描述


第七步:在0x01002700位置按下F2取消斷點,并在該函式的起始位置0x010026A7設定斷點,接下來需要詳細分析這個雙快取函式繪制程序,

在這里插入圖片描述

代碼中,ESI首先通過XOR進行清零,然后再加1;接著ESI會呼叫CMP進行比較,說明ESI是回圈變數,接下來“MOV AL, BYTE PTR [EBX+ESI]”表示將EBX和ESI相加賦值給AL,然后AL判斷一個值再做其他的,這有點像訪問資料,后面的顯示特性隨著AL做改動,即AL影響后面顯示的內容,

MOV指令是資料傳送指令,也是最基本的編程指令,用于將一個資料從源地址傳送到目標地址(暫存器間的資料傳送本質上也是一樣的),

在這里插入圖片描述


第八步:下面看看暫存器,其中EBX是基址暫存器,ESI是它的偏移量,猜測這個EBX基址暫存器和關鍵資料有關,

在這里插入圖片描述

選擇EBX基址暫存器,然后選擇“資料視窗中跟隨”,顯示如下圖所示的資料,

在這里插入圖片描述

資料視窗顯示如下,我們發現“0F”出現較多,猜測多的這個可能是空的,少的那個是雷“8F”,

在這里插入圖片描述


第九步:資料區詳細分析,
我們選擇0x010026A7位置,然后按下F2取消斷點,然后繼續運行程式,此時彈出掃雷主界面,游戲中通常會存在邊界(圍墻),這里“10”應該是邊界位置,而0x01005361則為起始位置,

在這里插入圖片描述

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

在這里插入圖片描述

我們取消0x01002700位置的斷點,然后運行程式彈出掃雷界面,根據下面的二維矩陣進行掃雷,

在這里插入圖片描述

如下圖所示,前面3個果然時空格,而第四個則時雷,“8A”是雷,“0F”是空格實錘,而且點過的地方會變成數字,比如“40”、“41”、“42”等,

在這里插入圖片描述


第十步:寫個程式進行掃雷資料區詳細分析,
我們重新運行程式,選擇“查找”->“當前模塊中的名稱”,找到雙快取技術的核心函式BitBlt,然后重新找一下,找到代碼位置,如下圖所示,EBX就是雷區的起始位置,我們要想辦法把它讀取出來,再往前“MOV EBX, 01005360”代碼看到了EBX的賦值定義,

在這里插入圖片描述

接著我們輸入F7單步除錯,執行完0x010026C4賦值陳述句后,我們在資料視窗中跟隨EBX暫存器,顯示如下圖所示,前面8個均為“0F”表示空格,第9個為雷,再驗證一次“01005360位置”,就開始準備寫程式了,

在這里插入圖片描述

驗證成功,開始寫程式吧!

在這里插入圖片描述


第十一步:掃雷輔助程式,
我們撰寫了這樣一個程式,當它開啟后,我們滑鼠移動到方格,如果是雷它的標題會變成“掃雪(xue)”,然后我們不點擊它就可以了,哈哈~

在這里插入圖片描述

正常是“掃雷”,

在這里插入圖片描述

雷區顯示為“掃雪”,當然你也可以寫得更隱蔽些,比如和蘋果電話手表建立連接,如果是“雷”讓手表震動一下,否則正常,

在這里插入圖片描述


注意,基本原理知道后,就需要開發解決問題了,對于安全行業來說,不管是做病毒還是研究漏洞利用或游戲防護的,逆向分析都是基礎,開發解決問題才是關鍵,比如,某個病毒樣本的行為已經分析清楚了,這個病毒在哪里創建系統檔案、修改哪個系統檔案、注入到哪個行程、動了哪個注冊表等等,逆向分析第一步完成,但更重要的是怎么解決問題,創建注冊表就需要洗掉注冊表,修改系統檔案就要還原檔案,

我們在網上搜索某些病毒資料時,有些逆向工程師會給出手工修復方案,比如關閉哪個服務、洗掉哪個隱藏檔案、手工清除注冊表哪一項等,但是對于安全公司來說,比如360公司,你安全掃描完成之后,不可能彈框提示用戶手工修復,而是需要提供自動化方案一鍵修復,最終結果是需要修改殺毒軟體的引擎代碼,或者提供專殺工具給用戶,這個時候工具需要自動化完成相關操作,

很多新手會看不起開發,覺得搞逆向、搞網安的是王道,不用學開發,這是不對的, 針對上面的實戰,我們就發現逆向是站在開發基礎上,反向推導作者是怎么做的,比如掃雷需要思考作者會用什么方式表示雷區,然后怎么用UI體現出來以及呼叫什么函式實作,所以,逆向分析之前都要教開發類的課程,《資料結構》《作業系統》《計算機組成原理》《編譯原理》等課程掌握越深入越好,



三.掃雷游戲檢測工具

通過第二部分,我們知道以下資訊:

  • 掃雷的首地址為0x01005360
  • 顯示“0F”表示空格,顯示“8F”表示雷
  • 雷區的邊界為0x10

原理是找到雷在記憶體中的值,只要不是雷值我們把它點擊開來,接下來作者再補充一個逆向輔助工具,通過CheatEngine實作雷區檢測,

Cheat Engine又稱CE修改器,是一款記憶體修改編輯工具,你可以通過Cheat Engine軟體來修改游戲中的記憶體資料、人物屬性、金幣數值等等,功能強大且操作簡單,可以為你帶來良好的更好的體驗游戲,


1.Cheat Engine確定起始位置

第一步,打開Cheat Engine軟體,點擊“選擇打開一個程式”按鈕,如下圖所示,

在這里插入圖片描述

打開掃雷軟體設定為初級,

在這里插入圖片描述


第二步,選擇掃描型別為“未知的初始數值”,選擇“數值型別”為位元組,然后點擊“首次掃描”,

在這里插入圖片描述

此時顯示7,290,880個資料,如下圖所示:

在這里插入圖片描述


第三步,接著我們點擊掃雷,然后在“掃描型別”中選擇“變動的數值”,點擊“再次掃描”,此時回傳結果183,169個,最終通過反復的篩選找到首地址,

在這里插入圖片描述

繼續點擊掃描,如下圖所示,

在這里插入圖片描述


第四步,如果出現地雷則選擇“未變動的數值”,點擊“再次掃描”,接著繼續新一輪的掃雷游戲,

在這里插入圖片描述

在這里插入圖片描述

始終以第一個方格的狀態為目標進行重復的操作,

  • 開始掃描:設定“未知的初始數值”
  • 掃描第一個格子:設定“變動的值”
  • 繼續掃描,結果是雷:設定“未變動的值”
  • 繼續掃描,結果非雷:設定“未變動的值”
  • 重新開始:設定“變動的值”
  • 重新開始如果第一個格子和上一次一樣,則設定“未變動的值”,否則“變動的值”

下圖展示了最后5個結果,接著繼續反復篩選,

在這里插入圖片描述

最侄訓取如下圖所示的結果,其初始地址為——0x01005361,和前面OD軟體分析的一樣,

在這里插入圖片描述


第五步,雙擊該行移動至底部,然后右鍵選擇“瀏覽相關記憶體區域”選項,

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

在這里插入圖片描述


2.Cheat Engine確定邊界

第一步,我們查看掃雷初級的高度是“9”,然后重新打開建立“新的掃描”,

在這里插入圖片描述

輸入數字“9”再點擊“首次掃描”,回傳7174個結果,

在這里插入圖片描述


第二步,選擇中級難度,對應的高度是“16”,然后重新打開建立“再次掃描”,僅剩4個結果,

在這里插入圖片描述

在這里插入圖片描述


第三步,選擇高級難度,設定高度最高即“24”,然后重新打開建立“再次掃描”

在這里插入圖片描述

最終剩2個結果,高度可能是:

  • 0x01005338
  • 0x010056A8

在這里插入圖片描述


第四步,使用同樣的方法找到寬度,
寬度回傳兩個結果:

  • 0x01005334
  • 0x010056AC

在這里插入圖片描述



3.C++撰寫滑鼠坐標獲取案例

接下來我們開始撰寫代碼,首先給大家看看滑鼠坐標獲取的一段代碼,我們滑鼠通常是(x, y)的形式,

第一步,創建空專案,名稱為“MouseMsg”,

在這里插入圖片描述


第二步,為該工程添加一個“main.cpp”檔案,并且添加啟動項,

在這里插入圖片描述

在這里插入圖片描述


第三步,配置graphics.h檔案,
graphics.h是一個針對Windows的C語言圖形庫,分為像素函式、直線和線型函式、多邊形函式、填充函式等,在學習C++游戲編程時,通常會發現VS中沒有”graphics.h”頭檔案,因此需要配置,

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

在這里插入圖片描述

下載完后打開下載好的 Inlcude 檔案夾,里面有兩個頭檔案:

在這里插入圖片描述

(2) 將里面的兩個檔案進行復制,然后粘貼到VS安裝目錄的include檔案夾中,

  • C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\include

在這里插入圖片描述

(3) 打開下載好的檔案夾中的 lib2015子檔案夾,將里面的東西全部選中復制,粘貼到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) 接下來就可以在VS中添加“graphics.h”頭檔案了,里面有很豐富的繪圖函式可供我們使用,

#include <graphics.h>              // 參考圖形庫頭檔案
#include <conio.h>

int main()
{
	initgraph(640, 480);            // 創建繪圖視窗,大小為 640x480 像素
	setlinecolor(RGB(255, 0, 0));   // 設定當前線條顏色
	setfillcolor(RGB(0, 255, 0));   // 設定當前填充顏色
	fillcircle(200, 200, 100);      // 畫圓,圓心(200, 200),半徑 100
	_getch();                       // 按任意鍵繼續
	closegraph();                   // 關閉圖形環境
}

在這里插入圖片描述


第四步,撰寫滑鼠事件代碼,

#include <graphics.h>              // 參考圖形庫頭檔案
#include <stdio.h>

int main()
{	
	//定義滑鼠
	MOUSEMSG m;
	//初始化視窗 500寬度 500高度
	initgraph(500, 500);

	while (1) {
		//獲取滑鼠訊息
		m = GetMouseMsg();
		char buff[256];

		//滑鼠左鍵按下
		if (m.uMsg == WM_LBUTTONDOWN) {
			//清空陣列
			memset(buff, 0, 256);
			sprintf_s(buff, "X坐標:%d, Y坐標:%d", m.x, m.y);
			MessageBox(NULL, buff, "坐標", MB_OK);
		}
	}
	return 0;
}

運行前需要設定編碼方式為“使用多直接字符集”,否則會報錯,

在這里插入圖片描述

運行結果如下圖所示,可以看到滑鼠點擊會顯示對應的坐標位置,

在這里插入圖片描述

其中GetMouseMsg函式表示獲取滑鼠訊息,通過Spy++可以看到很多Windows系統自帶的滑鼠操作、鍵盤操作、訊息操作等,同時能獲取滑鼠是左鍵或右鍵按下以及對應坐標,

在這里插入圖片描述



4.C++撰寫自動掃雷程式

接下來是通過C++實作一鍵掃雷功能,主要是模擬滑鼠在雷區的點擊操作,并且按下所有非雷區域從而實作一鍵掃雷,利用的是Windows應用程式的訊息機制,通過SendMessage函式向指定視窗發送訊息,也就是在獲取到掃雷的視窗句柄后,利用這個函式向該視窗發送滑鼠按鍵訊息,從而實作模擬滑鼠的操作,

該部分參考ioio_jy老師的文章:逆向工程第007篇:掃雷輔助的研究——0秒實作一鍵自動掃雷

第一步,創建一個應用程式名叫“SaoleiHelp”,并添加主函式,

在這里插入圖片描述


第二步,分析掃雷的區域及坐標定義,
坐標是基于客戶區的左上角,但是這個客戶區是怎么定義的呢?
如下圖所示,究竟A點是客戶區的左上角,還是說B點才是呢?如果A點為坐標原點,那么第一塊雷區的坐標就應為(AC,CE),如果B點為坐標原點,那么第一塊雷區的坐標就應為(BD,DE),經過實際測驗,MSDN中所謂的客戶區,其實是以B點作為起點的位置,即原點坐標(0,0),而雷區中心即E點的坐標為(16,61),每個雷區小方塊的大小為16×16,于是可以知道,這里需要回圈計算出雷區每一個小方塊的坐標,這個坐標與保存有雷區的二維陣列下標緊密相關,

在這里插入圖片描述

假設這個二維陣列是mine[y1][x1],其中y1表示的是雷區有多少行,x1表示雷區的列數,那么每個雷區方塊的坐標為:

x = x1 * 16 + 16;
y = y1 * 16 + 61;

在獲得了坐標以后,就可以通過如下陳述句來模擬滑鼠的點擊操作了:

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

第三步,分析掃雷游戲的雷區長寬資料,
結合之前寬度、高度的分析,發現高度位置為0x01005338,寬度位置為0x01005334,我們進一步推斷,從0x01005330開始,這里的一行綠色資料包含有0x0A、0x09以及0x09這三個數值,很明顯這三個資料正是當前雷區的地雷數量以及寬、高等資訊

  • 雷數:0x01005330
  • 寬度:0x01005334
  • 高度:0x01005338

在這里插入圖片描述

同時,我們上面的逆向分析已經知道雷區分布的資訊,

  • “8F”表示地雷
  • “8E”表示旗子
  • “40”表示空格
  • “41”到“49”表示數字
  • “10”表示邊界
  • “0F”表示隔一行

還有一個重要資訊是雷區的分布起始地址,即:

  • 0x01005361

但如果計算含有邊界的情況,雷區的分布情況則為:

  • 起始地址:0x01005340
  • 結束地址:0x0100567F

在這里插入圖片描述


完整代碼如下:

#include <stdio.h>
#include <windows.h>
#include <graphics.h>

int main() {
	DWORD Pid = 0;
	HANDLE hProcess = 0;

	DWORD result1, result2;

	// 獲取掃雷游戲對應的視窗句柄
	HWND hWnd = FindWindow(NULL, L"掃雷");
	if (hWnd != 0) {
		// 獲取掃雷行程ID
		GetWindowThreadProcessId(hWnd, &Pid);
		// 打開掃雷游戲獲取其句柄
		hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Pid);
		if (hProcess == 0) {
			printf("Open winmine process failed.");
			return 0;
		}

		// 存放雷區的起始地址
		DWORD dwBoomAddr = 0x01005340;

		// 雷區的最大值(包含邊界)
		DWORD dwSize = 832;
		PBYTE pByte = NULL;
		pByte = (PBYTE)malloc(dwSize);

		// 讀取整個雷區的資料
		ReadProcessMemory(hProcess, (LPVOID)dwBoomAddr, pByte, dwSize, 0);
		int i = 0;
		int j = 0;
		int n = dwSize;

		// 讀取雷區的長和寬
		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;

		// 雷區轉換,去掉雷區多余的資料
		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++;
		}

		// 獲取雷區方塊的坐標,然后模擬滑鼠進行點擊
		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));   //滑鼠按下
				SendMessage(hWnd, WM_LBUTTONUP, MK_LBUTTON, MAKELONG(x, y));     //滑鼠抬起
			}
		}

		free(pByte);
		CloseHandle(hProcess);
	}
	else {
		printf("Get hWnd failed.");
	}
	return 0;
}

運行結果如下圖所示,一秒實作掃雷,

在這里插入圖片描述



四.總結

寫到這里,這篇文章就介紹完畢,希望對您有所幫助,最后進行簡單的總結下,

  • 一.什么是逆向分析
    1.逆向工程
    2.逆向分析的典型應用
  • 二.掃雷游戲逆向分析
    1.游戲介紹
    2.OllyDbg動態分析
  • 三.掃雷游戲檢測工具
    1.Cheat Engine確定起始位置
    2.Cheat Engine確定邊界
    3.C++撰寫滑鼠坐標獲取案例
    4.C++撰寫自動掃雷程式

學安全一年,認識了很多安全大佬和朋友,希望大家一起進步,這篇文章中如果存在一些不足,還請海涵,作者作為網路安全初學者的慢慢成長路吧!希望未來能更透徹撰寫相關文章,同時非常感謝參考文獻中的安全大佬們的文章分享,深知自己很菜,得努力前行,

在這里插入圖片描述

《珈國情》
明月千里兩相思,
清風縷縷寄離愁,
燕歸珞珈花已謝,
情滿景逸映深秋,

2020年8月18新開的“娜璋AI安全之家”,主要圍繞Python大資料分析、網路空間安全、人工智能、Web滲透及攻防技術進行講解,同時分享CCF、SCI、南核北核論文的演算法實作,娜璋之家會更加系統,并重構作者的所有文章,從零講解Python和安全,寫了近十年文章,真心想把自己所學所感所做分享出來,還請各位多多指教,真誠邀請您的關注!謝謝,

(By:娜璋AI之家 2020-12-10 星期四 晚上10點寫于武漢)



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

  • 科銳逆向的錢林松老師受華中科技大學邀請- “逆向分析計算引導”
  • c++學習筆記——VS2015中添加graphics.h頭檔案 - 行歌er
  • 逆向工程第007篇:掃雷輔助的研究——0秒實作一鍵自動掃雷
  • https://www.bilibili.com/video/BV18W411U7NH
  • [網路安全自學篇] 五.IDA Pro反匯編工具初識及逆向工程解密實戰

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/233599.html

標籤:其他

上一篇:前端安全(3):預防跨站腳本(Cross-Site Scripting,XSS)

下一篇:重寫mongoclient,適配集群、單點配置

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more