<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>

          從匯編看C++程序的條件判斷語(yǔ)句

          共 1889字,需瀏覽 4分鐘

           ·

          2021-01-09 17:35

          關(guān)注、星標(biāo)公眾號(hào),直達(dá)精彩內(nèi)容

          作者 |?Mr Six

          來(lái)源| 腳本之家


          在當(dāng)下,如果還能熟練地用匯編寫(xiě)程序的人怕是會(huì)被當(dāng)成怪人來(lái)對(duì)待,即使是研究逆向的人大部分也只能說(shuō)看得懂匯編,很少有人敢說(shuō)他精通匯編的。


          如果是做開(kāi)發(fā)的話,我也覺(jué)得匯編確實(shí)也沒(méi)什么用。


          簡(jiǎn)單既是匯編的優(yōu)點(diǎn)同時(shí)也是它的缺點(diǎn)。就是因?yàn)樗拇_太簡(jiǎn)單了,所以,要實(shí)現(xiàn)一個(gè)很簡(jiǎn)單的功能也需要很多的代碼。


          有時(shí)候我看到一大段的匯編代碼也感覺(jué)很頭疼,但是由于業(yè)務(wù)需要,讓我不得不研究一波高級(jí)語(yǔ)言在底層的實(shí)現(xiàn)過(guò)程,所以就寫(xiě)了這么一篇文章。


          我們先從一個(gè)簡(jiǎn)單的C++小程序入手。



          這個(gè)程序功能很簡(jiǎn)單,就是輸入一個(gè)整數(shù),然后判斷它是不是和123456相等,如果相等就輸出you are right,如果錯(cuò)誤就輸出you are wrong。


          然后把生成的exe文件利用反匯編工具再還原成匯編語(yǔ)言。



          上面這張圖是程序的開(kāi)頭部分。



          而這張圖是結(jié)尾部分。


          可以看到,這個(gè)程序的起始地址是00FA1000而結(jié)束地址是00FA2FF。也就是說(shuō),要實(shí)現(xiàn)這么一個(gè)小小的功能,要用到幾千行匯編代碼。如果大家都這么開(kāi)發(fā),怕是累死也寫(xiě)不出個(gè)啥。


          不過(guò)這里面的大部分代碼都是編譯器幫我們生成的,真正執(zhí)行判斷操作的代碼大概就只有下面這幾行。



          我先是在命令行里面輸入了123,在00FA1082處下了一個(gè)斷點(diǎn),然后回車,程序就斷下來(lái)了。



          關(guān)鍵的判斷操作就是?cmp dword ptr ss:[ebp-0x8],0x1E240


          這個(gè)操作的意思是,把0x1E240這個(gè)數(shù)和內(nèi)存里面地址為[ebp-0x8]的數(shù)據(jù)進(jìn)行比較。


          0x1E240轉(zhuǎn)換為10進(jìn)制可以看到就是123456,也就是觸發(fā)you are right整數(shù)。



          從右邊的寄存器窗口可以看到寄存器ebp的值為00CFFB48,[ebp-0x8]=00CFFB40


          從數(shù)據(jù)窗口可以看到00CFFB40處的值為7B。



          轉(zhuǎn)換成10進(jìn)制剛好為123,也就是我剛才輸入的數(shù)。



          如果兩者相等的話,則會(huì)把zf標(biāo)志位置為1,若不相等,zf位為0。


          現(xiàn)在可以從右邊的寄存器窗口看到,zf位為0,則jnz跳轉(zhuǎn)就成立,從而跳過(guò)you are right而去執(zhí)行you are wrong。


          到了最后,在00FA10AE處的指令jmp short Project1.00FA1060。jmp是無(wú)條件跳轉(zhuǎn)指令。這條指令執(zhí)行會(huì)跳回到剛開(kāi)始要求用戶輸入整數(shù)的操作,相當(dāng)于實(shí)現(xiàn)了while的功能。


          現(xiàn)在假設(shè)這個(gè)程序是個(gè)付費(fèi)軟件,要求用戶來(lái)輸入一個(gè)密鑰來(lái)解鎖軟件。如果我讓這個(gè)if條件恒成立,那么我就能實(shí)現(xiàn)在不知道密鑰的情況下來(lái)使用這個(gè)軟件。


          在反匯編窗口里面,只需要把jnz short Project1.00FA10A1?全部用nop代替就完全,就可以直接忽略掉cmp dword ptr ss:[ebp-0x8],0x1E240對(duì)zf位的影響,從而直接執(zhí)行you are right。



          也就是說(shuō),我隨便輸入一個(gè)值,程序都會(huì)給我返you are right



          事實(shí)上,不光是C++,絕大部分高級(jí)語(yǔ)言在底層都是這么實(shí)現(xiàn)判斷的。所以,為了防止寫(xiě)個(gè)軟件出來(lái)老是被人白嫖,研究一下在底層判斷語(yǔ)句是怎么實(shí)現(xiàn)的還是很重要的。


          最簡(jiǎn)單的防白嫖手段就是加殼。尤其在是這種關(guān)鍵跳轉(zhuǎn)的地方一定要使用加殼工具進(jìn)行保護(hù),防止被別人輕而易舉地就定位到關(guān)鍵跳的位置。其次就是加花指令,這個(gè)方法的本質(zhì)就是構(gòu)造恒成立跳轉(zhuǎn),增加一些沒(méi)用的跳轉(zhuǎn),既不對(duì)程序本身造成影響,也可以干擾別人對(duì)關(guān)鍵跳轉(zhuǎn)的判斷。


          最最無(wú)敵的一種辦法就是用網(wǎng)絡(luò)驗(yàn)證。盡管這也不能保證百分之百不會(huì)被白嫖,但確實(shí)是非常有效的而且相對(duì)容易的辦法了。不過(guò)它的缺點(diǎn)就是,如果服務(wù)器崩了,軟件就不能運(yùn)行了,這對(duì)于用戶來(lái)說(shuō)是無(wú)法接受的。


          在技術(shù)上的對(duì)抗永遠(yuǎn)是在底層,并且是沒(méi)有盡頭的?,F(xiàn)實(shí)往往又是道高一尺魔高一丈,而正是在這種矛與盾的攻防較量中,技術(shù)才不斷地向前發(fā)展,才能為客戶提供更為安全,可靠,便捷的服務(wù)。

          ???????????????? ?END ?????????????????

          掃描下方微信,加作者微信進(jìn)技術(shù)交流群,請(qǐng)先自我介紹喔。



          推薦閱讀:


          嵌入式編程專輯
          Linux 學(xué)習(xí)專輯
          C/C++編程專輯
          Qt進(jìn)階學(xué)習(xí)專輯
          關(guān)注微信公眾號(hào)『技術(shù)讓夢(mèng)想更偉大』,后臺(tái)回復(fù)“m”查看更多內(nèi)容。

          長(zhǎng)按前往圖中包含的公眾號(hào)關(guān)注

          瀏覽 63
          點(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>
                  丝袜美腿亚洲综合 | 芲井空αv无码一区二区三区 | 五月六月婷婷 | 在线观看中国精品网站 | 亚洲字幕 |