菜鳥破解從頭學(xué)之全教程_第1頁(yè)
菜鳥破解從頭學(xué)之全教程_第2頁(yè)
菜鳥破解從頭學(xué)之全教程_第3頁(yè)
菜鳥破解從頭學(xué)之全教程_第4頁(yè)
菜鳥破解從頭學(xué)之全教程_第5頁(yè)
已閱讀5頁(yè),還剩84頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

菜鳥破解從頭學(xué)之全教程

第一章一前言到第九章

首先,力薦看雪老大《加密與解密一一軟件保護(hù)技術(shù)及完全解決方案》,絕對(duì)物超所值,

當(dāng)然,還有看雪精華一、二、三、四以及將要出來(lái)的五,足夠帶你上路等等。

另外,我覺(jué)的你真的很有必要學(xué)一門編程語(yǔ)言以及掌握一些Win32程序的知識(shí)…

課后FAQ

Q:哪些人可以學(xué)習(xí)破解?

A:任何會(huì)啟動(dòng)電腦并運(yùn)行軟件同時(shí)又想學(xué)習(xí)破解的人。我說(shuō)的全是實(shí)話,如果你既不會(huì)

啟動(dòng)電腦又不會(huì)運(yùn)行軟件,那么我教你一個(gè)更高深的吧-破解電腦,呵呵,很簡(jiǎn)單-,到大街

卜.隨便掄個(gè)板磚什么的,回去慢慢破解吧(記得關(guān)電源)

Q:有沒(méi)有什么辦法可以使我快速入門并成為高手?

A:有。但你得是個(gè)MM(P不PL無(wú)所謂),然后找個(gè)離你家最近的破解達(dá)人,什么也不

用做,眨個(gè)眼放個(gè)電之類的會(huì)吧(現(xiàn)在連初中的小女生都會(huì)這個(gè)),然后就成了,呵呵,想

破什么的話,讓高手幫忙吧,到時(shí)說(shuō)成是自己破的就成了MM問(wèn)為什么?因?yàn)槟切└呤执?/p>

都奇丑無(wú)比,呵呵,有了頭腦就沒(méi)了長(zhǎng)相,男的也是這樣,而且越是高手,長(zhǎng)的就是越丑。

據(jù)說(shuō)一次市里到CCG考察奶牛們的出乳情況,看到大哥Sun某的時(shí)候,說(shuō)了句“這奶牛個(gè)

兒這么小啊,中午大家吃涮鍋"(眾大哥:大家準(zhǔn)備好家伙,我們一會(huì)兒要去械斗)。呵呵,

玩笑開到這里,其實(shí)我說(shuō)這么多,只是想告訴你,學(xué)習(xí)破解跟其它技術(shù)一樣,請(qǐng)你不要試圖

投機(jī)取巧,要想學(xué),就腳踏實(shí)地,多看教程多動(dòng)手實(shí)踐積累經(jīng)驗(yàn),不要經(jīng)常POSE那種弱智

問(wèn)題“我不懂XX,請(qǐng)問(wèn)我能學(xué)破解嗎?”,答案是不能,你問(wèn)的同時(shí),不也正在學(xué)嗎?想

知道重要嗎?那我告訴你好了,凡是看雪教程上要求掌握的,你全要掌握,這還不算,要想

成為高手就必須精通,如果你不想一直只停留在入門階段的話。不要想偷機(jī)取巧,誰(shuí)-開始

也不是什么都會(huì)的,但你只要花一些時(shí)間和?小部分精力,那么沒(méi)有什么你學(xué)不會(huì)的,知識(shí)

是要積累的,你知道自己不會(huì)卻不去學(xué),而在那兒?jiǎn)栔夭恢匾?,人家?huì)覺(jué)的你這個(gè)人并不想

認(rèn)真學(xué)破解,而是報(bào)有僥幸心理在浪費(fèi)時(shí)間,請(qǐng)不要做浪費(fèi)時(shí)間的人。不要?jiǎng)傞_始學(xué)就想馬

上.成為高手,沒(méi)有高手,你沒(méi)必要立下超越的目標(biāo),只把學(xué)知識(shí)放在首位就夠了,欲速則不

達(dá),請(qǐng)不要做急于求成的人。

Q:學(xué)破解對(duì)我來(lái)說(shuō)有什么好處?

A:這個(gè)問(wèn)題應(yīng)該你自己來(lái)回答,呵呵,你為什么要學(xué)?“我想免費(fèi)使用共享軟件”倒…

那多少也算是個(gè)目的,但我希望你不要只報(bào)這種目的(目前國(guó)內(nèi)共享軟件業(yè)還有待發(fā)展)。我

只是想說(shuō)給那些只是因?yàn)橐粫r(shí)沖動(dòng)才學(xué)習(xí)破解的人,請(qǐng)將你們當(dāng)初的沖動(dòng)繼續(xù)維持下去,你

需要明白,學(xué)習(xí)破解的目的不只在于破解軟件這個(gè)詞,也許后來(lái)你會(huì)變?yōu)檐浖治?,隨著學(xué)

習(xí)時(shí)間的增加,對(duì)你的編程水平,相信會(huì)有相當(dāng)大的提高。學(xué)習(xí)別人好的思想,并化為己用

就我個(gè)人來(lái)說(shuō),學(xué)習(xí)破解可以把我的匯編的基礎(chǔ)給打好,呵呵,俺對(duì)操作系統(tǒng)這玩意兒感興

趣,到時(shí)候還想寫出來(lái)個(gè)玩玩兒呢,所以匯編這關(guān)必須要過(guò)....

Q:我很笨,那些大蝦的教程我大都看不明白,我能學(xué)會(huì)嗎?

A:永遠(yuǎn)不要說(shuō)你笨,你只是學(xué)的比人家晚而已,太高深的看不懂,那你就撿能看懂的看,

別人能入門,你也能,不得要領(lǐng)只是暫時(shí):大蝦與你,也許差的就是一兩年時(shí)間的問(wèn)題。

稍微有點(diǎn)兒計(jì)算機(jī)知識(shí)的朋友定知道,計(jì)算機(jī)是只識(shí)別0和1的,最初那會(huì)兒,要寫

程序,就要用0和1來(lái)寫,呵呵,Cool吧!所以曾經(jīng)有過(guò)的對(duì)程序員的崇拜,可能就源自

那個(gè)時(shí)候吧后來(lái),人們發(fā)現(xiàn)用0和1來(lái)寫程序,太不爽了,不但寫起來(lái)不上手,而且回過(guò)

頭來(lái)看的話,應(yīng)該很難再看明白了,總之出于這些原因,就有了匯編語(yǔ)言。

匯編語(yǔ)言用一些助記符來(lái)代替0和1的多種組合,也就是各個(gè)指令,這樣的話,從一定

程度上來(lái)說(shuō),方便了許多。但是,匯編也同樣不方便,同樣寫起來(lái)不爽,而且后期維護(hù)同樣

不方便,再加上人們慢慢地需要寫一些更大的程序,在這樣的情況下,高級(jí)語(yǔ)言就被人發(fā)明

了出來(lái),就是我們今天用的Basic、pascahC、C++等等等等,這些語(yǔ)言的出現(xiàn),一下了使

程序的開發(fā)難度大大減低了,以前用匯編要很長(zhǎng)時(shí)間才能開發(fā)出來(lái)的程序,現(xiàn)在只需要很短

的時(shí)間且很輕松的就可以搞定了,特別是最近幾年,可視化編程的大肆普及,使程序員的神

秘感一下子摔了下來(lái),Coder這樣的詞現(xiàn)在都滿天飛了。

但是匯編還是有它先天的優(yōu)勢(shì)的,因?yàn)槠渑cCPU內(nèi)部的指令一一對(duì)應(yīng),所以在一些特

殊的場(chǎng)合,必須由匯編來(lái)實(shí)現(xiàn),比如訪問(wèn)硬件的端口、寫病毒….

而且生成的可執(zhí)行文件效率巨高,且生成的可執(zhí)行文件賊小,寫小程序是很爽的,呵呵,

而且用匯編寫注冊(cè)機(jī),是件很輕松的事,你不用再為怎樣還原為你所熟悉的語(yǔ)言而為難。說(shuō)

了這么多,還是切入主題吧(昏倒觀眾若干):

既然計(jì)算機(jī)只識(shí)別。和1,那么,所有存儲(chǔ)在計(jì)算機(jī)上的文件,也都是以二進(jìn)制的形式

存放的,當(dāng)然也包括可執(zhí)行文件了。

所以,你只要找一個(gè)十六進(jìn)制編輯器比如UltraEdit什么的,就可直接打開并查看可執(zhí)

