寫給想入門的朋友,侃侃自己的破解心得。

看雪資料發表於2015-11-15

標 題:寫給想入門的朋友,侃侃自己的破解心得。  

發信人:008nfs

時 間:2003/07/22 00:19am

詳細資訊:



破解 CD to MP3 Maker

除錯環境:win98se
破解工具:SoftICE,win32dasm黃金版
難度:比較簡單
軟體沒有加殼,用win32dasm載入,在串式參考中可看到許多有用資訊
執行軟體,進入註冊視窗,註冊名處填008liwei(任意),註冊碼處填123456789(任意)
現在用 Ctrl-d  調出softice,bpx hmemcpy, 然後按F5退出ICE,點選註冊按鈕,被ICE攔截,鍵入bd 0 關閉斷點狂按F12,按到第13下時,彈出錯誤視窗,重新開啟ICE按照上面的步驟,這回狂按12下F12,程式碼停留在下面的地方

:0041171E 6A01                     push 00000001
...........一邊下d命令一邊看暫存器視窗的值,發現並無有用資訊,所以這兒的程式碼略
...........
:00411791 8D4C2438                lea ecx, dword ptr [esp+38] --------在此鍵入  d  ecx,資料視窗中發現008liwei,說明要進入雷區了
:00411795 51                      push ecx                    --------將註冊名008liwei壓入堆疊儲存起來
:00411796 8D4C241C                lea ecx, dword ptr [esp+1C]
:0041179A E877EC0100              call 00430416
:0041179F 8B542410                mov edx, dword ptr [esp+10]
:004117A3 8B07                    mov eax, dword ptr [edi]    --------此處eax內容為008liwei

* Reference To: KERNEL32.WritePrivateProfileStringA, Ord:027Fh --------準備將使用者名稱008liwei寫入"c:\windows\repenc.ini"檔案中
                                 |
:004117A5 8B1DB49A4500            mov ebx, dword ptr [00459AB4] --------此處edx內容為"c:\windows\ripenc.ini"
:004117AB 52                      push edx                      
:004117AC 50                      push eax                      ---------                                                                   eax=008liwei

* Possible StringData Ref from Data Obj ->"Name"
                                 |
:004117AD 68FCC44400              push 0044C4FC                 ----------將字元"name"儲存

* Possible StringData Ref from Data Obj ->"Mp3Option"
                                 |
:004117B2 6844C34400              push 0044C344                  ---------將字元"mp3option"儲存
:004117B7 FFD3                    call ebx                      ---------將註冊名資訊寫入檔案
:004117B9 8B4C2410                mov ecx, dword ptr [esp+10]   ---------ecx為字元"c:\windows\ripenc.ini"
:004117BD 8D542438                lea edx, dword ptr [esp+38]   ---------鍵入d edx  內容為"008liwei"
:004117C1 51                      push ecx

* Possible Reference to Dialog: DialogID_00D2, CONTROL_ID:00FF, ""
                                 |
:004117C2 68FF000000              push 000000FF
:004117C7 52                      push edx
:004117C8 686C3C4500              push 00453C6C

* Possible StringData Ref from Data Obj ->"Name"
                                 |
:004117CD 68FCC44400              push 0044C4FC

* Possible StringData Ref from Data Obj ->"Mp3Option"
                                 |
:004117D2 6844C34400              push 0044C344
:004117D7 FFD5                    call ebp

      -------注意了!雷區就在眼前,不怕死的跟我來 >:-()------

                       
