WinXP下 扫雷程序逆向分析 --扫雷辅助(一)
逐步走向逆向的坑 , 慢慢的鍛煉 也算是一種興趣愛好吧
突然起興 , (及時行樂) 就想著嘗試分析一下掃雷
這次就用 winxp自帶的掃雷試試
查殼
使用peid 直接拖進去
可以看到 是使用VC 編寫 而且 是 debug 版本
(M$ 還是比較厚道)
OD分析
直接拖進 OD
API 編程的逆向優勢在于 調用的 api 函數 是直接可以查找到符號的
除非自己編寫實現同樣功能的代碼
所以其實 API 程序比 DOS程序好分析多了
hint:
慢慢發現 著手分析一個程序的時候思路很重要 , 不然看著冰涼的匯編 也無法下手
這次主要的目的是 實現一個近似于一件掃雷的功能 , 那么雷的分布 固然很重要
每次的雷的位置 又是隨機的 所以這樣 假想 使用了 Rand 這個 api, 這個API 就成了要點
二話不說 先下斷
這里 OD 已經自動的幫我們下了斷點
一路跑 , 就執行到了這里
這個 idiv 是除法, 關鍵怎么除的有點懵 , 果斷百度之
>
字節操作:16位被除數在AX,8位除數為源操作數,結果的8位商在AL中,8位余數在AH中。表示為
(AL)<-(AX)/(SRC) 的商
(AH)<-(AX)/(SRC) 的余數
字操作:32位被除數放在DX,AX中。其中DX為高位字,16位除數為源操作數,結果的16位端在AX中,16位余數在DX中。表示為
(AX)<-(DX,AX)/(SRC) 的商
(DX)<-(DX,AX)/(SRC) 的余數
雙字操作:64位被除數在EDX,EAX中,其中EDX為高位雙字,32位除數為源操作數,結果的32位商在EAX中,32位余數在EDX中,表示為
(EAX)<-(EDX,EAX)/(SRC) 的商
(EDX)<-(EDX,EAX)/(SRC) 的余數。
IDIV 之于 DIV 是帶符號的除法, 其他相同
這樣一看 這個意圖 就很明顯了
隨后 賦值給eax 作為返回值, ret 返回.
這里把 長 寬(9*9)壓棧保存
之后 esi+1 (eax 得到的是0~8) , 為了描述行(列)數 , 這里把它加一
然后下面又是一次 call winmine.01003940 (就是上面的隨機函數 , 地址眼熟)
這里不贅述 , 就是即系生成一個隨機的 行(列)值(0~8) , 之后加一
下面我門回到 程序領空 這里可以看到 esi 和 ecx 分別保存著我們的
(x,y)且(1~9 , 1~9)
shl 邏輯左移指令
這里比較重要, 就相當于把 ecx的值 乘以 0x20 (32D)
這句 ecx + esi + 0x1005340 就是比較重要了, 這個 0x1005340 就是雷區的基地址
ecx 已經 左移5位 esi 沒有 所以 ,他們加起來就是
ecx * 0x20 + esi + 0x1005340
然后這里 與 0x80 進行 test (與)
1000 0000 如果首位不是 0 就 jnz 了
這里再把 eax左移5位
eax * 0x20 + esi + 0x1005340
注意 : 剛剛的 ecx 是由 eax inc 之后得到的 所以 這里 有 ecx - eax == 0x20
lea (Load effect address)
其實這點沒懂 為啥編譯出來一個 lea 還多請賜教
直接一樣 ds:[eax+esi+0*1005340]就好啊
or 就把數據的 最高位 置 1
(這里就是置雷!!!)
這里有 dec
* [0x01005330] == 9 // 每過一個大循環就減一
* [0x01005338] == 9
當 其減到0 之后 說明初始化結束!(藏雷完畢!)
尚不完善, 夜深睡覺, 待續
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的WinXP下 扫雷程序逆向分析 --扫雷辅助(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初试路由器漏洞挖掘
- 下一篇: 学习MFC首先要知道的--程序执行顺序