行文件了,呵呵,如果你能看懂的話你會(huì)發(fā)現(xiàn),此時(shí)看到的,全是些十六進(jìn)制數(shù)值(每4

位二進(jìn)制數(shù)可轉(zhuǎn)換為一位十六進(jìn)制數(shù)),這就是可執(zhí)行文件的具體內(nèi)容,當(dāng)然,其中就包括

可執(zhí)行文件的代碼了。(一頭老牛:好親切?。ㄒ恢徊锁B:笨牛,你給我閉嘴,我眼都花了)。

呵呵,此時(shí),你是不是覺(jué)得看這些東西,有些那個(gè)?

這些東西看起來(lái)就像有字天書,沒(méi)人能*這玩意兒來(lái)進(jìn)行分析,于是乎。就有了相應(yīng)的

軟件,可以將這些十六進(jìn)制數(shù)值轉(zhuǎn)換為相應(yīng)的匯編代碼,這樣的話,我們就可以對(duì)別人的軟

件進(jìn)行分析了。這就是所謂的逆向分析了。

呵呵,聰明的你現(xiàn)在一定在想,如果找到軟件計(jì)算注冊(cè)碼的部分,并對(duì)其進(jìn)行分析,弄

懂它的計(jì)算方法,那么你不就不用通過(guò)¥的方式來(lái)進(jìn)行軟件注冊(cè)了嗎?當(dāng)然,你也可以將此

計(jì)算過(guò)程還原為任意一個(gè)你所熟悉的編程語(yǔ)言,那么,編譯后的這個(gè)程序,就叫做注冊(cè)機(jī),

它的功能就是計(jì)算某一特定軟件的注冊(cè)碼。(呵呵,是不是經(jīng)常在軟件中看到此類說(shuō)明?”

禁止制作和提供該軟件的注冊(cè)機(jī)及破解程序;禁止對(duì)本軟件進(jìn)行反向工程,如反匯編、反編

譯等”)

作者這樣做,心情我們是可以理解的,畢竟人家花了那么多心思在自己的軟件上,所以,

我不希望你僅僅是因?yàn)榻徊黄鹱?cè)費(fèi)的原因來(lái)學(xué)習(xí)破解。

總的說(shuō)來(lái),上邊兒的介紹有點(diǎn)兒太理想化了,上面提到的分析方法,就是所謂的靜態(tài)分

析,此類分析常用的工具有W32DASM、IDA和HIEW等。靜態(tài)分析,顧名思義,就是只

通過(guò)查看軟件的反匯編代碼來(lái)對(duì)軟件進(jìn)行分析。一般如果只是想暴破軟件,只進(jìn)行靜態(tài)分析

就夠了。但要想真正的弄清注冊(cè)算法,一般還是要進(jìn)行動(dòng)態(tài)分析的,即能過(guò)調(diào)試器來(lái)一邊執(zhí)

行程序一邊進(jìn)行分析。具體內(nèi)容,我會(huì)在《破解原理》和《調(diào)試器入門》中詳細(xì)說(shuō)明,呵呵,

畢竟現(xiàn)在都以經(jīng)有點(diǎn)兒跑題了。

我廢話說(shuō)了這么多,其實(shí)就是想告訴你匯編的重要性,我不要求你精通,但最少你也得

能看懂吧,要不,還談什么分析?雖然有哥們兒一點(diǎn)兒匯編都不懂就上路了,甚至還破掉了

幾個(gè)軟件,但是,這樣是不是慘了點(diǎn)兒?難不成你想暴破軟件暴破一輩子?

其實(shí)你完全不用懼怕匯編的,看上去怪嚇人的,其實(shí)跟你平時(shí)背那些控件的屬性方法差

不多,MFC那么多你都搞的定,匯編命令才有多少?而且,匯編不光只是在Crack軟件時(shí)

有用,在好多地方也都有用,且用處巨大,所以我覺(jué)得,把匯編拿下,是件義不容辭的事:

你只要相信它并不難就好了。

(以下為第二次修改時(shí)加入)

先給你講一下CPU的組成吧:

CPU的任務(wù)就是執(zhí)行存放在存儲(chǔ)器里的指令序列。為此,除要完成算術(shù)邏輯操作外,

還需要擔(dān)負(fù)CPU和存儲(chǔ)器以及I/O之間的數(shù)據(jù)傳送任務(wù)。早期的CPU芯片只包括運(yùn)算器和

控制器兩大部分。到了近兒年,為了使存儲(chǔ)器速度能更好地與運(yùn)算器的速度相匹配,又在芯

片中引入了高速緩沖存儲(chǔ)器(知道為什么P4比P4賽揚(yáng)貴那么多嗎?)。(當(dāng)!一個(gè)硬物匕了

過(guò)來(lái),話外音:你講這些做什么,我們又不要設(shè)計(jì)CPU)

你急什么嘛,由于匯編比較“低級(jí)”;;所以它是直接操作硬件的,你以為這

是用VB呢,想什么時(shí)候用變量隨手就可以拿來(lái)用,你不掌握好CPU內(nèi)部的一些工作分配

情況,到時(shí)怎么來(lái)看匯編代碼啊。(當(dāng)!又一聲,重要還不快點(diǎn)兒說(shuō))

除了高速緩沖存儲(chǔ)器之外的組成,大體上可以分為3個(gè)部分:

1.算術(shù)邏輯部件ALU(arithmeticlogicunit)用來(lái)進(jìn)行算術(shù)和邏輯運(yùn)算。這部分與我們

的關(guān)系不太大,我們沒(méi)必要管它。

2.控制邏輯。同樣與我們的關(guān)系不大。

3.這個(gè)才是最最重要的。工作寄存器,它在計(jì)算機(jī)中起著重要的作用,每一個(gè)寄存器相

當(dāng)于運(yùn)算器中的一個(gè)存儲(chǔ)單元,但它的存取速度卻賊快賊快,比存儲(chǔ)器要快很多了。它用來(lái)

存放計(jì)算過(guò)程中所需要的或所得到的各種信息,包括操作數(shù)地址、操作數(shù)及運(yùn)算的中間結(jié)果

等。下面我們專門的介紹這些寄存器。

在介紹之前,有必要說(shuō)點(diǎn)兒基礎(chǔ)性的知識(shí)。知道什么是32位吧,就是說(shuō)寄存器是32

位的,暈一等于沒(méi)說(shuō)。在CPU中,一個(gè)二進(jìn)制位被看作是一位,八位就是一個(gè)字節(jié),在內(nèi)

存中,就是以字節(jié)為單位來(lái)在存儲(chǔ)信息的,每一個(gè)字節(jié)單元給以一唯一的存儲(chǔ)器地址,稱為

物理地址,到時(shí)候訪問(wèn)相應(yīng)的內(nèi)存,就是通過(guò)這個(gè)地址。八個(gè)二進(jìn)制位都能表達(dá)些什么呢?

可以表達(dá)所有的ASCII碼,也就是說(shuō)一個(gè)內(nèi)存單元可以存儲(chǔ)一個(gè)英文字符或數(shù)字什么的,

而中文要用Unicode碼來(lái)表示,也就是說(shuō)兩個(gè)內(nèi)存單元,才能裝一個(gè)漢字。十六位就是兩個(gè)

字節(jié)這不難理解吧,當(dāng)然啦,那有了十六位,就肯定有三十二位六十四位什么的,三十二位

叫做雙字,六十四位就叫做四字。今天我們所使的CPU,相信全是32位的了,除非你用的

是286或更早的話。自然而然,CPU中的寄存器,也就是32位的了,也就是說(shuō)一個(gè)寄存器,

可以裝下32個(gè)0或1(這其中不包括段寄存器)。

大體上來(lái)說(shuō),你需要掌握的寄存器,有十六個(gè),我?個(gè)一個(gè)給介紹給你:

首先,介紹小翠兒(當(dāng)!,我自己打我自己一下得了,最近看周星馳看多了),重說(shuō),首

先,介紹通用寄存器。

一共八個(gè),分另I」是EAX、EBX、ECX、EDX、ESP、EBP、EDLESL

其中,EAX-EDX這四個(gè)寄存器又可稱為數(shù)據(jù)寄存器,你除了直接訪問(wèn)外,還可分別

對(duì)其高十六位和低十六位(還計(jì)的我說(shuō)它們是32位的嗎?)進(jìn)行訪問(wèn)。它們的低十六位就

是把它們前邊兒的E去掉,即EAX的低十六位就是AX。而且它們的低十六位又可以分別

