前言
今天起,為增加大家學(xué)習(xí)C語(yǔ)言的趣味性、更深層次的學(xué)習(xí)C語(yǔ)言、學(xué)習(xí)更實(shí)用的編程技術(shù),我們今后將陸續(xù)開(kāi)設(shè)逆向方向的教程專題,希望大家喜歡!
C語(yǔ)言研究中心(www.sztianhecheng.cn)
以下正文
本節(jié)教程將教大家如何去逆向分析和破解一個(gè)簡(jiǎn)單的C程序,需要大家熟悉基本的C語(yǔ)言語(yǔ)法,用到工具有:VC6、IDAPro、OD、UE等工具。
下面我們開(kāi)始。
首先,我們用VC6寫一個(gè)簡(jiǎn)單的密碼驗(yàn)證程序,思路呢,很簡(jiǎn)單,就是讓用戶輸入密碼,然后用strcmp比較是否一樣,一樣的話提示正確,不正確的提示錯(cuò)誤并重新輸入。代碼如下:
怎么樣,簡(jiǎn)單吧!
運(yùn)行起來(lái)試試,邏輯很簡(jiǎn)單,只有輸入正確密碼123456的時(shí)候才會(huì)打印YES然后結(jié)束程序,否則一直提示NO并且一直讓你輸入~
那現(xiàn)在,我們就來(lái)Crack掉它!讓我們隨意輸密碼都可以通過(guò)!怎么樣,夠酷吧!
OK,開(kāi)始!
首先,用IDAPro打開(kāi)我們用VC6寫好的這個(gè)密碼驗(yàn)證程序,打開(kāi)流程圖,如下:
在這個(gè)就像這個(gè)程序的流程圖中,我們可以看到里面的字符串,譬如“please input passwd”以及“yes”和“no”。并且可以看到y(tǒng)es和no位于兩個(gè)“中”,很明顯是兩個(gè)處理流程。在它們上面同一個(gè)處理塊結(jié)尾最后注意有一句:jnz???? short loc_401073?? 這就是一句跳轉(zhuǎn)語(yǔ)句,jnz意思為不相等則跳轉(zhuǎn)的意思,后面帶一個(gè)地址。所以靈感來(lái)了,直接在這里進(jìn)行更改。比如可以把jnz(不相等則跳轉(zhuǎn))換成jz(相等跳轉(zhuǎn)),可想程序?qū)⒋笞儯?/span>
改動(dòng)之前,需要先知道一個(gè)公式,即:文件偏移地址 = 虛擬內(nèi)存地(VA)址 – 裝載基址(image base) – 節(jié)偏移
我們現(xiàn)在可以用IDA查看jnz的所在指令地址,但僅僅是虛擬內(nèi)存地址,而裝載基址在windows中PE程序一般都是0x00400000,節(jié)偏移可以用另一個(gè)工具找到。OK繼續(xù)
接下來(lái)就查地址,繼續(xù)動(dòng)工。首先,鼠標(biāo)點(diǎn)擊jnz命令讓光標(biāo)停留在這里,單后空格切換到對(duì)應(yīng)的指令,查看該語(yǔ)句所在的地址位置。如下圖:
看到了嗎?在text段的00401062處! OK,先記下來(lái),一會(huì)用
這個(gè)時(shí)候,IDA可以退下了…
然后,啟動(dòng)另一個(gè)工具,loadPE,這個(gè)干啥用的呢?答:算算咱們代碼在這個(gè)程序中的節(jié)偏移!如下:
先啟動(dòng)
然后點(diǎn)擊PE Editor 選中我們的exe目標(biāo)程序,然后點(diǎn)擊section,如下
怎么算節(jié)偏移呢?用VOffset減去ROffset即可,當(dāng)然這里很明顯為零嘛(雖然感覺(jué)沒(méi)啥用,大多數(shù)都是0,不過(guò)算算好)
這個(gè)時(shí)候考數(shù)學(xué)了,直接帶入公式算吧,文件偏移地址就是:00401062 – 0x400000-0? 答案就是1062!? 哦不應(yīng)該是0x00001062!
那么,好了,最后啟動(dòng)大名鼎鼎的UE修改工具!加載它!
搜索地址0x00001062如圖:
然后將75改為74即可!
為啥? 答:因?yàn)閖z的機(jī)器碼就是74!
最后保存!大功告成!
再運(yùn)行看看,隨便輸個(gè)密碼:
敲回車!看看~咩哈哈哈~
看到效果了嗎? 照著做一遍吧!有問(wèn)題隨時(shí)聯(lián)系我們的CTO哦!
C語(yǔ)言研究中心(www.sztianhecheng.cn)