91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

strongerHuang ? 來源:strongerHuang ? 作者: Mr Six ? 2021-01-18 11:24 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

如果是做開發(fā)的話,我也覺得匯編確實(shí)也沒什么用。 “簡單”既是匯編的優(yōu)點(diǎn),同時(shí)也是它的缺點(diǎn)。就是因?yàn)樗拇_太“簡單”了,所以,要實(shí)現(xiàn)一個(gè)很簡單的功能也需要很多的代碼。 有時(shí)候我看到一大段的匯編代碼也感覺很頭疼,但是由于業(yè)務(wù)需要,讓我不得不研究一波高級(jí)語言在底層的實(shí)現(xiàn)過程,所以就寫了這么一篇文章。 我們先從一個(gè)簡單的C++小程序入手:

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

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

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

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

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

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

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

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

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

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

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

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

關(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ù)。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

其次就是加花指令,這個(gè)方法的本質(zhì)就是構(gòu)造恒成立跳轉(zhuǎn),增加一些沒用的跳轉(zhuǎn),既不對(duì)程序本身造成影響,也可以干擾別人對(duì)關(guān)鍵跳轉(zhuǎn)的判斷。

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

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

責(zé)任編輯:xj

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

文章出處:【微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3846

    瀏覽量

    85246
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2124

    瀏覽量

    77124
  • 匯編
    +關(guān)注

    關(guān)注

    2

    文章

    214

    瀏覽量

    27422

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

文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    keil實(shí)現(xiàn)cc++混合編程

    起因項(xiàng)目中使用到個(gè)開源的模擬IIC的庫,封裝的比較好,但是是使用c++寫的。于是將其移植到自己的項(xiàng)目中,主要有以下三步操作: 在工程選項(xiàng)中 C/
    發(fā)表于 01-26 08:58

    C語言與C++的區(qū)別及聯(lián)系

    創(chuàng)建源文件時(shí)什么都不給,默認(rèn)是.cpp。 3、返回值 C語言中,如果個(gè)函數(shù)沒有指定返回值類型,默認(rèn)返回int類型;C++中,如果
    發(fā)表于 12-24 07:23

    CC++之間的聯(lián)系

    1、語法兼容性: C++完全兼容C語言的語法,這意味著任何有效的C語言程序都可以直接在C++編譯器下編譯通過。 2、底層控制:
    發(fā)表于 12-11 06:51

    C語言和C++之間的區(qū)別是什么

    函數(shù)重載,即在同作用域內(nèi)可以定義多個(gè)同名函數(shù),只要它們的參數(shù)列表不同即可。 C語言不支持函數(shù)重載,每個(gè)函數(shù)必須具有唯的標(biāo)識(shí)符。 4、異常處理: C++內(nèi)置了異常處理機(jī)制,允許
    發(fā)表于 12-11 06:23

    C/C++條件編譯

    條件編譯是種在編譯時(shí)根據(jù)條件選擇性地包含或排除部分代碼的處理方法。在 C/C++ 中,條件編譯
    發(fā)表于 12-05 06:21

    C++程序異常的處理機(jī)制

    1、什么是異常處理? 有經(jīng)驗(yàn)的朋友應(yīng)該知道,在正常的CC++編程過程中難免會(huì)碰到程序不按照原本設(shè)計(jì)運(yùn)行的情況。 最常見的有除法分母為零,數(shù)組越界,內(nèi)存分配失效、打開相應(yīng)文件失敗等等。
    發(fā)表于 12-02 07:12

    RVMCU課堂「7」: 手把手教你玩轉(zhuǎn)RVSTAR—匯編程序

    相對(duì)于抽象層次更高的C/C++語言,匯編語言是門抽象層次比較低的語言,面向的是最底層的硬件,直接使用處理器的基本指令。雖然現(xiàn)在大多數(shù)的程序
    發(fā)表于 10-31 08:46

    簡單的內(nèi)聯(lián)匯編介紹

    前言1、在程序中我們可以嵌入匯編直接對(duì)我們加入的硬件進(jìn)行相應(yīng)的操作 2、在RISC-V架構(gòu)中定義的CSR寄存器需要使用特殊的 CSR 指令進(jìn)行訪問,如果在 C/C++
    發(fā)表于 10-30 08:04

    C/C++代碼靜態(tài)測試工具Perforce QAC 2025.3的新特性

    ?Perforce Validate?中?QAC?項(xiàng)目的相對(duì)/根路徑的支持。C++?分析也得到了增強(qiáng),增加了用于檢測 C++?并發(fā)問題的新檢查,并改進(jìn)了實(shí)體名稱和實(shí)
    的頭像 發(fā)表于 10-13 18:11 ?574次閱讀
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>代碼靜態(tài)測試工具Perforce QAC 2025.3的新特性

    技能+1!如何在樹莓派上使用C++控制GPIO?

    在使用樹莓派時(shí),你會(huì)發(fā)現(xiàn)Python和Scratch是許多任務(wù)(包括GPIO編程)中最常用的編程語言。但你知道嗎,你也可以使用C++進(jìn)行GPIO編程,而且這樣做還有不少好處。借助WiringPi
    的頭像 發(fā)表于 08-06 15:33 ?4158次閱讀
    技能+1!如何在樹莓派上使用<b class='flag-5'>C++</b>控制GPIO?

    使用英特爾? NPU 插件C++運(yùn)行應(yīng)用程序時(shí)出現(xiàn)錯(cuò)誤:“std::Runtime_error at memory location”怎么解決?

    使用OpenVINO?工具套件版本 2024.4.0 構(gòu)建C++應(yīng)用程序 使用英特爾? NPU 插件運(yùn)行了 C++ 應(yīng)用程序 遇到的錯(cuò)誤: Microsoft
    發(fā)表于 06-25 08:01

    請(qǐng)問是否可以在通用Windows平臺(tái)中構(gòu)建OpenVINO? GenAI C++ 應(yīng)用程序

    無法在通用 Windows 平臺(tái)中構(gòu)建OpenVINO? GenAI C++ 應(yīng)用程序
    發(fā)表于 06-24 07:35

    《ESP32S3 Arduino開發(fā)指南》第三章 C/C++語言基礎(chǔ)

    結(jié)構(gòu)就是重復(fù)執(zhí)行個(gè)語句塊,直到不滿足某個(gè)條件為止。在C語言中有三種循環(huán)語句:① while
    發(fā)表于 06-10 09:20

    主流的 MCU 開發(fā)語言為什么是 C 而不是 C++?

    在單片機(jī)的地界兒里,C語言穩(wěn)坐中軍帳,C++想分杯羹?難嘍。咱電子工程師天天跟那針尖大的內(nèi)存空間較勁,C++那些花里胡哨的玩意兒,在這兒真玩不轉(zhuǎn)。先說內(nèi)存這道坎兒。您當(dāng)stm32f4的256kRAM
    的頭像 發(fā)表于 05-21 10:33 ?1052次閱讀
    主流的 MCU 開發(fā)語言為什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C++</b>?

    C++學(xué)到什么程度可以找工作?

    C++學(xué)到什么程度可以找工作?要使用C++找到工作,特別是作為軟件開發(fā)人員或相關(guān)職位,通常需要掌握以下幾個(gè)方面: 1. **語言基礎(chǔ)**:你需要對(duì)C++的核心概念有扎實(shí)的理解,包括但不限于指針、內(nèi)存
    發(fā)表于 03-13 10:19