進(jìn)行八位訪問(wèn),也就是說(shuō),AX還可以再進(jìn)行分解,即AX還可分為AH(高八位)AL(低

八位)。其它三個(gè)寄存器請(qǐng)自行推斷。這樣的話,你就可以應(yīng)付各種情況,如果你想操作的

是一個(gè)八位數(shù)據(jù),那么可以用MOVAL(八位數(shù)據(jù))或MOVAH(八位數(shù)據(jù)),如果你要操作

的是一個(gè)十六位數(shù)據(jù),可以用MOVAX(十六位數(shù)據(jù))三十二位的話,就用MOVEAX(三十

二位數(shù)據(jù))也許我這樣說(shuō),你還是會(huì)不明白,沒(méi)關(guān)系,慢慢來(lái),我給你大概畫張圖吧,雖然

不怎么漂亮:

高十六位EAXAHAXAL

(我倒啊…這個(gè)圖為啥老是不能正常顯示?我都重畫三遍了)

明白了嗎?不明白沒(méi)有關(guān)系,你就按你自己的理解能力,能理解多少,就理解多少。

這四個(gè)寄存器,主要就是用來(lái)暫時(shí)存放計(jì)算過(guò)程中所用的操作數(shù)、結(jié)果或其它信息。

而ESP、EBP、EDI、ESI這四個(gè)呢,就只能用字來(lái)訪問(wèn),它們的主要用途就是在存儲(chǔ)

器尋址時(shí),提供偏移地址。因此,它們可以稱為指針或變址寄存器。話說(shuō)回來(lái),從386以后,

所有的寄存器都可以用來(lái)存儲(chǔ)內(nèi)存地址。(這里給你講一個(gè)小知識(shí),你在破解的時(shí)候是不是

看到過(guò)[EBX]這樣的形式呢?這就是說(shuō)此時(shí)EBX中裝的是一個(gè)內(nèi)存地址,而真正要訪問(wèn)的,

就是那那個(gè)內(nèi)存單元中所存儲(chǔ)的值)。

在這幾個(gè)寄存器中,ESP稱為堆棧指針寄存。堆棧是一個(gè)很重要的概念,它是以“后進(jìn)

先出”方式工作的一個(gè)存儲(chǔ)區(qū),它必須存在于堆棧段中,因而其段地址存放于SS寄存器中。

它只有一個(gè)出入口,所以只有一個(gè)堆棧指針寄存器。ESP的內(nèi)容在任何時(shí)候都指向當(dāng)前的棧

頂。我這樣說(shuō)你可能會(huì)覺(jué)的還是不明白,那我舉個(gè)例子吧,知道民工蓋房吧,假設(shè)有兩個(gè)民

工,一個(gè)民工(以下簡(jiǎn)稱民工A)要向地上鋪磚,另一個(gè)民工(以下簡(jiǎn)稱民工B)給民工A

遞樵,民工A趴在地上,手邊是民工B從遠(yuǎn)處搬來(lái)的板磚,他拿起來(lái)就用,民工B從遠(yuǎn)處

搬來(lái)后,就還放在那一堆磚上,這樣,民工A拿著用后,民工B隨既就又補(bǔ)了上去,這就

是后進(jìn)先出。你在腦子里想象下這個(gè)這程。有沒(méi)有想明白,民工A永遠(yuǎn)是從最上邊開始

拿磚。堆棧就是這樣,它的基址開始于一個(gè)高地址,然后每當(dāng)有數(shù)據(jù)入棧,它就向低地址的

方向進(jìn)行存儲(chǔ)。相應(yīng)的入棧指令是PUSH。每當(dāng)有數(shù)據(jù)入棧,ESP就跟著改變,總之,它永

遠(yuǎn)指向最后一個(gè)壓入棧的數(shù)據(jù)。之后,如果要用壓入堆棧的數(shù)據(jù),就用出棧指令將其取出。

相應(yīng)的指令是POP,POP指令執(zhí)行后,ESP會(huì)加上相應(yīng)的數(shù)據(jù)位數(shù)。

特別是現(xiàn)在到了Win32系統(tǒng)下面,堆棧的作用更是不可忽視,API所用的數(shù)據(jù),均是*

堆棧來(lái)傳送的,即先將要傳送的數(shù)據(jù)壓入堆棧,然后CALL至API函數(shù),API函數(shù)會(huì)在函

數(shù)體內(nèi)用出棧指令將相應(yīng)的數(shù)據(jù)出棧。然后進(jìn)行操作。以后你就會(huì)知道這點(diǎn)的重要性了。許

多明碼比較的軟件,一般都是在關(guān)鍵CALL前,將真假兩個(gè)注冊(cè)碼壓入棧。然后在CALL

內(nèi)出棧后進(jìn)行比較。所以,只要找到個(gè)關(guān)鍵CALL,就能在壓棧指令處,下d命令來(lái)查看真

正的注冊(cè)碼。具體內(nèi)容會(huì)在后面詳細(xì)介紹,本章暫不予討論。

另外還有EBP,它稱為基址指針寄存器,它們都可以與堆棧段寄存器SS聯(lián)用來(lái)確定堆

棧中的某一存儲(chǔ)單元的地址,ESP用來(lái)指示段頂?shù)钠频刂?,而EBP可作為堆棧區(qū)中的一

個(gè)基地址以便訪問(wèn)堆棧中的信息。ESI(源變址寄存器)和EDI(目的變址寄存器)一般與

數(shù)據(jù)段寄存器DS聯(lián)用,用來(lái)確定數(shù)據(jù)段中某一存儲(chǔ)單元的地址。這兩個(gè)變址寄存器有自動(dòng)

增量和自動(dòng)減量的功能,可以很方便地用于變址。在串處理指令中,ESI和EDI作為隱含的

源變址和目的變址寄存器時(shí),ESI和DS聯(lián)用,EDI和附加段ES聯(lián)用,分別達(dá)到在數(shù)據(jù)段

和附加段中尋址的目的。目前暫時(shí)不明白不要緊。

接下來(lái),再介紹如花(當(dāng)當(dāng)當(dāng),我再打自己三下算了)接下來(lái),介紹一下專用寄存器,

呵呵,有沒(méi)有被這個(gè)名字嚇倒?看起來(lái)怪專業(yè)的。

所謂的專用寄存器,有兩個(gè),一個(gè)是EIP,一個(gè)是FLAGS。

我們先來(lái)說(shuō)這個(gè)EIP,可以說(shuō),EIP算是所有寄存器中最重要的一個(gè)了。它的意思就是

指令指針寄存器,它用來(lái)存放代碼段中的偏移地址。在程序運(yùn)行的過(guò)程中,它始終指向下一

條指令的首地址。它與段寄存器CS聯(lián)用確定下一條指令的物理地址。當(dāng)這一地址送到存儲(chǔ)

器后,控制器可以取得下一條要執(zhí)行的指令,而控制器一旦取得這條指令就馬上修改EIP

的內(nèi)容,使它始終指向下一條指令的苜地址??梢?,計(jì)算機(jī)就是用EIP寄存器來(lái)控制指令序

列的執(zhí)行流程的。

那些跳轉(zhuǎn)指令,就是通過(guò)修改EIP的值來(lái)達(dá)到相應(yīng)的目的的。

再接著我們說(shuō)一下這個(gè)FLAGS,標(biāo)志寄存器,又稱PSW(programstatusword),即程序

狀態(tài)寄存器。這一個(gè)是存放條件標(biāo)志碼、控制標(biāo)志和系統(tǒng)標(biāo)志的寄存器。

其實(shí)我們根本不需要太多的去了解它,你目前只需知道它的工作原理就成了,我舉個(gè)例

子吧:

CmpEAX,EBX;用EAX與EBX相減

JNZ00470395;不相等的話,就跳到這里;

這兩條指令很簡(jiǎn)單,就是用EAX寄存器裝的數(shù)減去EBX寄存器中裝的數(shù)。來(lái)比較這

兩個(gè)數(shù)是不是相等,當(dāng)Cmp指令執(zhí)行過(guò)后,就會(huì)在FLAGS的ZF(zeroflag)零標(biāo)志位上

置相應(yīng)值,如果結(jié)果為0,也就是他們兩個(gè)相等的話,ZF置1,否則置0。其它還有OF(溢

出標(biāo)志)SF(符號(hào)標(biāo)志)CF(進(jìn)位標(biāo)志)AF(輔助進(jìn)位標(biāo)志)PF(奇偶標(biāo)志)等。

這些你目前沒(méi)必要了解那么清楚,會(huì)用相應(yīng)的轉(zhuǎn)移指令就行了。

最后要介紹的就是段寄存器了(剛才是誰(shuí)說(shuō)的櫻紅?反正不是我)

