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

下載本文檔

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

文檔簡介

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

第一章一前言到第九章

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

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

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

課后FAQ

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

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

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

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

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

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

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

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

都奇丑無比,呵呵,有了頭腦就沒了長相,男的也是這樣,而且越是高手,長的就是越丑。

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

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

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

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

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

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

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

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

是要積累的,你知道自己不會(huì)卻不去學(xué),而在那兒問重不重要,人家會(huì)覺的你這個(gè)人并不想

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

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

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

Q:學(xué)破解對我來說有什么好處?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

既然計(jì)算機(jī)只識別。和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í),你是不是覺得看這些東西,有些那個(gè)?

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

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

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

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

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

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

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

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

譯等”)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(以下為第二次修改時(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è)硬物匕了

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

先,介紹通用寄存器。

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

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

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

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

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

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

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

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

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

不怎么漂亮:

高十六位EAXAHAXAL

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

是后進(jìn)先出。你在腦子里想象下這個(gè)這程。有沒有想明白,民工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ù),均是*

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

子吧:

CmpEAX,EBX;用EAX與EBX相減

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

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

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

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

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

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

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

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

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

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

所以,我們知道就行了。

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

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

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

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

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

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

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

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

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

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

Xora,a異或操作,主要是用來將a清空

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

PUSH壓棧

POP出棧

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

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

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

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

DIV無符號除法指令格式: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無作用,可以用來抹去相應(yīng)的語句,這樣的話,嘿嘿嘿…

CALL調(diào)用子程序,你可以把它當(dāng)作高級語言中的過程來理解。

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

JE或JZ若相等則跳

JNE或JNZ若不相等則跳

JMP無條件跳

JB若小于則跳

JA若大于則跳

JG若大于則跳

JGE若大于等于則跳

JL若小于則跳

JLE若小于等于則跳

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

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

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

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

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

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

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

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

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

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

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

來表示數(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?

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

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

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

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

應(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ìn)制來表示就可以了:

例:1000101000110101

8A35

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

例:AB10

1010101100010000

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

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

各位十六進(jìn)制數(shù)與其對應(yīng)權(quán)值的乘積之和即為與此十六進(jìn)制數(shù)相對應(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)制

我還是只講最簡單的除法:

把要轉(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

通過以上的介紹,我不知道你到底看懂沒有,如果有的話,請你去看一下書本,把我沒

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

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

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

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

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

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

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

課后FAQ

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

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

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

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

優(yōu)勢。

Q:匯編對我來說不成問題,可我為什么總是不上手呢?

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

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

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

成了。

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

A:總的來說,也行。不過希望匯編的學(xué)習(xí),不會(huì)使你丟掉學(xué)習(xí)其它高級語言的信心。:)

答網(wǎng)友問

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

意的寄存器么?

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

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

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

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

例如:

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

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

或EAX或EDX:EAX則用來裝最后的積。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

〈本章完>

第三章一Windows程序

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

部分的用戶群。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

以及MFC的朋友也許會(huì)說我根本沒有調(diào)用什么API?。∑鋵?shí)這些API都是由你所用的開發(fā)

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

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

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

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

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

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

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

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

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

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

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

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

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

GetModuleHandle注冊窗口類用RegisterClass或RegisterClassEx;注冊后,還要用

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

不止是API而以了。

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

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

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

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

MessageBox顯示一信息對話框

MessageBoxEx顯示一?信息對話框

MessageBoxIndirect顯示一定制信息對話框

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

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

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

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

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

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

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

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

(軟件可以用這兩個(gè)來判斷軟件是否過期)

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

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

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

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

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

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

員手冊。

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

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

它就是hmemcpy。

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

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

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

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

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

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

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

使用了。

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

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

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

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

本章補(bǔ)遺:

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

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

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

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

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

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

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

種I■殼」給加密了。

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

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

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

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

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

****W*W***

第五章-破解原理

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

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

初級,修改程序,用ultraedit等工具修改exe文件,稱暴力破解,簡稱爆破

中級,追出軟件的注冊碼

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

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

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

入的,跟它通過用戶名(或其它)算出來的注冊碼相等的話(也就是說用戶輸入的注冊碼正

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

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

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

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

no.l

在某軟件中,這樣來進(jìn)行注冊:

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

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

功處,即004572E6處)

0045XXXXYYYYYYYYYY

XXXXXXXXYYYYYYYYYY

XXXXXXXXYYYYYYYYYY

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

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

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

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

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

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

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

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

失敗部分。

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

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

話,你輸入的注冊碼無論正確與否。都可以注冊成功。

no.2

我們再來講一下另外的一種情況:

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

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

向失敗處,即004572E6處)

0045XXXXYYYYYYYYYY

XXXXXXXXYYYYYYYYYY

XXXXXXXXYYYYYYYYYY

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

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

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

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

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

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

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

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

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

注冊了。

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

所說的工具的使用方法)

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

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

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

物理地址(RAWoffset)o

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

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

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

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

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

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

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

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

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

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

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

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

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

改為Nopo

由于本章只講原理,具體--點(diǎn)的。如怎樣找到關(guān)鍵跳轉(zhuǎn)等,我們在下一章中再講。

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

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

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

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

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

過你無需懼怕。

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

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

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

據(jù)先放到一個(gè)地方,CALL過去的時(shí)候再從這些地方把先前放入的數(shù)據(jù)取出來,進(jìn)行相應(yīng)的

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

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

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

了,我說過不難的。

下面列出兩個(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è)注冊碼分別放入eax和edx中,你只要

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

no.2

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

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

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

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

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

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

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

最后,再來說最后的所謂的高級階段,如果你相信自己。并且熱愛Crack,那么你一定

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

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

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

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

我們下下下一章再說。

第六章-爆破軟件

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

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

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

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

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

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

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

式參考中找到錯(cuò)誤提示信息或可能是正確的提示信息雙擊鼠標(biāo)左鍵來到相應(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)試器也同樣簡單,等會(huì)兒會(huì)詳細(xì)說明。

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

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

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

【軟件版本】7.0

【文件大小】1041KB

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

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

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

溫馨提示

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

評論

0/150

提交評論