那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

從一個簡單的C++小程序入手 站在匯編角度C++程序的條件判斷語句

strongerHuang ? 來源:strongerHuang ? 作者: Mr Six ? 2021-01-18 11:24 ? 次閱讀

在當下,如果還能熟練地用匯編寫程序的人怕是會被當成怪人來對待(我之前公司就有一個用匯編程序的),即使是研究逆向的人大部分也只能說看得懂匯編,很少有人敢說他精通匯編的。

如果是做開發的話,我也覺得匯編確實也沒什么用。 “簡單”既是匯編的優點,同時也是它的缺點。就是因為它的確太“簡單”了,所以,要實現一個很簡單的功能也需要很多的代碼。 有時候我看到一大段的匯編代碼也感覺很頭疼,但是由于業務需要,讓我不得不研究一波高級語言在底層的實現過程,所以就寫了這么一篇文章。 我們先從一個簡單的C++小程序入手:

380d29e4-58f8-11eb-8b86-12bb97331649.png

這個程序功能很簡單,就是輸入一個整數,然后判斷它是不是和123456相等,如果相等就輸出you are right,如果錯誤就輸出you are wrong。

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

385505e8-58f8-11eb-8b86-12bb97331649.png

上面這張圖是程序的開頭部分。

38c1fb94-58f8-11eb-8b86-12bb97331649.png

而這張圖是結尾部分。

可以看到,這個程序的起始地址是00FA1000而結束地址是00FA2FF。也就是說,要實現這么一個小小的功能,要用到幾千行匯編代碼。如果大家都這么開發,怕是累死也寫不出個啥。

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

39011662-58f8-11eb-8b86-12bb97331649.png

我先是在命令行里面輸入了123,在00FA1082處下了一個斷點,然后回車,程序就斷下來了。

399b61d6-58f8-11eb-8b86-12bb97331649.png

關鍵的判斷操作就是cmp dword ptr ss:[ebp-0x8],0x1E240

這個操作的意思是,把0x1E240這個數和內存里面地址為[ebp-0x8]的數據進行比較。

0x1E240轉換為10進制可以看到就是123456,也就是觸發you are right的整數。

39d479e4-58f8-11eb-8b86-12bb97331649.png

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

從數據窗口可以看到00CFFB40處的值為7B。

3a25b728-58f8-11eb-8b86-12bb97331649.png

轉換成10進制剛好為123,也就是我剛才輸入的數。

3a68b6b8-58f8-11eb-8b86-12bb97331649.png

如果兩者相等的話,則會把zf標志位置為1,若不相等,zf位為0。

現在可以從右邊的寄存器窗口看到,zf位為0,則jnz跳轉就成立,從而跳過you are right而去執行you are wrong。

到了最后,在00FA10AE處的指令是jmp short Project1.00FA1060。jmp是無條件跳轉指令。這條指令執行會跳回到剛開始要求用戶輸入整數的操作,相當于實現了while的功能。

現在假設這個程序是個付費軟件,要求用戶來輸入一個密鑰來解鎖軟件。如果我讓這個if條件恒成立,那么我就能實現在不知道密鑰的情況下來使用這個軟件。

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

3a9e1a88-58f8-11eb-8b86-12bb97331649.png

也就是說,我隨便輸入一個值,程序都會給我返回you are right。

3af09d9e-58f8-11eb-8b86-12bb97331649.png

事實上,不光是C++,絕大部分高級語言在底層都是這么實現判斷的。所以,為了防止寫個軟件出來老是被人白嫖,研究一下在底層判斷語句是怎么實現的還是很重要的。

最簡單的防白嫖手段就是加殼。尤其在是這種關鍵跳轉的地方一定要使用加殼工具進行保護,防止被別人輕而易舉地就定位到關鍵跳的位置。

其次就是加花指令,這個方法的本質就是構造恒成立跳轉,增加一些沒用的跳轉,既不對程序本身造成影響,也可以干擾別人對關鍵跳轉的判斷。