這部分寄存器一共六個(gè),分別是CS代碼段,DS數(shù)據(jù)段,ES附加段,SS堆棧段,F(xiàn)S

以及GS這兩個(gè)還是附加段。

其實(shí)現(xiàn)在到了Win32環(huán)境下,段寄存器以經(jīng)不如DOS時(shí)代那樣重要了。

所以,我們知道就行了。

啰嗦了這么多,相信你對(duì)CPU以經(jīng)有了個(gè)大概的了解了吧。什么?還是什么也不明白?

呵呵,那也不要灰心,請(qǐng)相信這是我的錯(cuò),是我沒(méi)有講清楚而已,你可以去參考一些書籍。

我始終覺(jué)的,你案頭有一本講匯編的書是非常非常有必要的,我這邊兒是清華版的《80x86

匯編語(yǔ)言程序設(shè)計(jì)》沈美明主編,46元。

我們接下來(lái)就再講一講一些常用的匯編指令吧。(由于考慮到目前以經(jīng)有了相應(yīng)的帖子,

所以,我只是從匯編指令中,挑出一些最常用,需要掌握的,更多內(nèi)容,還請(qǐng)參見書本。)

CMPA,B比較A與B其中A與B可以是寄存器或內(nèi)存地址,也可同時(shí)是兩個(gè)寄存器,

但不能同都是內(nèi)存地址。這個(gè)指令太長(zhǎng)見了,許多明碼比較的軟件,就用這個(gè)指令。

MOVA,B把B的值送給A其中,A與B可是寄存器或內(nèi)存地址,也可同時(shí)是兩個(gè)寄

存器,但不能同都是內(nèi)存地址。

Xora,a異或操作,主要是用來(lái)將a清空

LEA裝入地址,例如LEADX,string將字符的地址裝入DX寄存器

PUSH壓棧

POP出棧

ADD加法指令格式:ADDDST,SRC執(zhí)行的操作:(DST)<-(SRC)+(DST)

SUB減法指令格式:SUBDST,SRC執(zhí)行的操作:(DST)<-(DST)-(SRC)

MUL無(wú)符號(hào)乘法指令格式:MULSRC執(zhí)行的操作:字節(jié)操作(AX)<-(AL)*(SRC);

字操作(DX,AX)<-(AX)*(SRC);雙字操作:(EDX,EAX)<-(EAX)*(SRC)

DIV無(wú)符號(hào)除法指令格式:DIVSRC執(zhí)行的操作:字節(jié)操作:16們被除數(shù)在AX中,8

位除數(shù)為源操作數(shù),結(jié)果的8位商在AL中,8位余數(shù)在AH中。表示為:

(AL)c-(AX)/(SRC)的商,(AH)<-(AX)/(SRC)的余數(shù)。字操作:32位被除數(shù)在DX,AX中。

其中DX為高位字,16位除數(shù)為源操作數(shù),結(jié)果的16位商在AX中,16位余數(shù)在DX中。

表示為:(AX)<-(DX,AX)/(SRC)的商,(DX)<-(DX,AX)/(SRC)的余數(shù)。

雙字操作:64位的被除數(shù)在EDX,EAX中。其中EDX為高位雙字;32位除數(shù)為源操作

數(shù),結(jié)果的32位商在EAX中,32位余數(shù)在EDX中。表示為:

(EAX)<-(EDX,EAX)/(SRC)的商,(EDX)<-(EDX,EAX)/(SRC)的余數(shù)。

NOP無(wú)作用,可以用來(lái)抹去相應(yīng)的語(yǔ)句,這樣的話,嘿嘿嘿…

CALL調(diào)用子程序,你可以把它當(dāng)作高級(jí)語(yǔ)言中的過(guò)程來(lái)理解。

控制轉(zhuǎn)移指令:

JE或JZ若相等則跳

JNE或JNZ若不相等則跳

JMP無(wú)條件跳

JB若小于則跳

JA若大于則跳

JG若大于則跳

JGE若大于等于則跳

JL若小于則跳

JLE若小于等于則跳

總的來(lái)說(shuō),以上幾個(gè),都是比較常見的,需要掌握,但需要掌握的絕不止這幾個(gè),其它

的指令希望你能在私下里再了解一下,可以找相應(yīng)的教程來(lái)看。

剛才忘了,現(xiàn)在再把數(shù)制轉(zhuǎn)換也給貼上:

首先說(shuō)二進(jìn)制轉(zhuǎn)換為十進(jìn)制的問(wèn)題:

各位二進(jìn)制數(shù)碼乘以與其對(duì)應(yīng)的權(quán)之和即為該二進(jìn)制相對(duì)應(yīng)的十進(jìn)制數(shù)。例如:

10100=2的4次方+2的2次方,也就是十進(jìn)制數(shù)20。

11000=2的4次方+2的3次方,也就是十進(jìn)制數(shù)24。

接著說(shuō)一下十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)的方法:

這樣的方法到底有多少,我也不清楚,我只講最簡(jiǎn)單的一個(gè)-除法:

把要轉(zhuǎn)換的十進(jìn)制數(shù)的整數(shù)部分不斷除以2,并記下余數(shù),直到商為0為止。

例:N=34D(說(shuō)明一下,你可能在某些數(shù)字的后邊看到過(guò)加有一個(gè)字母,這個(gè)字母便是用

來(lái)表示數(shù)制的,十進(jìn)制數(shù)用D,二進(jìn)制數(shù)用B,八進(jìn)制數(shù)用O,十六進(jìn)制數(shù)用H)

34/2=17(a0=0)

17/2=8(al=l)

8/2=4(a2=0)

4/2=2(a3=0)

2/2=1(a4=0)

1/2=0(a5=l)

所以N=34D=10001OB?

對(duì)于被轉(zhuǎn)換的十進(jìn)制數(shù)的小數(shù)部分則應(yīng)不斷乘以2,并記下其整數(shù)部分,直到結(jié)果的小

數(shù)部分為0為止。

十六進(jìn)制數(shù)與二進(jìn)制數(shù)、十進(jìn)制數(shù)之間的轉(zhuǎn)換:

總的來(lái)說(shuō),十六進(jìn)制數(shù)與二進(jìn)數(shù)之間的轉(zhuǎn)換,應(yīng)該算是很簡(jiǎn)單的了,你只需把與之相對(duì)

應(yīng)的數(shù)值進(jìn)行轉(zhuǎn)換就成了。

十六進(jìn)制數(shù)的基數(shù)是16,共有16個(gè)數(shù)碼,它們是0』,2,3,4,5,6,7,8,9,A,B,C,D,E,F.其中

A表示十進(jìn)制中的10,其余類推。它們與二進(jìn)制和十進(jìn)制數(shù)的關(guān)系如下:

0H=0D=0000B,1H=1D=0001B,2H=2D=001OB,3H=3D=0011B,4H=4D=0100B,5H=5DH)10iB,6

H=6D=O1IOB,7H=7D=O111B,8H=8D=1OOOB,9H=9D=1OO1B,AH=1OD=1O1OB,BH=11D=1O11B

,CH=12D=1100B,DH=13D=1101B,EH=14D=1110B,FH=15D=1111B

所以,二進(jìn)制與十六進(jìn)制之間要進(jìn)行轉(zhuǎn)換的話,只要把它們由低到高每四位組成一級(jí),

直接用十六進(jìn)制來(lái)表示就可以了:

例:1000101000110101

8A35

十六進(jìn)制轉(zhuǎn)二進(jìn)制則用只需將每一位用四位二進(jìn)制數(shù)來(lái)表示就成了:

例:AB10

1010101100010000

最后是十六進(jìn)制數(shù)與十進(jìn)制數(shù)之間的互相轉(zhuǎn)換

十六進(jìn)制數(shù)轉(zhuǎn)十進(jìn)制數(shù)

各位十六進(jìn)制數(shù)與其對(duì)應(yīng)權(quán)值的乘積之和即為與此十六進(jìn)制數(shù)相對(duì)應(yīng)的十進(jìn)制數(shù)。

例:N=BF3CH

=11*16的3次方+15*16的2次方+3*16的1次方+12*16的0次方

=11*4096+15*256+3*16+12*1

=48956D

十進(jìn)制轉(zhuǎn)十六進(jìn)制

我還是只講最簡(jiǎn)單的除法:

把要轉(zhuǎn)換的十進(jìn)制數(shù)的整數(shù)值部分不斷除以16,并記下余數(shù),直到商為0為止。

例N=48956D

48956/16=3059(a0=12)

3059/16=191(a1=3)

191/16=11(a2=15)

11/16=0(a3=ll)

所以N=48956D=BF3CHo

