|
論壇說明 | 標記討論區已讀 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2006-03-10, 06:52 AM | #1 |
榮譽會員
|
cracked 算法教學
算法教學
轉自:http://ocn.e5v.com/ 作者:冷血書生 掌握算法最基本的是用戶名取abcde,其相應ascii碼是61,62,63,64,65 (16進制),這些一定要牢記於心。你在各個偵錯軟體中所看到的暫存器值都是16進制的。切記不要見到 call就進入。若經過某個call,發現用戶名變成ABCDE,其ascii碼是41,42,43,44,45 (16進制),那麼此call的作用就是小寫轉大寫,再追入此call就顯得多此一舉了。 找到算法關鍵的一段循環或進入關鍵call,這時開始警覺,慢慢跟蹤,單步追蹤時時刻留意和觀察各個暫存器的變化,主要是eax,ebx,ecx,edx。下面一段是典型的計算註冊碼的循環。 由於OllyDbg的佈局設計,使用它觀察註冊算法比TRW更為清晰、流暢。 在某個暫存器中已存放著用戶名字串的個數 111111 movsx XXXX,XXXXX 依次取用戶名 ................. inc ecx ecx是計數器 ............... cmp xxxx,xxxx 比較用戶名是否取完 jl或jg 111111 沒有取完就跳回去取完就向下走 當你看到某個暫存器中61,62,63,64,65週期性出現時,就會發現循環開始了, 算法就在這一塊了,分析和檢查出它的算法流程吧,其實一切並不難 算法教學第二課 轉自:http://ocn.e5v.com/ 作者:冷血書生 如何快速找到 關鍵call關鍵jn,大家知道這是算法開始的關鍵,找到了等於成功了一半。 我的經驗是這樣的:首先看程序的程式碼的位置,比如0047A012,然後看CALL子程序的指向,假如指向的也是0047XXXX,那這個子程序應該是作者自己寫的,應該特別注意。但是假如指向的是0040XXXX,一般來說是系統級的子程序使用,比如取字串串長度,字串串比較。這樣的CALL就不用跟蹤進去了,只需要知道入口參數、出口參數基本就知道這個子程序的功能了。 不過,猜也不是辦法,最好能有這方面的資料。比如WINDOWS下的彙編手冊之類的。 例 Talisman 2.3 註冊算法分析(算法入門) 目的:給已經破解入門的朋友一些啟示,使其更快的學會算法! 輸入用戶名:powerboy(要記住啊!下面你就知道作用了啊!) 註冊碼任意:1234567890(我喜歡這樣因為這樣就能知道程序到底是取哪位註冊碼進行比較的啊!) 程序位址: http://www.skycn.com/download.ph ... t/down/talisman.zip 破解之前先介紹一些彙編指令: jle----的意思是說小於或等於0則跳; inc----每次加1,類似i++或i=i+1; dec----每次減1,類似i--或i=i-1; jnz----不為0則跳; 下斷點:BPX HMEMCPY 點擊註冊按鈕被攔到..... 按F12共N次來到下面........ 0047B5E8 E82787F8FF call 00403D14 0047B5ED 85C0 test eax, eax 0047B5EF 7E13 jle 0047B604 0047B5F1 BA01000000 mov edx, $00000001 0047B5F6 8B4DF8 mov ecx, [ebp-$08] 0047B5F9 0FB64C11FF movzx ecx, byte ptr [ecx+edx-$01] 0047B5FE 03F1 add esi, ecx 0047B600 42 inc edx 0047B601 48 dec eax 0047B602 75F2 jnz 0047B5F6 0047B604 8975EC mov [ebp-$14], esi 0047B607 DB45EC fild dword ptr [ebp-$14] 0047B60A E8B173F8FF call 004029C0 0047B60F 69C009030000 imul eax, eax, $00000309 0047B615 8BF0 mov esi, eax 0047B617 3B75FC cmp esi, [ebp-$04] 0047B61A 0F85BF000000 jnz 0047B6DF 0047B620 B201 mov dl, $01 ****下面我們來仔細解釋一下程序******************************************** 0047B5E8 E82787F8FF call 00403D14******************//這個CALL的作用是獲取用戶名長度,作為循環標誌; ----------------------------------------------------------------------------------------------------------------------- 為什麼是這樣哪!聽我來解釋: 當你走過call 00403D14的時候你就會發現EAX變顏色了,其值變了,如果你記住了你輸入的用戶名就會想出來了。EAX的值等於你輸入用戶名的長度,這就證明call 00403D14的作用是獲取用戶名的長度(這就是動態偵錯的好處了,不用分析就可以知道CALL的作用),這樣我們就可以不用分析這個CALL就可以知道這個CALL的作用了,是不是很方便啊!!!!!!!! ----------------------------------------------------------------------------------------------------------------------- 0047B5ED 85C0 test eax, eax******************//這句是比較EAX是不是為0 0047B5EF 7E13 jle 0047B604******************//jle的意思是說小於或等於0則跳 ----------------------------------------------------------------------------------------------------------------------- 這就證明這三句程序是獲取用戶名長度並比較用戶名長度是否為0,為0則跳.(如果跳了,就證明你沒輸入用戶名啊!對嗎?) ----------------------------------------------------------------------------------------------------------------------- 0047B5F1 BA01000000 mov edx, $00000001************//EDX=1;這裡是給EDX復初值為1 0047B5F6 8B4DF8 mov ecx, [ebp-$08]************//(ECX為用戶名)怎麼知道的呢!用D ECX 啊! 0047B5F9 0FB64C11FF movzx ecx, byte ptr [ecx+edx-$01] 0047B5FE 03F1 add esi, ecx 0047B600 42 inc edx***********************//EDX=EDX+1 0047B601 48 dec eax***********************//EAX=EAX-1 0047B602 75F2 jnz 0047B5F6 (此處是一個用戶名ASC值累加程序) ----------------------------------------------------------------------------------------------------------------------- 有破解基礎的人也許會問,這裡只是一個不等則跳的跳轉怎麼是說明將用戶名ASCII碼值累積相加的程序哪? 其實是這樣的,EAX=EAX-1 然後比較EAX不為0則跳,也就是說EAX每次都減1只道減到0為止,那麼就證明是一個循環並以EAX的值作為循環結束與否的標誌,用動態偵錯使用F10鍵就可以看出是個循環。 那麼我們來分析一下EAX是幹什麼用的呢!對了上面解釋了啊!EAX中儲存著用戶名的長度啊! ----------------------------------------------------------------------------------------------------------------------- 然後向跳轉的上面看啊! movzx ecx, byte ptr [ecx+edx-$01]//這句程序程式碼說明ECX按位取用戶名的ASCII碼值 (順便說一下程序中用戶名參與計算都是將用戶名變成ASCII碼值在參與計算的)動態偵錯就知道了啊!不信你注意看每次循環到這裡的時候ECX的值都會改變,是按怎麼樣的規律改變的呢!就是每進行一次循環都取一位用戶名字母的ASCII碼值; 下面,假設你的用戶名為 ABC 當你的游標第一次停在這裡時,你會發現ECX=00,再按一個F10,看 ECX 暫存器的值,以藍色高亮顯示,ECX 發生變化,變為0,結合movzx指令的解釋,可以理解為,從[eax+edx-01]取 0 送 ecx 。大家要學會觀察,高亮顯示表示上一步執行後的結果,結合上一行的彙編指令,就很容易理解。這是關鍵中的關鍵!!!!! 當你第2次來到這裡時,XXX 變成什麼?是41,41是16進制值,你在 SoftICE 中下 ? 41 (注意,TRW 2000 是沒有這項功能的!),看到 41 轉換成為字串"A",所以第二次循環在這裡是取字串"A"。同理,第3、4次分別取的是"B","C",當取完所有字串後,循環也準備結束了。既然它取你的用戶名各個字串進行了計算,所以,這段肯定是算法無疑了!!!!!!! (建議你破解軟體用sice因為用sice 的 ? eax 指令就可以將ASCII碼變回原形式,例如:eax=41;? eax;那麼就顯示eax="A"怎麼樣懂了嗎?) ------------------------------------------------------------------------------------------------------------------------ 最後,看0047B5FE 03F1 add esi, ecx************//這句是說ESI=ESI+ECX(如果這句都不懂我勸你該補習一下彙編的知識了) 在每次循環到這句的時候都用ESI+ECX並把值都儲存到ESI中,你說是什麼作用啊! ------------------------------------------------------------------------------------------------------------------------ 0047B604 8975EC mov [ebp-$14], esi*****************//這句是將ESI送入[EBP-14]我們設為A以後要用的,記住啊! 0047B607 DB45EC fild dword ptr [ebp-$14] 也就是說[EBP-14]中儲存著,我們用用戶名計算的值 * Reference to: system.@ROUND; | 0047B60A E8B173F8FF call 004029C0***********************//通過這句之後EAX=[EBP-14]等於我們之前計算所得的值 ------------------------------------------------------------------------------------------------------------------------ 這裡提醒大家對於能通過檢視暫存器的數值變化就可以知道該CALL作用的時候,就不用在F8跟進CALL中了,以減少破解的時間和工作量。並且有時候還看不太懂的。 ------------------------------------------------------------------------------------------------------------------------ 0047B60F 69C009030000 imul eax, eax, $00000309 ***********//EAX=EAX*0x309 這時EAX中就是我們上面計算所得的A (注意!這裡是十六進計算!) ------------------------------------------------------------------------------------------------------------------------ 這句程序的意思是,將上面計算所得的將用戶名累加的值,與常數Ox309相乘. ------------------------------------------------------------------------------------------------------------------------ 0047B615 8BF0 mov esi, eax***********************//ESI=EAX等於通過我們輸入的用戶名計算所得的數值 0047B617 3B75FC cmp esi, [ebp-$04]*****************//比較ESI和[EBP-04]中的值 ------------------------------------------------------------------------------------------------------------------------ 既然ESI儲存著用用戶名計算所得的數值,[EBP-04]就應該相應儲存著要與其比較的值會是什麼呢!用? *(EBP-04)看一下;果然儲存著我們輸入的註冊碼哈哈!!!那麼用用戶名計算所得的數值就是正確的註冊碼了啊!!(算法就是這麼簡單怎麼樣學會了嗎?) ------------------------------------------------------------------------------------------------------------------------ 0047B61A 0F85BF000000 jnz 0047B6DF **********************//不跳就成功,跳就失敗(爆破該這裡) 0047B620 B201 mov dl, $01 **********//這裡就是成功的標誌位,可能會和重啟效驗有關這裡就不介紹了! ************************************************************************************************************************** 既然已經分析完了算法,我們來進行一下手算測試: 我們以大寫的ABC為用戶名進行一下計算來驗證一下我們分析的算法是否正確! 首先,先查出A、B、C的ASCII碼值; "A"=41;"B"=42;"C"=43; 然後,根據算法將用戶名的ASCII碼值累加; 0x41+0x42+0x43=0xC6(用WINDOWS原有的的計算器就可以。但是,注意為十六進制計算啊!) 最後,根據算法將累加後的值與常數0x309相乘; 0xC6*0x309=0x258F6 看看258F6是不是正確的註冊碼啊! 嗯!!!!!!!!! 居然不是為什麼呢?在分析一下程序,原來比較的時候是用0x258F6和0x4996022D2(1234567890的十六進制數)進行比較的!那麼我們輸入的註冊碼就應該是0x258F6的十進制形式啊。 好了原因已經清楚了,計算吧!將0x258F6變一下形為153846(別告訴我你不會變,我倒!用windows原有的的計算器啊!) 在次輸入哈!^_^正確了吧! -------------------------------------------------------------- keymake 編寫註冊機源碼 .data szHomePage db "http://www.1699.net/bbs/list.asp?boardid=72",0 szEmail db "mailtoowerboy_bcg@163.com",0 szErrMess db "輸入的序列號不正確!",0 szdec db "%1u",0 hShow db 30 dup(0) .code MOV ESI,EAX invoke lstrlen,esi XOR EBX,EBX XOR ECX,ECX XOR EDX,EDX XOR EDI,EDI MOV EDX,1 begin: MOVZX EBX, byte ptr [ESI+EDX-1] ADD EDI,EBX INC EDX CMP EDX,EAX JLE begin MOV EAX,EDI IMUL EAX,EAX,309h PUSH EAX PUSH OFFSET szdec PUSH OFFSET hShow CALL wsprintf LEA EAX,hShow |
__________________ |
|
送花文章: 3,
|