:004117D9 8B07                    mov eax, dword ptr [edi]    -------d eax 內容為"008liwei"  ):-()好兄弟夠義氣,怎麼?只有你一個人  ~@#$%^&*
:004117DB BA01000000              mov edx, 00000001           -------將edx置入1
:004117E0 8B48F8                  mov ecx, dword ptr [eax-08] -------將註冊名個數8放入ecx中
:004117E3 33C0                    xor eax, eax                -------將eax清零
:004117E5 85C9                    test ecx, ecx               -------檢查註冊名個數是否為零
:004117E7 7E0C                    jle 004117F5                -------當為零時跳到004117F5繼續執行,當然不會跳轉

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004117F3(C)
|
:004117E9 0FBE6C0438              movsx ebp, byte ptr [esp+eax+38]  -------在此處鍵入d esp+38   發現資料視窗中為"008liwei"   在暫存器視窗中可看見eax=00000
000     由組合語言知識可知此處程式碼的意思是將"008liwei"的第一個字元的十六進位制數送入ebp中.由於第一個數是0,所以將會把30這個數放入ebp中
:004117EE 03D5                    add edx, ebp                      -------將30(ebp的值)+1(edx的值)放入edx中
:004117F0 40                      inc eax                           -------eax自動加1
:004117F1 3BC1                    cmp eax, ecx                      -------由於ecx的值是註冊名個數8,所以這句的實際意思是判斷註冊名每位數是否都進行了上面的運算
:004117F3 7CF4                    jl 004117E9                       -------如果沒有則跳到004117E9處,依次進行第2,3,4,5,6,7,8位的計算,直至計算完成,所以在此處要迴圈7次,方能執行下面的程式碼

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004117E7(C)
|
:004117F5 8BC2                    mov eax, edx                      -------此時的edx值為: 30(註冊名第一位)+1+30(第二位)+38(第三位)+6c+69+77+65+69=2B3 所以eax=2B3
:004117F7 C1E006                  shl eax, 06                       -------將eax的值乘以2的6次方  eax=ACC6
:004117FA 03C2                    add eax, edx                     -------
                                                      eax=eax+edx=ACC6+2b3=AF73
:004117FC 8D0CC0                  lea ecx, dword ptr [eax+8*eax]    -------   ecx=AF73(eax)*8+AF73(eax)=62b0b   鍵入 ?ecx 可看到此值
:004117FF 8DAC8A155E0100          lea ebp, dword ptr [edx+4*ecx+00015E15]  --------ebp=62b0b(ecx)*4+2b3(ebx)+15e15=1a0cf4  你將會在後面發現它的十進位制數就是正確的註冊碼
:00411806 8D4C241C                lea ecx, dword ptr [esp+1C]
:0041180A E874E90100              call 00430183
:0041180F 8B86A0030000            mov eax, dword ptr [esi+000003A0] --------暫存器視窗中eax=75bcd15
:00411815 C684244002000004        mov byte ptr [esp+00000240], 04
:0041181D 3BE8                    cmp ebp, eax                      --------下?ebp可在命令視窗看見1707252  下?eax同樣可看到123456789   由這可知4117ff處的數為正確的註冊碼
:0041181F 756C                    jne 0041188D                      --------命運現在掌握在你的手中  下r fl z 改變標誌位不叫它跳,跳則Game Over
:00411821 8B542410                mov edx, dword ptr [esp+10]
:00411825 8B07                    mov eax, dword ptr [edi]
:00411827 52                      push edx
:00411828 50                      push eax

* Possible StringData Ref from Data Obj ->"Name"
                                 |
:00411829 68FCC44400              push 0044C4FC

* Possible StringData Ref from Data Obj ->"Mp3Option"
                                 |
:0041182E 6844C34400              push 0044C344
:00411833 FFD3                    call ebx
:00411835 8B8EA0030000            mov ecx, dword ptr [esi+000003A0]
:0041183B 8D542424                lea edx, dword ptr [esp+24]
:0041183F 51                      push ecx

* Possible StringData Ref from Data Obj ->"%d"
                                 |
:00411840 6854C44400              push 0044C454
:00411845 52                      push edx
:00411846 E845910000              call 0041A990
:0041184B 83C40C                  add esp, 0000000C
:0041184E 8D442424                lea eax, dword ptr [esp+24]
:00411852 8D4C241C                lea ecx, dword ptr [esp+1C]
:00411856 50                      push eax
:00411857 E8BAEB0100              call 00430416
:0041185C 8B4C2410                mov ecx, dword ptr [esp+10]
:00411860 8B54241C                mov edx, dword ptr [esp+1C]
:00411864 51                      push ecx
:00411865 52                      push edx