通過(guò)以上的介紹,我不知道你到底看懂沒(méi)有,如果有的話,請(qǐng)你去看一下書本,把我沒(méi)

講到的地方和講過(guò)了的地方都仔細(xì)地看幾遍。如果你根本就沒(méi)有看懂,那么你就更需要去看

書了,不要因?yàn)檫@就喪失掉學(xué)習(xí)的信心。你認(rèn)真地把前邊兒的CPU介紹看完,弄清楚寄存

器的概念,再把后邊匯編指令拿下,就可以上路了。你認(rèn)真學(xué),認(rèn)真背的話,會(huì)發(fā)現(xiàn)其實(shí)并

沒(méi)你想像中的那么難。一星期的時(shí)間,就可大概掌握了,但只是掌握而已,最起碼可以看懂

匯編代碼了。要真想學(xué)好的話,就連后邊兒的也?同看了吧,再寫一些小程序來(lái)練練手。當(dāng)

然想精通匯編,那可不是一天兩天一月兩月的事,但你只要有恒心,有什么搞不定的?CPU

也是人做的,指令只是其中的一部分而己,人家能做出CPU,你還怕連使用都學(xué)不會(huì)?

課后FAQ

Q:我以前學(xué)過(guò)8086/8088,并且也在DOS下寫過(guò)程序,能行嗎?

A:絕對(duì)能行,相對(duì)8086/8088,現(xiàn)在的CPU在基本指令方面,也沒(méi)有添加多少新的指令。

你只需了解一下各寄存器的變化以及補(bǔ)充一下Windows程序的知識(shí)就成了。而且,既然你

用匯編在DOS下寫過(guò)程序,那么對(duì)Debug等調(diào)試器,肯定已經(jīng)很上手了,所以你有先天的

優(yōu)勢(shì)。

Q:匯編對(duì)我來(lái)說(shuō)不成問(wèn)題,可我為什么總是不上手呢?

A:呵呵,這樣的老鳥倒還有不少,他們把匯編用的相當(dāng)熟練,但是,只是因?yàn)榻?jīng)驗(yàn)的原

因,所以才覺(jué)的不上手的,許多人當(dāng)初不也都這樣嗎?最起碼我就是,見了CALL就跟進(jìn),

呵呵,倒跟了不少API,所以對(duì)于這部分高手,你只需多練練手以及掌握一些分析的技巧就

成了。

Q:我沒(méi)學(xué)過(guò)編程,能學(xué)匯編嗎?

A:總的來(lái)說(shuō),也行。不過(guò)希望匯編的學(xué)習(xí),不會(huì)使你丟掉學(xué)習(xí)其它高級(jí)語(yǔ)言的信心。:)

答網(wǎng)友問(wèn)

Q:寄存器可以隨便用么,有沒(méi)有什么限制?寫個(gè)程序的時(shí)候那些變量什么的可以放在任

意的寄存器么?

A:呵呵,我現(xiàn)在就來(lái)回答樓上朋友的問(wèn)題。

寄存器有它的使用機(jī)制,及各個(gè)寄存器都有著明確的分工。

如小翠兒如數(shù)據(jù)寄存器(EAX-EDX),它們都是通用寄存器,及在軟件中,任何數(shù)據(jù)

都可存放于此。但是除此之外,它們又可以都可以用于各自的專用目的。

例如:

EAX可以作為累加器來(lái)使用,所以它是算術(shù)運(yùn)算的主要寄存器。在乘除法等指令中指

定用來(lái)存放操作數(shù)。比如在乘法111,你可以用AL或AX或EAX來(lái)裝被乘數(shù),而AX或DX:AX

或EAX或EDX:EAX則用來(lái)裝最后的積。

EBX一般在計(jì)算存儲(chǔ)器地址時(shí),它經(jīng)常用作基址寄存器。

ECX則常用來(lái)保存計(jì)數(shù)值,如在移位指令它用來(lái)裝位移量、循環(huán)和串處理指令中作隱

含的計(jì)數(shù)器。

最后就剩下四大天王中的黎明了,近一段時(shí)間來(lái),他總是比較低調(diào)…(你別打我了,我

去撞墻好了)最后就剩下EDX了,一般在作雙字長(zhǎng)運(yùn)算時(shí)把DX和AX組在一起存放一個(gè)

雙字長(zhǎng)數(shù)(你還記的什么是雙字長(zhǎng)吧,舉個(gè)例子,比如說(shuō)有一個(gè)數(shù)二進(jìn)制數(shù)據(jù)

01101000110101000100100111010001,你要把它寄存起來(lái),就可以把0110100011010100(即

高十六位)放在DX中,把0100100111010001(即低十六位)放在AX中,這個(gè)數(shù)表示為DX:AX)

當(dāng)然完全可以用一個(gè)EDX就把這個(gè)數(shù)給裝下。所以,還可以用EDX:EAX來(lái)裝一個(gè)64位數(shù)

據(jù),這個(gè)你會(huì)推斷出來(lái)吧。

而ESP、EBP、EDI、ESI,我上邊兒以經(jīng)大概介紹的差不多了,所以這里不說(shuō)它們了。

當(dāng)然還有其它的一些限制,因?yàn)槲覀冎皇且闯绦虻膮R編代碼(人家寫好了的,肯定不

會(huì)犯錯(cuò)誤吧),而不是要去寫,所以可以不必掌握。有性趣的話,去看相關(guān)書籍。

另外再說(shuō)一下你的最后一個(gè)問(wèn)題“寫個(gè)程序的時(shí)候那些變量什么的可以放在任意的寄存

器么?”這句話我不明白你要問(wèn)的是什么。我想你可能是把一些關(guān)點(diǎn)給搞錯(cuò)了,變量這詞

通常都是出現(xiàn)在高級(jí)語(yǔ)言中的,而你用高級(jí)語(yǔ)言寫程序的話,完全不用理解那些寄存器什么

的,這些都跟高級(jí)語(yǔ)言沒(méi)什么關(guān)系。但是最終,高級(jí)語(yǔ)言也還是把你寫的程序轉(zhuǎn)換為對(duì)寄存

器、內(nèi)部存儲(chǔ)器的操作。

〈本章完>

第三章一Windows程序

這一章我都不知道該如何寫了,呵呵~~

畢竟,Win32是一個(gè)非常深?yuàn)W的系統(tǒng),目前還容不得我這種小輩在這兒說(shuō)三道四,不過(guò),

我既然是要寫給那些入門階段的朋友們看的,又不是寫給那些搞程序設(shè)計(jì)老鳥看的,所以,

我也犯不著怕被人背后指著罵本章的名字就叫《Windows程序》而不是《Windows程序

設(shè)計(jì)》所以,我只是講一些關(guān)于Windows程序運(yùn)作的原理:

Windows為什么叫Windows,相信所有用過(guò)的朋友都可以明白,那桌面上一個(gè)一個(gè)的

窗口,就是它名字的由來(lái)。也就是這一個(gè)又一個(gè)窗口的出現(xiàn),使計(jì)算機(jī)的使用一下子簡(jiǎn)單了

巨多。兒年前接觸過(guò)電腦的朋友一定知道DOS吧,不知道的話,去問(wèn)加解密工具下載版的

版主老哥,讓他跟你解釋你還記的DOS下那黑乎乎的窗口吧,沒(méi)見過(guò)的哥們兒可以在開

始菜單中找出來(lái)看看。DOS通過(guò)一系列的命令來(lái)進(jìn)行相應(yīng)的操作,如進(jìn)入一個(gè)目錄,刪除

一個(gè)目錄等等等等。那種工作方式就叫做命令提示符方式,也即命令行。

現(xiàn)在國(guó)內(nèi)不懂電腦的人還老愛說(shuō)要想學(xué)電腦,必須要英語(yǔ)過(guò)關(guān)。(就是這個(gè),嚇跑了多

少僅僅是想學(xué)習(xí)一些基本操作的朋友)可能也就是源自DOS的原因吧。

后來(lái),隨著硬件的支持以及技術(shù)上的提高,當(dāng)然還有為了使電腦更方便的服務(wù)與人,慢

慢的就有了所謂的視圖操作系統(tǒng),從此,你不用再記憶那些大堆的指令了,而且操作上,也

有了相大的提高,可以說(shuō)操作系統(tǒng)發(fā)展到今天的份兒上,操作已經(jīng)夠簡(jiǎn)單了,去看看那些在

網(wǎng)吧里一把鼻涕的小孩子們吧…

當(dāng)然,就像當(dāng)年DOS之于命令提示行一樣,今天的Windows仍和當(dāng)年一樣,占據(jù)著大

部分的用戶群。

