小小助手V2.01的破解過程-----算是我留給初學者的一偏破文 (7千字)

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

小小助手V2.01的破解過程
                                  作者:任逍遙[BCG]、[FCG]
軟體名稱:小小助手V2.01
軟體大小:  594 KB
軟體語言:  簡體中文
軟體類別:  國產軟體 / 共享版 / 個人管理
應用平臺:  Win95/98/NT/2000
軟體介紹:
本軟體具有定時提醒、通訊錄管理、日記管理三大功能,並設有密碼保護,初始密碼為:123。 1.定時提醒:可設定指定的日期、時間提醒您不要忘做某某事,如果該事沒有做,還可設定間隔多少分鐘重複提醒,並可選擇WAV、MIDI、以及MP3格式的檔案做為提醒時的音樂。因此,也可以把它作為定時點歌器。日期格式為:年-月-日 或 月-日,時間格式為:小時:分鐘:秒 或 小時:分鐘。要選擇MP3作為提醒音樂,必須安裝IE5.0及以上版本或媒體播放器。2.通訊錄管理:設有家庭電話、辦公電話、手機、E-mail、工作單位等多項內容,模糊查詢功能,只需輸入姓名、住址或電話前面的幾個字或號碼,即可查詢出相匹配的記錄。3.日記管理:可設定日記的背景顏色、字型格式,並可按日期進行查詢。4.密碼更改:按滑鼠右鍵,選擇密碼更改,即可進行密碼的更改。5.如果本軟體不能正常執行,請將midas.dll複製到windows\system目錄下。
下載地址:http://gd.skycn.net/down/little_assistant.zip
用FI檢測到該軟體加了殼,用Prodump將"little_assistant.exe"脫殼,另存為"dd.exe",執行"dd.exe",輸入:
使用者名稱:jack
註冊碼:7878
執行TRW2000,按CTRL+N啟用除錯視窗,輸入:
bpx hmemcpy
g
按"確定"後,除錯視窗被啟用,輸入:
bc *
pmodule
成功進入軟體領域,按F10跟蹤:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F2FD9(C)
|
:004F2FDB 00                      BYTE 0
:004F2FDC 55                      push ebp
:004F2FDD 8BEC                    mov ebp, esp
:004F2FDF 33C9                    xor ecx, ecx
:004F2FE1 51                      push ecx
:004F2FE2 51                      push ecx
:004F2FE3 51                      push ecx
:004F2FE4 51                      push ecx
:004F2FE5 51                      push ecx
:004F2FE6 51                      push ecx
:004F2FE7 51                      push ecx
:004F2FE8 53                      push ebx
:004F2FE9 56                      push esi
:004F2FEA 57                      push edi
:004F2FEB 8945FC                  mov dword ptr [ebp-04], eax
:004F2FEE 33C0                    xor eax, eax
:004F2FF0 55                      push ebp
:004F2FF1 68B9314F00              push 004F31B9
:004F2FF6 64FF30                  push dword ptr fs:[eax]
:004F2FF9 648920                  mov dword ptr fs:[eax], esp
:004F2FFC 8D45F4                  lea eax, dword ptr [ebp-0C]
:004F2FFF E8340DF1FF              call 00403D38
:004F3004 8D55F0                  lea edx, dword ptr [ebp-10]
:004F3007 8B45FC                  mov eax, dword ptr [ebp-04]
:004F300A 8B8004050000            mov eax, dword ptr [eax+00000504]
:004F3010 E8A7F7F3FF              call 004327BC
:004F3015 837DF000                cmp dword ptr [ebp-10], 00000000
//使用者名稱不能為空
:004F3019 0F8458010000            je 004F3177
//等於0就跳走
:004F301F 8D55F8                  lea edx, dword ptr [ebp-08]
:004F3022 8B45FC                  mov eax, dword ptr [ebp-04]
:004F3025 8B8004050000            mov eax, dword ptr [eax+00000504]
:004F302B E88CF7F3FF              call 004327BC
:004F3030 8B45F8                  mov eax, dword ptr [ebp-08]
//讀取使用者名稱長度
:004F3033 E8800FF1FF              call 00403FB8
:004F3038 8BF0                    mov esi, eax
:004F303A 85F6                    test esi, esi
//檢查長度是否為0
:004F303C 7E2A                    jle 004F3068
//小於或等於0就跳走
*******************************開始計算註冊碼***************************
:004F303E BF01000000              mov edi, 00000001
//賦值edi=1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F3066(C)
|
:004F3043 8B45F8                  mov eax, dword ptr [ebp-08]
//讀取使用者名稱長度
:004F3046 33DB                    xor ebx, ebx
//清0
:004F3048 8A5C38FF                mov bl, byte ptr [eax+edi-01]
//讀取第一個字元的10進位制ASCII碼,並將結果賦值給ebx
:004F304C 83C37B                  add ebx, 0000007B
//將ebx+123
:004F304F 8D55EC                  lea edx, dword ptr [ebp-14]
:004F3052 8BC3                    mov eax, ebx
//將ebx賦值給eax
:004F3054 E88364F1FF              call 004094DC
:004F3059 8B55EC                  mov edx, dword ptr [ebp-14]
:004F305C 8D45F4                  lea eax, dword ptr [ebp-0C]
:004F305F E85C0FF1FF              call 00403FC0
//這個CALL是對使用者名稱中的中文名進行處理,具體就是:如果ASCII碼+123< 0,就將edi-1
//(重新讀取該字元的ASCII碼,且第一次讀取的是高位ASCII碼,第二次的是低位ASCII碼)
//實現程式碼是:HighAscii=Int((65536 + bl) / 256)
//LowAscii=(65536 + bl) Mod 256
:004F3064 47                      inc edi
//edi+1
:004F3065 4E                      dec esi
//esi-1
:004F3066 75DB                    jne 004F3043
//迴圈讀取ASCII碼

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F303C(C)
|
:004F3068 8B45F4                  mov eax, dword ptr [ebp-0C]
:004F306B E8480FF1FF              call 00403FB8
:004F3070 83F80A                  cmp eax, 0000000A
//比較eax的長度是否為10
:004F3073 7E26                    jle 004F309B
//小於或等於10則跳走,直接與輸入的註冊碼比較;如果大於就進入下面的註冊碼處理程式
*************************讀取eax前10位數字******************************
:004F3075 8D45E8                  lea eax, dword ptr [ebp-18]
:004F3078 50                      push eax
:004F3079 B90A000000              mov ecx, 0000000A
:004F307E BA01000000              mov edx, 00000001
:004F3083 8B45F4                  mov eax, dword ptr [ebp-0C]
:004F3086 E83511F1FF              call 004041C0
:004F308B 8B55E8                  mov edx, dword ptr [ebp-18]
:004F308E 8D45F4                  lea eax, dword ptr [ebp-0C]
**************************將上面所得的10位數字&121**********************

