- x86匯編與逆向工程:軟件破解與防護(hù)的藝術(shù)
- (美)斯蒂芬妮·多馬斯 (美)克里斯托弗·多馬斯
- 497字
- 2025-02-10 16:05:38
1.1.1 反編譯何時(shí)有用
對(duì)于許多編程語(yǔ)言來說,完全反編譯是不可能的。這些語(yǔ)言將代碼直接構(gòu)建成機(jī)器碼,在這個(gè)過程中會(huì)丟失一些信息,比如變量名。雖然一些高級(jí)反編譯器能夠?yàn)檫@些語(yǔ)言構(gòu)建偽代碼,但是這個(gè)過程并不完美。
然而,一些編程語(yǔ)言會(huì)使用所謂的即時(shí)(Just-In-Time,JIT)編譯技術(shù)。當(dāng)使用JIT語(yǔ)言編寫的程序被“構(gòu)建”時(shí),它們會(huì)被從源代碼轉(zhuǎn)化為一種中間語(yǔ)言(Intermediate Language,IL)而非機(jī)器碼。JIT編譯器在程序運(yùn)行之前會(huì)將一份代碼以這種中間語(yǔ)言形式存儲(chǔ)起來,等到程序開始運(yùn)行的時(shí)候,再將代碼轉(zhuǎn)換為機(jī)器碼。使用JIT編譯技術(shù)的語(yǔ)言包括Java、Dalvik(Android)以及.NET。
例如,Java因在很大程度上不受平臺(tái)限制而聞名。背后的原因是它使用了中間語(yǔ)言Java字節(jié)碼(Java bytecode)和Java虛擬機(jī)(Java Virtual Machine, JVM)。通過將程序代碼分發(fā)為字節(jié)碼并在運(yùn)行時(shí)對(duì)其進(jìn)行編譯,JVM將Java中間語(yǔ)言轉(zhuǎn)換為特定于運(yùn)行它的機(jī)器的機(jī)器碼。雖然這種方式可能會(huì)對(duì)文件大小和性能產(chǎn)生負(fù)面影響,但在可移植性上有所收獲。
JIT編譯還大大簡(jiǎn)化了這些應(yīng)用程序的逆向工程。這些中間語(yǔ)言與原始源代碼非常相似,可以被反編譯或轉(zhuǎn)換回源代碼。源代碼的設(shè)計(jì)初衷就是為了方便人們閱讀,這使得理解應(yīng)用程序的邏輯、識(shí)別軟件保護(hù)措施或其他嵌入的秘密變得容易得多。
- Vue.js 3.x+Element Plus前端開發(fā)實(shí)戰(zhàn)
- App草圖+流程圖+交互原型設(shè)計(jì)教程
- 掌握分布式跟蹤:微服務(wù)和復(fù)雜系統(tǒng)性能分析
- UML基礎(chǔ)與Rose建模案例(第3版)
- 實(shí)戰(zhàn)Java虛擬機(jī):JVM故障診斷與性能優(yōu)化(第2版)
- Android游戲開發(fā)大全
- Knative最佳實(shí)踐
- 產(chǎn)品經(jīng)理入門攻略
- Python與數(shù)據(jù)挖掘
- 計(jì)算機(jī)軟件技術(shù)基礎(chǔ)
- 軟件測(cè)試面試突擊:為自己贏得一份測(cè)試工程師職位
- 學(xué)校沒教的軟件工程課
- 網(wǎng)絡(luò)DevOps平臺(tái)規(guī)劃、設(shè)計(jì)與實(shí)踐:基于企業(yè)架構(gòu)(EA)和領(lǐng)域建模(DDD)的方法
- 軟件測(cè)試之魂:核心測(cè)試設(shè)計(jì)精解
- 每天5分鐘玩轉(zhuǎn)OpenStack