(場(chǎng)外:一觀眾扔來(lái)一爛柿餅,你是唐僧啊,這么多廢話)

馬上轉(zhuǎn)入正題,Windows之所以好用,除了不用背N多的命令外,一個(gè)原因就是因?yàn)?/p>

它本身提供了大量的標(biāo)準(zhǔn)WindowsGUI函數(shù)。所以對(duì)于用戶,面對(duì)的是同一套標(biāo)準(zhǔn)的窗口,

對(duì)這些窗口的操作都是一樣的,所以使用不同的應(yīng)用程序時(shí)無(wú)須重新學(xué)習(xí)操作。不用像當(dāng)年

在DOS下面那樣一安裝新程序,就要馬上看幫助,看說(shuō)明。

而WindowsGUI函數(shù),只不過(guò)是微軟提供給程序開發(fā)人員的API(Application

ProgrammingInterface應(yīng)用編程接口)中的■小部分而以。WindowsAPI是一大組功能強(qiáng)大

的函數(shù),它們本身駐扎在Windows中供人們隨時(shí)調(diào)用。這些函數(shù)的大部分被包含在幾個(gè)動(dòng)

態(tài)鏈接庫(kù)(DLL)中,譬如:kernel32.dll,user32.dll和gdi32.dll。Kemel32.dll中的函數(shù)主

要處理內(nèi)存管理和進(jìn)程調(diào)度;user32.dll中的函數(shù)主要控制用戶界面;gdi32.dll中的函數(shù)則

負(fù)責(zé)圖形方面的操作等等。

你可能多多少少聽說(shuō)過(guò)API函數(shù),如果你不太清楚到底是怎么一回事的話,我盡量給

你解釋的清楚一點(diǎn)。

不知道你有沒(méi)有想過(guò),Windows中的那一個(gè)又一個(gè)窗口是怎么畫出來(lái)的呢?呵呵,你可

能用VB、Delphi編過(guò)程序,你有沒(méi)有想過(guò)你寫的程序中的那些窗口是怎么形成的?是控件

變成的。倒…呵呵,相信你當(dāng)初學(xué)VB或Delphi的時(shí)候,所看的書上一定對(duì)可視化編程環(huán)境

大肆贊揚(yáng)了一番吧,是不是也提到過(guò)比VC++怎么怎么方便?怎么怎么不用再為生成程序的

界面而花費(fèi)大量無(wú)用時(shí)間了等等。

馬上開說(shuō),其實(shí)我只是想告訴你,所有你用的Windows下的程序,都是通過(guò)調(diào)用一個(gè)

又一個(gè)的WindowsAPI來(lái)執(zhí)行相應(yīng)任務(wù)的,沒(méi)有API,你的程序什么也做不了用VB、Delphi

以及MFC的朋友也許會(huì)說(shuō)我根本沒(méi)有調(diào)用什么API啊!其實(shí)這些API都是由你所用的開發(fā)

環(huán)境自動(dòng)進(jìn)行相應(yīng)的轉(zhuǎn)換的。比如說(shuō)你用Delphi新建一程序,什么也不用動(dòng)就直接按F9來(lái)

運(yùn)行它,是不是出現(xiàn)一個(gè)空白的窗體?這就是個(gè)標(biāo)準(zhǔn)的Windows程序,它有Windows程序

所具有的一切特征,如最大化按鈕、最小化按鈕、關(guān)閉按鈕…你可以通過(guò)鼠標(biāo)來(lái)移動(dòng)它。

但是如果你想用VC++或MASM32來(lái)寫這樣一個(gè)程序,那么你有兩種方法,在VC++

中,你可以用MFC或直接調(diào)用API,而在MASM32中,你就只有直接調(diào)用API這一種方

法。所謂直接調(diào)用API,就是指所有的操作都通過(guò)最原始的API來(lái)完成。通過(guò)直接調(diào)用API

來(lái)生成這樣一個(gè)程序,你必須要先注冊(cè)窗口類(除非您使用Windows預(yù)定義的窗口類,如

MessageBox或dialogbox);然后產(chǎn)生窗口;然后在桌面顯示窗口(除非您不想立即顯示它);

然后刷新窗口客戶區(qū);

麻煩吧,如果你想真正的讓這個(gè)程序能正常地運(yùn)行下來(lái),還要再加入以下步驟:

1.你要得到您應(yīng)用程序的句柄。2.窗體顯示后就進(jìn)入無(wú)限的獲取窗口消息的循環(huán)。3.如

果有消息到達(dá),由負(fù)責(zé)該窗口的窗口回調(diào)函數(shù)處理。4.如果用戶關(guān)閉窗口,進(jìn)行退出處理。

上面這此步驟,都需要調(diào)用相應(yīng)的API來(lái)完成。比如說(shuō)得到程序的句柄用

GetModuleHandle注冊(cè)窗口類用RegisterClass或RegisterClassEx;注冊(cè)后,還要用

CreateWindowEx函數(shù)來(lái)生成相應(yīng)窗口,而后用ShowWindow來(lái)顯示它,之后還會(huì)用

UpdateWindow來(lái)更新客戶區(qū)等等等等。這些還都不算呢,如果你真通過(guò)直接調(diào)用API去寫

一個(gè)稍大一點(diǎn)兒的程序的話,你會(huì)發(fā)現(xiàn)那是一個(gè)多么不令人愉快的事情。

上面說(shuō)的這些,只不過(guò)是API中的一小小小小小小小小小小….部分,這才幾個(gè),真正

的API有成百上千個(gè),包括對(duì)系統(tǒng)各個(gè)方面進(jìn)行的操作。沒(méi)有API,你的程序什么也干不了。

比如說(shuō)你的程序中有一個(gè)Edit控件,VB中應(yīng)該叫做Text控件吧,你想將用戶輸入到里面

的信息放到一個(gè)變量中去,那么Delphi中可以用Str:=Editl.text來(lái)實(shí)現(xiàn)。VB中應(yīng)該是

SgTextl.Text;但是如果你用API,想要得到Edit輸入框里的文本內(nèi)容,就要調(diào)用

GetDlgltemlnt(Edit中輸入的值當(dāng)做數(shù)值來(lái)用)GetDlgItemText>GetDlgltemTextA(Edit'I1

輸入的值當(dāng)做字符串來(lái)用)。而上面我說(shuō)的VB、Delphi得到編輯框中輸入的內(nèi)容的方法,

最終在編譯成可執(zhí)行文件的時(shí)候,也會(huì)由編譯器自動(dòng)對(duì)其進(jìn)行相應(yīng)的轉(zhuǎn)換。你只要明白一件

事就好了,那就是你所用的程序,無(wú)時(shí)無(wú)刻都在調(diào)用著系統(tǒng)中的各種各樣的API函數(shù)。

其實(shí)Windows中的API,就相當(dāng)于當(dāng)年DOS系統(tǒng)中的系統(tǒng)功能調(diào)用,及中斷21。只不

過(guò)在數(shù)量上和功能上,都是DOS系統(tǒng)功能調(diào)用所不及的。

如果你還是看不明白,那我不怪你,可能是我講的不清楚,所以,還是給你推薦老牛寫

的書吧。力推《Windows程序設(shè)計(jì)》,看過(guò)之后你會(huì)內(nèi)力大增的,那時(shí)候你所知道的知識(shí)就

不止是API而以了。

其實(shí)話說(shuō)回來(lái),我這篇文章不是教你編程的,所以關(guān)于Windows程序的原理,沒(méi)有必

要說(shuō)那么多,我之所以跟你講API,是想讓你知道Windows程序的運(yùn)行機(jī)制。免的到時(shí)候

用調(diào)試器下斷點(diǎn)的時(shí)候問(wèn)什么是API。

附上幾個(gè)常用的API函數(shù)吧。相信你此時(shí)因該以經(jīng)對(duì)API有個(gè)大概的了解了。

MessageBox顯示一信息對(duì)話框

MessageBoxEx顯示一?信息對(duì)話框

MessageBoxIndirect顯示一定制信息對(duì)話框

(以匕這三個(gè),可以用來(lái)中斷那些錯(cuò)誤提示,比如說(shuō)你注冊(cè)碼輸入錯(cuò)誤了,程序就可能

通過(guò)這幾個(gè)函數(shù)中的一個(gè),來(lái)提示你錯(cuò)誤)

GetDlgltemlnt得指定輸入框整數(shù)值

GetDlgltemText得指定輸入框輸入字符串

GetDlgltemTextA得指定輸入框輸入字符串

(軟件可以用這三個(gè)來(lái)得到用戶輸入的注冊(cè)碼)

GetLocalTime得當(dāng)前本地時(shí)間