最最無敵的一種辦法就是用網絡驗證。盡管這也不能保證百分之百不會被白嫖,但確實是非常有效的而且相對容易的辦法了。不過它的缺點就是,如果服務器崩了,軟件就不能運行了,這對于用戶來說是無法接受的。

在技術上的對抗永遠是在底層,并且是沒有盡頭的。現實往往又是道高一尺魔高一丈,而正是在這種矛與盾的攻防較量中,技術才不斷地向前發展,才能為客戶提供更為安全,可靠,便捷的服務。

責任編輯:xj

原文標題:站在匯編角度C++程序的條件判斷語句

文章出處:【微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 程序
    +關注

    關注

    117

    文章

    3795

    瀏覽量

    81415
  • C++
    C++
    +關注

    關注

    22

    文章

    2114

    瀏覽量

    73858
  • 匯編
    +關注

    關注

    2

    文章

    214

    瀏覽量

    26007

原文標題:站在匯編角度C++程序的條件判斷語句

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Spire.XLS for C++組件說明

    Spire.XLS for C++款專業的 C++ Excel 組件,可以用在各種 C++ 框架和應用程序中。Spire.XLS fo
    的頭像 發表于 01-14 09:40 ?146次閱讀
    Spire.XLS for <b class='flag-5'>C++</b>組件說明

    同樣是函數,在CC++中有什么區別

    同樣是函數,在 CC++ 中有什么區別? 第一個返回值。 C語言的函數可以不寫返回值類型,編譯器會默認為返回 int。 但是 C++
    的頭像 發表于 11-29 10:25 ?430次閱讀

    技術干貨驛站 ▏深入理解C語言:掌握C語言條件判斷,從if到switch的應用

    在編程中,條件判斷語句是控制程序流程的核心元素之。它們使得程序能夠根據不同的輸入和狀態,做出相應的決策。特別是在
    的頭像 發表于 11-09 01:10 ?433次閱讀
    技術干貨驛站 ▏深入理解<b class='flag-5'>C</b>語言:掌握<b class='flag-5'>C</b>語言<b class='flag-5'>條件</b><b class='flag-5'>判斷</b>,從if到switch的應用

    C語言和C++中結構體的區別

    同樣是結構體,看看在C語言和C++中有什么區別?
    的頭像 發表于 10-30 15:11 ?356次閱讀

    C7000優化C/C++編譯器

    電子發燒友網站提供《C7000優化C/C++編譯器.pdf》資料免費下載
    發表于 10-30 09:45 ?0次下載
    <b class='flag-5'>C</b>7000優化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器

    使用OpenVINO GenAI API在C++中構建AI應用程序

    許多桌面應用程序是使用 C++ 開發的,而將生成式AI(GenAI)功能集成到這些應用程序中可能會很具有挑戰性,尤其是因為使用像 Hugging Face 這樣的 Python 庫的復雜性。C
    的頭像 發表于 10-12 09:36 ?467次閱讀
    使用OpenVINO GenAI API在<b class='flag-5'>C++</b>中構建AI應用<b class='flag-5'>程序</b>

    基于OpenHarmony標準系統的C++公共基礎類庫案例:SafeBlockQueue

    1、程序簡介該程序是基于OpenHarmony的C++公共基礎類庫的讀寫鎖:SafeBlockQueue。線程安全阻塞隊列SafeBlockQueue類,提供阻塞和非阻塞版的入隊入隊和出隊接口,并提
    的頭像 發表于 08-30 12:41 ?352次閱讀
    基于OpenHarmony標準系統的<b class='flag-5'>C++</b>公共基礎類庫案例:SafeBlockQueue

    OpenHarmony標準系統C++公共基礎類庫案例:HelloWorld

    1、程序簡介該程序是基于凌蒙派OpenHarmony-v3.2.1標準系統C++公共基礎類庫的簡單案例:HelloWorld。主要講解C++
    的頭像 發表于 08-13 08:23 ?579次閱讀
    OpenHarmony標準系統<b class='flag-5'>C++</b>公共基礎類庫案例:HelloWorld

    C++語言基礎知識

    電子發燒友網站提供《C++語言基礎知識.pdf》資料免費下載
    發表于 07-19 10:58 ?7次下載

    C++中實現類似instanceof的方法

    C++有多態與繼承,但是很多人開始學習C++,有時候會面臨常見問題,就是如何向下轉型,特別是不知道具體類型的時候,這個時候就希望C++
    的頭像 發表于 07-18 10:16 ?673次閱讀
    <b class='flag-5'>C++</b>中實現類似instanceof的方法

    簡單C程序設計

    電子發燒友網站提供《最簡單C程序設計.pptx》資料免費下載
    發表于 05-28 16:41 ?10次下載

    keil用c++編譯含有rtos模塊時的錯誤問題怎么解決?

    近期看到哥們用c++寫嵌入式,感覺蠻有趣,如果當初我的程序要是能用類就輕松多了,所以也想嘗試下。雖然不會
    發表于 05-09 08:29

    鴻蒙OS開發實例:【Native C++

    使用DevEco Studio創建Native C++應用。應用采用Native C++模板,實現使用NAPI調用C標準庫的功能。使用
    的頭像 發表于 04-14 11:43 ?2765次閱讀
    鴻蒙OS開發實例:【Native <b class='flag-5'>C++</b>】

    使用 MISRA C++:2023? 避免基于范圍的 for 循環中的錯誤

    在前兩篇博客中,我們?向您介紹了新的 MISRA C++ 標準?和?C++ 的歷史?。在這篇博客中,我們將仔細研究以 C++ 中?for?循環為中心的特定規則。
    的頭像 發表于 03-28 13:53 ?861次閱讀
    使用 MISRA <b class='flag-5'>C++</b>:2023? 避免基于范圍的 for 循環中的錯誤

    谷歌捐款100萬美元給Rust基金會,以增強C++與Rust的交互性

    如今,谷歌多項核心業務仍以 C++為主要編程語言,雖然無法直接使用Rust替代現有的C++程序,但谷歌依然選擇支持Rust基金會的“Interop Initiative”計劃,幫助那些選用C+
    的頭像 發表于 02-19 15:41 ?704次閱讀
    怎么赢百家乐官网的玩法技巧和规则| 哪个百家乐官网投注比较好| 大发888娱乐城官网下载| 百家乐连跳规律| 百家乐官网2号说名书| 江陵县| 大发888客服电话 在线| 波浪百家乐测试| 金钱豹百家乐官网的玩法技巧和规则 | 澳门百家乐官网庄闲和| 平安县| 澳门顶级赌场金鹰娱乐| 网络百家乐的玩法技巧和规则| 御匾会百家乐官网娱乐城 | 皇冠正网| sz全讯网xb112| 百家乐赌场详解| 百家乐10法则| 尊龙百家乐官网赌场娱乐网规则 | 闲和庄百家乐官网娱乐城| 最好的百家乐官网博彩公司| 百家乐官网好不好玩| 欢乐谷棋牌游戏官网| 威尼斯人娱乐平台代理| 百家乐哪条路准| 百家乐平台开发| 广州百家乐官网赌场娱乐网规则 | 现场百家乐官网的玩法技巧和规则| 保险百家乐官网怎么玩| 百家乐官网会骗人吗| 百家乐官方网站| 蜀都棋牌下载| 二八杠算法| 百家乐六手变化混合赢家打| 百家乐桌小| 菲律宾百家乐试玩| 百家乐官网游戏| 新濠峰百家乐官网的玩法技巧和规则 | 长江百家乐官网的玩法技巧和规则| 百家乐官网金海岸软件| 百家乐官网游戏程序下载|