* Possible StringData Ref from Code Obj ->"121"
                                |
:004F3091 B9D0314F00              mov ecx, 004F31D0
:004F3096 E8690FF1FF              call 00404004

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F3073(C)
|
:004F309B 8D55E4                  lea edx, dword ptr [ebp-1C]
:004F309E 8B45FC                  mov eax, dword ptr [ebp-04]
:004F30A1 8B8008050000            mov eax, dword ptr [eax+00000508]
:004F30A7 E810F7F3FF              call 004327BC
:004F30AC 8B55E4                  mov edx, dword ptr [ebp-1C]
//錯誤的註冊碼
:004F30AF 8B45F4                  mov eax, dword ptr [ebp-0C]
//正確的註冊碼
:004F30B2 E81110F1FF              call 004040C8
//比較
:004F30B7 0F85AE000000            jne 004F316B
//不等就跳走
OK,終於獲得了正確的註冊碼:2292202222121。輸入,按"確定",呵呵,"您已經註冊,感謝使用無超工作室的產品"。
VB序號產生器(可以支援中文名)
Private Sub Command1_Click()
Dim a, i As Long
Dim b, c, d, e, f
a = Len(Text1.Text)
If a <= 0 Then GoTo Err1
Label3.Caption = ""
Command2.Enabled = True
For b = 1 To a
c = Mid$(Text1.Text, b, 1)
f = Asc(c)
If f < 0 Then
d = (Int((65536 + f) / 256) + 123) & (((65536 + f) Mod 256) + 123)
Else
d = f + 123
End If
e = e & d
Next b
i = Len(e)
If i <= 10 Then GoTo Err2
Text2.Text = Mid$(e, 1, 10) & "121"
Exit Sub
Err1:
Label3.Caption = "請輸入使用者名稱!"
Exit Sub
Err2:
Text2.Text = ""
Text2.Text = e
End Sub

Private Sub Command2_Click()
Clipboard.Clear
Clipboard.SetText (Text2.Text)
Command2.Enabled = False
End Sub
***********************************************************

相關文章