在當下,如果還能熟練地用匯編寫程序的人怕是會被當成怪人來對待(我之前公司就有一個用匯編程序的),即使是研究逆向的人大部分也只能說看得懂匯編,很少有人敢說他精通匯編的。
如果是做開發(fā)的話,我也覺得匯編確實也沒什么用。 “簡單”既是匯編的優(yōu)點,同時也是它的缺點。就是因為它的確太“簡單”了,所以,要實現(xiàn)一個很簡單的功能也需要很多的代碼。 有時候我看到一大段的匯編代碼也感覺很頭疼,但是由于業(yè)務(wù)需要,讓我不得不研究一波高級語言在底層的實現(xiàn)過程,所以就寫了這么一篇文章。 我們先從一個簡單的C++小程序入手:

這個程序功能很簡單,就是輸入一個整數(shù),然后判斷它是不是和123456相等,如果相等就輸出you are right,如果錯誤就輸出you are wrong。
然后把生成的exe文件利用反匯編工具再還原成匯編語言。

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

而這張圖是結(jié)尾部分。
可以看到,這個程序的起始地址是00FA1000而結(jié)束地址是00FA2FF。也就是說,要實現(xiàn)這么一個小小的功能,要用到幾千行匯編代碼。如果大家都這么開發(fā),怕是累死也寫不出個啥。
不過這里面的大部分代碼都是編譯器幫我們生成的,真正執(zhí)行判斷操作的代碼大概就只有下面這幾行。

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

關(guān)鍵的判斷操作就是cmp dword ptr ss:[ebp-0x8],0x1E240
這個操作的意思是,把0x1E240這個數(shù)和內(nèi)存里面地址為[ebp-0x8]的數(shù)據(jù)進行比較。
0x1E240轉(zhuǎn)換為10進制可以看到就是123456,也就是觸發(fā)you are right的整數(shù)。

從右邊的寄存器窗口可以看到寄存器ebp的值為00CFFB48,則[ebp-0x8]=00CFFB40
從數(shù)據(jù)窗口可以看到00CFFB40處的值為7B。

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

如果兩者相等的話,則會把zf標志位置為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í)行會跳回到剛開始要求用戶輸入整數(shù)的操作,相當于實現(xiàn)了while的功能。
現(xiàn)在假設(shè)這個程序是個付費軟件,要求用戶來輸入一個密鑰來解鎖軟件。如果我讓這個if條件恒成立,那么我就能實現(xiàn)在不知道密鑰的情況下來使用這個軟件。
在反匯編窗口里面,只需要把jnz short Project1.00FA10A1全部用nop代替就完全,就可以直接忽略掉cmp dword ptr ss:[ebp-0x8],0x1E240對zf位的影響,從而直接執(zhí)行you are right。

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

事實上,不光是C++,絕大部分高級語言在底層都是這么實現(xiàn)判斷的。所以,為了防止寫個軟件出來老是被人白嫖,研究一下在底層判斷語句是怎么實現(xiàn)的還是很重要的。
最簡單的防白嫖手段就是加殼。尤其在是這種關(guān)鍵跳轉(zhuǎn)的地方一定要使用加殼工具進行保護,防止被別人輕而易舉地就定位到關(guān)鍵跳的位置。
其次就是加花指令,這個方法的本質(zhì)就是構(gòu)造恒成立跳轉(zhuǎn),增加一些沒用的跳轉(zhuǎn),既不對程序本身造成影響,也可以干擾別人對關(guān)鍵跳轉(zhuǎn)的判斷。
最最無敵的一種辦法就是用網(wǎng)絡(luò)驗證。盡管這也不能保證百分之百不會被白嫖,但確實是非常有效的而且相對容易的辦法了。不過它的缺點就是,如果服務(wù)器崩了,軟件就不能運行了,這對于用戶來說是無法接受的。
在技術(shù)上的對抗永遠是在底層,并且是沒有盡頭的?,F(xiàn)實往往又是道高一尺魔高一丈,而正是在這種矛與盾的攻防較量中,技術(shù)才不斷地向前發(fā)展,才能為客戶提供更為安全,可靠,便捷的服務(wù)。
責任編輯:xj
原文標題:站在匯編角度C++程序的條件判斷語句
文章出處:【微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
程序
+關(guān)注
關(guān)注
117文章
3849瀏覽量
85489 -
C++
+關(guān)注
關(guān)注
22文章
2131瀏覽量
77416 -
匯編
+關(guān)注
關(guān)注
2文章
214瀏覽量
27606
原文標題:站在匯編角度C++程序的條件判斷語句
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
使用VectorCAST/C++的AI輔助測試功能
手搓C++離散小波變換DWT程序
C++與lua聯(lián)合編程
C++:const 的空間,常量也能占內(nèi)存?
keil實現(xiàn)c與c++混合編程
C語言與C++的區(qū)別及聯(lián)系
C與C++之間的聯(lián)系
C語言和C++之間的區(qū)別是什么
C++程序異常的處理機制
簡單的內(nèi)聯(lián)匯編介紹
使用英特爾? NPU 插件C++運行應用程序時出現(xiàn)錯誤:“std::Runtime_error at memory location”怎么解決?
請問是否可以在通用Windows平臺中構(gòu)建OpenVINO? GenAI C++ 應用程序?
《ESP32S3 Arduino開發(fā)指南》第三章 C/C++語言基礎(chǔ)
主流的 MCU 開發(fā)語言為什么是 C 而不是 C++?
從一個簡單的C++小程序入手 站在匯編角度C++程序的條件判斷語句
評論