chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

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

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

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

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

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

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

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

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)就成立,從而跳過(guò)you are right而去執(zhí)行you are wrong。

到了最后,在00FA10AE處的指令是jmp short Project1.00FA1060。jmp是無(wú)條件跳轉(zhuǎn)指令。這條指令執(zhí)行會(huì)跳回到剛開始要求用戶輸入整數(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。

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

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

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

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

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

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

責(zé)任編輯:xj

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

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

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

    關(guān)注

    117

    文章

    3826

    瀏覽量

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

    關(guān)注

    22

    文章

    2119

    瀏覽量

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

    關(guān)注

    2

    文章

    214

    瀏覽量

    26577

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    使用英特爾? 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

    源代碼加密、源代碼防泄漏c/c++與git服務(wù)器開發(fā)環(huán)境

    源代碼加密對(duì)于很多研發(fā)性單位來(lái)說(shuō)是至關(guān)重要的,當(dāng)然每家企業(yè)的業(yè)務(wù)需求不同所用的開發(fā)環(huán)境及開發(fā)語(yǔ)言也不盡相同,今天主要來(lái)講c++及git開發(fā)環(huán)境的源代碼防泄密保護(hù)方案。企業(yè)源代碼泄密場(chǎng)景、在很多
    的頭像 發(fā)表于 02-12 15:26 ?531次閱讀
    源代碼加密、源代碼防泄漏<b class='flag-5'>c</b>/<b class='flag-5'>c++</b>與git服務(wù)器開發(fā)環(huán)境

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫(kù)案例:ThreadPoll

    1、程序簡(jiǎn)介該程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫(kù)的線程池處理:ThreadPoll。本案例完成如下工作:創(chuàng)建1個(gè)線程池,設(shè)置該線程池內(nèi)部有1024
    的頭像 發(fā)表于 02-10 18:09 ?375次閱讀
    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的<b class='flag-5'>C++</b>公共基礎(chǔ)類庫(kù)案例:ThreadPoll

    從Delphi、C++ Builder和Lazarus連接到MySQL數(shù)據(jù)庫(kù)

    ? 從 Delphi、C++ Builder 和 Lazarus 連接到 MySQL 數(shù)據(jù)庫(kù) MySQL 數(shù)據(jù)訪問(wèn)組件(MyDAC)是個(gè)組件庫(kù),提供從 Delphi 和 C++ Bu
    的頭像 發(fā)表于 01-20 13:47 ?746次閱讀
    從Delphi、<b class='flag-5'>C++</b> Builder和Lazarus連接到MySQL數(shù)據(jù)庫(kù)

    從Delphi、C++ Builder和Lazarus連接到Oracle數(shù)據(jù)庫(kù)

    從 Delphi、C++ Builder 和 Lazarus 連接到 Oracle 數(shù)據(jù)庫(kù) Oracle 數(shù)據(jù)訪問(wèn)組件 (ODAC) 是個(gè)組件庫(kù),它為 32 位和 64 位平臺(tái)提供從 Delphi
    的頭像 發(fā)表于 01-15 10:01 ?849次閱讀

    Spire.XLS for C++組件說(shuō)明

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

    同樣是函數(shù),在CC++中有什么區(qū)別

    同樣是函數(shù),在 CC++ 中有什么區(qū)別? 第一個(gè)返回值。 C語(yǔ)言的函數(shù)可以不寫返回值類型,編譯器會(huì)默認(rèn)為返回 int。 但是 C++
    的頭像 發(fā)表于 11-29 10:25 ?913次閱讀

    技術(shù)干貨驛站 ▏深入理解C語(yǔ)言:掌握C語(yǔ)言條件判斷,從if到switch的應(yīng)用

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

    C語(yǔ)言和C++中結(jié)構(gòu)體的區(qū)別

    同樣是結(jié)構(gòu)體,看看在C語(yǔ)言和C++中有什么區(qū)別?
    的頭像 發(fā)表于 10-30 15:11 ?773次閱讀

    C7000優(yōu)化C/C++編譯器

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

    使用OpenVINO GenAI API在C++中構(gòu)建AI應(yīng)用程序

    許多桌面應(yīng)用程序是使用 C++ 開發(fā)的,而將生成式AI(GenAI)功能集成到這些應(yīng)用程序中可能會(huì)很具有挑戰(zhàn)性,尤其是因?yàn)槭褂孟?Hugging Face 這樣的 Python 庫(kù)的復(fù)雜性。C
    的頭像 發(fā)表于 10-12 09:36 ?1134次閱讀
    使用OpenVINO GenAI API在<b class='flag-5'>C++</b>中構(gòu)建AI應(yīng)用<b class='flag-5'>程序</b>

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫(kù)案例:SafeMap

    1、程序簡(jiǎn)介該程序是基于OpenHarmony的C++公共基礎(chǔ)類庫(kù)的安全關(guān)聯(lián)容器:SafeMap。OpenHarmony提供了個(gè)線程安全的
    的頭像 發(fā)表于 08-30 12:42 ?773次閱讀
    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的<b class='flag-5'>C++</b>公共基礎(chǔ)類庫(kù)案例:SafeMap

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫(kù)案例:SafeBlockQueue

    1、程序簡(jiǎn)介該程序是基于OpenHarmony的C++公共基礎(chǔ)類庫(kù)的讀寫鎖:SafeBlockQueue。線程安全阻塞隊(duì)列SafeBlockQueue類,提供阻塞和非阻塞版的入隊(duì)入隊(duì)和出隊(duì)接口,并提
    的頭像 發(fā)表于 08-30 12:41 ?586次閱讀
    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的<b class='flag-5'>C++</b>公共基礎(chǔ)類庫(kù)案例:SafeBlockQueue

    OpenHarmony標(biāo)準(zhǔn)系統(tǒng)C++公共基礎(chǔ)類庫(kù)案例:HelloWorld

    1、程序簡(jiǎn)介該程序是基于凌蒙派OpenHarmony-v3.2.1標(biāo)準(zhǔn)系統(tǒng)C++公共基礎(chǔ)類庫(kù)的簡(jiǎn)單案例:HelloWorld。主要講解C++
    的頭像 發(fā)表于 08-13 08:23 ?863次閱讀
    OpenHarmony標(biāo)準(zhǔn)系統(tǒng)<b class='flag-5'>C++</b>公共基礎(chǔ)類庫(kù)案例:HelloWorld

    OpenVINO2024 C++推理使用技巧

    很多人都使用OpenVINO新版的C++ 或者Python的SDK,都覺得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的優(yōu)化與整理,已經(jīng)是非常貼近開發(fā)的使用習(xí)慣與推理方式。與OpenCV的Mat對(duì)象對(duì)接方式更是幾乎無(wú)縫對(duì)接,非常的方便好用。
    的頭像 發(fā)表于 07-26 09:20 ?1574次閱讀