GetSystemTime得當(dāng)前系統(tǒng)時(shí)間

(軟件可以用這兩個(gè)來(lái)判斷軟件是否過(guò)期)

RegQueryvalueA獲取一個(gè)項(xiàng)的設(shè)置值

RegQueryvalueExA獲取一個(gè)項(xiàng)的設(shè)置值

RegSetvalueA設(shè)置指定項(xiàng)或子項(xiàng)的值

RegSetvalueExA設(shè)置指定項(xiàng)的值

(如果軟件用注冊(cè)表存儲(chǔ)注冊(cè)信息的話,那么這兒個(gè)也許會(huì)有用)

上面講的,只是幾個(gè)平時(shí)比較常見的,更多請(qǐng)參見看雪以前的教程或Windows開發(fā)人

員手冊(cè)。

最后,我們還要隆重介紹一個(gè)重量級(jí)函數(shù),你可能不知道API是什么,但你只要用過(guò)

調(diào)試器,就一定知道它的名字。

它就是hmemcpy。

這個(gè)函數(shù)是干什么的?

它是一個(gè)非常簡(jiǎn)單的函數(shù)。只完成一項(xiàng)非常非?;镜娜蝿?wù),就是把數(shù)據(jù)從一個(gè)地方復(fù)

制到另一個(gè)地方。應(yīng)用程序本身并不調(diào)用它,理由很簡(jiǎn)單,它很低級(jí)(匯編:誰(shuí)敢說(shuō)跟我一

樣?)?但是大部分API函數(shù)卻非常頻繁地調(diào)用它。所以,它也叫萬(wàn)能函數(shù)。平時(shí)你可能都

不知道有這么個(gè)東西,但是斷起程序來(lái)卻非常管用。但目前到了2K跟Xp下,卻沒(méi)有這個(gè)

函數(shù)了,與之相應(yīng)的是一個(gè)叫memcpy的函數(shù),雖然功能與其相同,但是基本上已經(jīng)是個(gè)廢

人了總知,你用memcpy根本就斷不下什么來(lái)。所以,這么一個(gè)好使的函數(shù)只能在98下

使用了。

別的我也不多說(shuō)什么了,這章你就知道API是什么就成了。

第四章-調(diào)試器及相關(guān)工具入門

推薦看《CrackTutorial2001h推薦看《看雪論壇精華一、二、三、四》,推薦看《加

密-與解密一一軟件保護(hù)技術(shù)及完全解決方案》,推薦看一切與之有關(guān)的教程。

本章補(bǔ)遺:

要想上.路,你最少應(yīng)該熟練掌握以下工具:

SoftICE:目前公認(rèn)最好的跟蹤調(diào)試工具。(由于我使用的分辯率的關(guān)系,從沒(méi)有用過(guò)它)

Trw2000:國(guó)人驕傲,其中有我最喜歡的pmodule命令。(河南老鄉(xiāng),殷墟舊人)

W32Dasm8.93或其它任意版本:反匯編的極品工具。

Hiew或者UltraEdit或者其它:十六進(jìn)制工具。爆破時(shí)使用,DOS下使用Hiew,Windows

下使用UltraEdit、WinHex、HexWorkshop等,我個(gè)人喜歡用UltraEdit。

偵測(cè)文件類型工具:比如TYP、gtw或Fileinfo等。這是一個(gè)能偵測(cè)你的軟件是被哪一

種I■殼」給加密了。

PROCDUMP與其它N多的脫殼軟件。

EXESCOPE:擁有執(zhí)行文件(EXE,DLL等)的解析與顯示功能;提取資源到外部文件;

資源的重新寫入;記錄文件的記錄及其再編輯(成批編輯)等功能。是漢化軟件的常用工具,

當(dāng)然破解軟件時(shí)也很有用。

******?*?S****Mw*****S*

****W*W***

第五章-破解原理

從本章開始,我們來(lái)一步?步學(xué)習(xí)Crack軟件

不可不說(shuō)一下學(xué)習(xí)破解的三個(gè)階段:

初級(jí),修改程序,用ultraedit等工具修改exe文件,稱暴力破解,簡(jiǎn)稱爆破

中級(jí),追出軟件的注冊(cè)碼

高級(jí),寫出注冊(cè)機(jī)

先說(shuō)這爆破。所謂爆破,就是指通過(guò)修改可執(zhí)行文件的源文件,來(lái)達(dá)到相應(yīng)的目的。你

不明白?呵呵,舉個(gè)例子好了,比如說(shuō)某共享軟件,它比較用戶輸入的注冊(cè)碼,如果用戶輸

入的,跟它通過(guò)用戶名(或其它)算出來(lái)的注冊(cè)碼相等的話(也就是說(shuō)用戶輸入的注冊(cè)碼正

確了),那么它就會(huì)跳到注冊(cè)成功的地方去,否則就跳到出錯(cuò)的地方去。

明白過(guò)來(lái)了吧,我們只要找到這個(gè)跳轉(zhuǎn)指令,把它修改為我們需要的“造型”,這樣,

我們是不是就可以為所欲為了?

常見的修改方法有兩種,我給你舉例說(shuō)明:

no.l

在某軟件中,這樣來(lái)進(jìn)行注冊(cè):

00451239CALL00405E02(關(guān)鍵CALL,用來(lái)判斷用戶輸入的注冊(cè)碼是否正確)

0045123DJZ004572E6(!!!(一此為關(guān)鍵跳轉(zhuǎn),如果用戶輸入的注冊(cè)碼正確,就跳向成

功處,即004572E6處)

0045XXXXYYYYYYYYYY

XXXXXXXXYYYYYYYYYY

XXXXXXXXYYYYYYYYYY

XXXXXXXX執(zhí)行到此處,就提示用戶注冊(cè)失敗

…提示用戶注冊(cè)碼不正確等相關(guān)信息

004572E6...V-(注冊(cè)成功處!!!)

…提示用戶注冊(cè)成功等相關(guān)信息

呵呵,看明白了嗎?沒(méi)有的話,我來(lái)給你講一下。在軟件執(zhí)行到00451239處的時(shí)候,

CALL置0045E02處來(lái)進(jìn)行注冊(cè)碼判斷。接著回來(lái)后就來(lái)一個(gè)跳轉(zhuǎn)語(yǔ)句,即如果用戶輸入的

注冊(cè)碼正確就跳到004572E6處,跳到此處,就算是注冊(cè)成功了。如果用戶輸入的注冊(cè)碼不

正確的話,那么就不會(huì)在0045123D處進(jìn)行跳轉(zhuǎn),而一直執(zhí)行下去。在下面等它的,是注冊(cè)

失敗部分。

想明白了嗎?嘿嘿…沒(méi)錯(cuò),我們只要把那個(gè)關(guān)鍵跳轉(zhuǎn)JZ給改為JNZ(如果用戶輸入的注

冊(cè)碼錯(cuò)誤,就注冊(cè)成功,輸入正確則注冊(cè)失敗)。當(dāng)然你也可以將JNZ修改為Jmp,這樣的

話,你輸入的注冊(cè)碼無(wú)論正確與否。都可以注冊(cè)成功。

no.2

我們?cè)賮?lái)講一下另外的一種情況:

00451239CALL00405E02(關(guān)鍵CALL,用來(lái)判斷用戶輸入的注冊(cè)碼是否正確)

0045123DJNZ004572E6(!!!〈一此為關(guān)鍵跳轉(zhuǎn),如果用戶輸入的注冊(cè)碼不正確,就跳

向失敗處,即004572E6處)

0045XXXXYYYYYYYYYY

XXXXXXXXYYYYYYYYYY

XXXXXXXXYYYYYYYYYY

XXXXXXXX執(zhí)行到此處,就提示用戶注冊(cè)成功

…提示用戶注冊(cè)成功等相關(guān)信息

004572E6...<一(注冊(cè)失敗處!!!)

…提示用戶注冊(cè)碼不正確等相關(guān)信息

你一定看出跟第種情況不同的地方了吧。沒(méi)錯(cuò)!它與第一種不同的,就是第一種情況

是如果注冊(cè)碼正確,就跳到注冊(cè)成功處,如果沒(méi)有跳走,就會(huì)執(zhí)行到失敗處。而這一種情況

則是如果注冊(cè)碼不正確,就跳到注冊(cè)失敗處,否則將執(zhí)行到注冊(cè)成功處。

這種情況的修改,除了把JNZ改為JZ外,還可以將其改為Nop,

Nop這個(gè)指令沒(méi)有任何意義,將該條指令修改為Nop后,便可隨意輸入注冊(cè)碼來(lái)進(jìn)行

注冊(cè)了。

