寫給想入門的朋友,侃侃自己的破解心得。
標 題:寫給想入門的朋友,侃侃自己的破解心得。
發信人: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
相關文章
- 寫給正在找工作的朋友2009-01-10
- 寫給自己看的Typescript起步2019-02-12TypeScript
- 一個阿里工作4年java程式設計師的從業心得,寫給還在迷茫的朋友2018-09-30阿里Java程式設計師
- 寫給自己看的 Git 命令指北2019-02-26Git
- 寫給自己看的面試題整理2019-02-26面試題
- 寫給自己看的 Flex 佈局2019-04-27Flex
- 寫給自己的python基礎2020-11-30Python
- 寫給新入行的程式設計師小朋友2021-10-03程式設計師
- 寫給想學網頁設計的朋友們2010-12-20網頁
- 面試物語:寫給正在找工作的年輕朋友2011-03-29面試
- 寫給小白的pySpark入門2021-09-09Spark
- 寫給自己看的三欄佈局的演示2019-02-27
- 寫給自己的分塊上傳檔案2018-08-17
- 寫給程式設計師:當自己的上帝2014-05-16程式設計師
- caijhoo:寫給十年後的自己(一)2015-07-28AI
- 寫給經常需要ghost linux系統的朋友(轉)2007-08-11Linux
- 寫給新手的MySQL入門指南2018-11-12MySql
- 寫給mybatis小白的入門指南2018-02-27MyBatis
- 寫給自學者的入門指南2017-08-14
- 寫給自己看的在 Vue 下使用 Typescript 指北2019-02-26VueTypeScript
- 寫給自己的git多人開發最佳實踐2021-07-14Git
- 寫給自己,2020的年終總結2020-12-30
- 寫最少的程式碼,避免給自己找麻煩2012-07-09
- 寫最少的程式碼 避免給自己找麻煩2012-07-11
- 寫在學習前-給自己2017-02-08
- 最簡短的話,寫給身邊的程式設計師朋友吧2020-06-03程式設計師
- 寫給自己看的木偶元件和智慧元件的啟示2019-02-27元件
- 寫給自己看的Linux運維基礎(三) - Mono2013-07-11Linux運維Mono
- 寫給自己看的釋出react靜態資源的方法2019-02-26React
- Oracle的入門心得2005-03-21Oracle
- Floyd演算法——寫給自己(粗略)2017-10-16演算法
- 寫給新人的React快速入門手冊2017-12-08React
- 寫給自己看的體重記錄板使用指南2019-02-26
- 寫給步入三十的自己,2023年終總結!2023-11-30
- PHP入門教程之編寫自己的PHP框架2017-06-04PHP框架
- 我的破解心得(1) (3千字)2001-03-13
- 我的破解心得(5) (16千字)2001-03-13
- 我的破解心得(6) (3千字)2001-03-13