* Possible StringData Ref from Data Obj ->"Code"
                                 |
:00411866 68F4C44400              push 0044C4F4

* Possible StringData Ref from Data Obj ->"Mp3Option"
                                 |
:0041186B 6844C34400              push 0044C344
:00411870 FFD3                    call ebx
:00411872 6A00                    push 00000000

* Possible StringData Ref from Data Obj ->"congratulation!"
                                 |
:00411874 683CD04400              push 0044D03C

* Possible StringData Ref from Data Obj ->"You have registered.Please quit "
                                       ->"and execute it again!"
                                 |
:00411879 6804D04400              push 0044D004
:0041187E 8BCE                    mov ecx, esi
:00411880 E8592F0200              call 004347DE  ------------(:-)好兄弟!我們透過雷區了~~~ 人怎麼不見了?哇!你怎麼跑到下面去了!oh my God!
:00411885 3BAEA0030000            cmp ebp, dword ptr [esi+000003A0]
:0041188B 7429                    je 004118B6

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041181F(C)
|
:0041188D 6A00                    push 00000000   -----------
                                              <You are terminated. blaste>
                   ------<I will be back>--------

演算法總結:設註冊名對應的正確註冊碼為x,則
         1)a=註冊名的每一位(hex)相加再+1
         2)b=a*2^6+a
         3)c=b+b*8
         4)x=c*4+a+15E15

序號產生器:
在TC2.0下透過
#include "math.h"
#include "stdio.h"
main()
{
char name[50];int i,n=0,m;
unsigned long int b,a,c,d;
printf("========================\n");
printf("CD to MP3 1.15 Keygen\n");
printf("Made by 008liwei \n");
printf("2003.7.25\n");
printf("========================\n");
printf("\n");
printf("Pleaes enter your name:");
scanf("%s",name);
m=strlen(name);
for(i=0;i<=m;i++)
 {n=n+name[i];}
  n=n+1;
b=pow(2,6);
a=n*b+n;
c=a+a*8;
d=c*4+n+89621;
printf("Your registration code is %ld\n",d);
printf("Thanke You !!");
getch();
}

請大家多多指教!!

   我是一個初學者,這是我的第一篇文章,錯誤一定大大的有,意見也請多多的提。我很希望得到你們的指導和幫助。在這裡我先請教一個問題:從4117c1到4117d7處,程式在幹什麼?我怎麼看不懂,還有411806處?

學破解也有一年了,想談一點點自己的學習心得:
   回想第一次認識破解,是在無意中發現光碟中的《看學論壇精華III》,平時也用過破解補丁或者序號產生器什麼的,卻從沒有想過它們是怎麼做出來的,但看過了《論壇精華》序言後,就立刻產生了濃厚的興趣,雖然當
時還看不懂各位前輩寫的文章(當然現在有的也看不懂 :-> ) ,但是興趣已經有了,所以立刻就到書店買了看雪老師編的《加密與解密-軟體保護及完全解決方案》,這本書的確不錯,內容由淺入深使我瞭解了許多,比如:什麼是暫存器,什麼是API,PE檔案格式是什麼東西,把我從軟體的表層帶進了它的核心 ……,這些都是原來不可想象的。所以在這裡我建議想學破解的朋友,一定要看此書。
   我認為學破解並不只是一味地找軟體破軟體,而是當你破解的時候,會發現需要用到方方面面的知識,比如組合語言(當然這是基礎),windowsAPI,登錄檔,計算機程式設計(做序號產生器)……,所以我感覺不應為了破解而去破解,而應在這一過程中學習更多其他方面的電腦知識,我已受益匪淺,不知大家是否有同感?

好了,就現寫到這兒。我的文筆不怎麼樣,湊活著看吧!:-)  最後謝謝各位看完我的文章。

Email:008liwei@sina.com
QQ:3236738


相關文章