原理以經(jīng)給你講了,下面我們?cè)賮?lái)講一下具體的修改辦法吧。(我假設(shè)你以經(jīng)明白了我

所說(shuō)的工具的使用方法)

先說(shuō)一下虛擬地址和偏移量轉(zhuǎn)換的問(wèn)題,在SoftICE和W32Dasm下顯示的地址值是所

謂的內(nèi)存地址(memoryoffset),或稱之為虛擬地址(VirualAddress,VA)?而十六進(jìn)制工

具里,如:Hiew、HexWorkshop等顯示的地址就是文件地址,稱之為偏移量(Fileoffset)或

物理地址(RAWoffset)o

所以當(dāng)我們要通過(guò)那些十六進(jìn)制工具來(lái)對(duì)可執(zhí)行文件中的相應(yīng)指令進(jìn)行修改的話,先要

找到它的Fileoffseto我們沒(méi)有必要去使用那些專門的轉(zhuǎn)換工具,在W32Dasm中就有這個(gè)

功能,比如說(shuō)你W32Dasm中來(lái)到0045123D處,在W32Dasm界面下方的狀態(tài)欄中就會(huì)出

現(xiàn)該條指令的虛擬地址和偏移地址,即@:0045123D?offset0005063Dh后面的這個(gè)

0005063Dh就是相應(yīng)的偏移地址。我們得到該地址后,便可用UltraEdit等十六進(jìn)制工具來(lái)

對(duì)可執(zhí)行文件進(jìn)行修改了。比如使用UltraEdit,你先用UltraEdit打開該可執(zhí)行文件,然后

按Ctrl+G,接著輸入你得到的偏移地址,就可以來(lái)到其相應(yīng)的機(jī)器碼處。

再給你講一下機(jī)器碼,所謂的機(jī)器碼。就是你看到的那些個(gè)十六進(jìn)制數(shù)據(jù)了。還記的它

們與匯編指令是一一對(duì)應(yīng)的嗎?

以下這幾個(gè)是爆破時(shí)要用到的,其它的如果感興趣,可自行查看相關(guān)資料:

JZ=74;JNZ=75;JMP=EB;Nop=90

爆破的時(shí)候,只要對(duì)以上機(jī)器碼進(jìn)行相應(yīng)的修改就行了,比如第一種情況的時(shí)候,可以

將74修改為EB,即將JZ修改為JMP。而第二種情況,責(zé)需將75修改為90,即將JNZ修

改為Nopo

由于本章只講原理,具體--點(diǎn)的。如怎樣找到關(guān)鍵跳轉(zhuǎn)等,我們?cè)谙乱徽轮性僦v。

上邊講了爆破的原理,你需要明白的是。爆破只是你學(xué)習(xí)Crack的開始,是很簡(jiǎn)單的手

段。剛?cè)腴T的時(shí)候可以玩玩兒,但希望你不要就此不前!

偶就不喜歡爆破,做不出注冊(cè)機(jī)也要找出注冊(cè)碼。否則我就不會(huì)去注冊(cè)這個(gè)軟件,既然

想不掏錢,就要*你自己的本事。

其實(shí)要找到注冊(cè)碼并不是件多么難的事,我是指你所針對(duì)的軟件不太那個(gè)的時(shí)候不

過(guò)你無(wú)需懼怕。

剛才我們說(shuō)爆破的時(shí)候不提到過(guò)關(guān)鍵CALL嗎?一般情況下,這個(gè)關(guān)鍵CALL就是對(duì)

兩個(gè)注冊(cè)碼(一個(gè)是軟件自身通過(guò)你的注冊(cè)名或機(jī)器什么的計(jì)算出來(lái)的正確的注冊(cè)碼,令?

個(gè)就是你輸入的錯(cuò)誤的注冊(cè)碼)進(jìn)行比較。我前邊提到過(guò),CALL之前一般會(huì)把所用到的數(shù)

據(jù)先放到一個(gè)地方,CALL過(guò)去的時(shí)候再?gòu)倪@些地方把先前放入的數(shù)據(jù)取出來(lái),進(jìn)行相應(yīng)的

處理。這個(gè)關(guān)鍵CALL也是這樣,在CALL之前,一般會(huì)把那兩個(gè)注冊(cè)碼放到堆棧或某個(gè)

寄存器中。嘿嘿,我們只要在調(diào)試器中,單步執(zhí)行到該CALL,在未進(jìn)去之前通過(guò)CALL之

前的指令判斷其將正確的和不正確的注冊(cè)碼放到哪里了。然后再用相應(yīng)指令進(jìn)行查看就成

了,我說(shuō)過(guò)不難的。

下面列出兩個(gè)最常見的情況(可參考相關(guān)教程):

no.l

moveax[]這里可以是地址,也可以是其它寄存器

movedx[]同上,該條指令也可以是popedx

call00??????關(guān)鍵call

testeaxeax

jz(jnz)或jne(je)關(guān)鍵跳轉(zhuǎn)

看明白了吧,在關(guān)鍵CALL之前,軟件會(huì)把兩個(gè)注冊(cè)碼分別放入eax和edx中,你只要

在CALL處下deax或dedx就能看到正確的注冊(cè)碼了。

no.2

moveax[]這里可以是地址,也可以是其它寄存器

movedx[]同上,該條指令也可以是popedx

call00??????關(guān)鍵call

jne(je)關(guān)鍵跳轉(zhuǎn)

以上兩種情況最為常見,而那些個(gè)不太常見的情況,我們這里就不再提了。到下下一章

的時(shí)候,我會(huì)給你講相關(guān)方法的…

關(guān)于查找軟件注冊(cè)碼的部分,就到這里。具體內(nèi)容,下下一章咱們?cè)僬f(shuō)。

最后,再來(lái)說(shuō)最后的所謂的高級(jí)階段,如果你相信自己。并且熱愛Crack,那么你一定

會(huì)熬到這個(gè)階段的,只是時(shí)間因人而異。

其實(shí)分析軟件的算法,是有好多技巧在里面的。呵呵,最起碼我剛開始的時(shí)候就摸不著

頭腦,那么多CALL,每個(gè)看起來(lái),都很重要,都追一遍?結(jié)果連好多API都被追了進(jìn)去。

等你自己真正用心分析了一個(gè)軟件的算法,并寫出了注冊(cè)機(jī)后。你就會(huì)明白其中的道理了,

我們下下下一章再說(shuō)。

第六章-爆破軟件

爆破的原理我也說(shuō)過(guò)了,相信你很容易就能理解了。我們今天就具體講一下如何找到那

個(gè)關(guān)鍵跳轉(zhuǎn)

爆破一個(gè)軟件■-般只需要很少的幾個(gè)步驟,首先先看?下其有無(wú)加殼,有的話是用何工

具加的殼,知道了以后用相應(yīng)的工具將其脫掉或進(jìn)行手工脫殼,參考以有教程。接著我們就

可以對(duì)脫過(guò)殼之后的軟件來(lái)開刀了。你有兩種選擇,用W32Dasm或調(diào)試器,一般如果你遇

上的是那種很菜的軟件的話,用W32Dasm就可以搞定了。如果你遇上的不是那種很菜的軟

件的話,就用調(diào)試器吧。先來(lái)說(shuō)W32Dasm:我們首先用W32Dasm來(lái)進(jìn)行反匯編.之后在串

式參考中找到錯(cuò)誤提示信息或可能是正確的提示信息雙擊鼠標(biāo)左鍵來(lái)到相應(yīng)的地址處。在

W32Dasm的主窗口中分析相應(yīng)匯編代碼,找出關(guān)鍵跳轉(zhuǎn)利關(guān)鍵call。綠色光條停在關(guān)鍵跳轉(zhuǎn),

在W32Dasm主窗口底部找到關(guān)鍵跳轉(zhuǎn)的偏移地址(實(shí)際修改地址)。用ultraedit找到偏移地

址(實(shí)際修改地址)修改機(jī)器碼,保存!而用調(diào)試器也同樣簡(jiǎn)單,等會(huì)兒會(huì)詳細(xì)說(shuō)明。

道理廢話了那么多,來(lái)實(shí)例動(dòng)手說(shuō)明吧:

首先講解用W32Dasm來(lái)進(jìn)行爆破:

【軟件名稱】中華壓縮(ChinaZip)

【軟件版本】7.0

【文件大小】1041KB

[適用平臺(tái)】Win9x/Me/NT/2000

【軟件簡(jiǎn)介】ChinaZip(中華壓縮)是一款壓縮、解壓各種壓縮文檔的工具軟件,它支

持包括ZIP格式文件在內(nèi)的各種常見壓縮格式如:ARJ、CAB,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論