I am Back :) 貼個安裝程式的破解
最近因為一些非自然、極端的因素,上不了網,快想瘋你們了 ^_^
這個軟體是半個月前一朋友幫忙讓看的,一別半月偶也不想啊,呵呵,今天才又重新做到愛機前,過意不去過意不去...
SoftName:上網記錄生成器v1.1
這個軟體在安裝時要求輸入安裝密碼,而密碼只有在使用者註冊後才能在軟體作者處得到。
我也很少動過安裝程式的,but我會說的儘量詳細一些
常見一點兒的安裝程式是Installshield的,看雪以往的教程中都有講,有空的話可以看一下。而偶今天遇到的這個不知道名字應該怎麼叫。看初始化的時候顯示的是Wise
Installation,哪位老哥出來講一下官方的名字應該是什麼? :> 總知這個安裝程式也很常見到的。你可以到網上把偶貼的這個軟體拉下來看一下嘛 ^_^
好的,你需偵錯程式一個,TRW2000或SoftICE。我用的是TRW2000。
執行這個名為lcinstall.exe的安裝程式,在輸入了一些路徑資訊後當程式要開始安裝的時候會提示你輸入安裝密碼。
我們先來隨便輸入一個,我輸入的是Suunb[CCG],接下來就會提示你出錯。別甚著了,請偵錯程式出場吧,Ctrl+N撥出TRW2000,接下來下斷點。我是在98下,所以用bpx
hmemcpy來做斷點。下完斷點後再點確定馬上就會被攔到,pmodule跳回領空居然跳飛了,呵呵,那再來一遍吧。再次用bpx hmemcpy做斷點。這次斷到後來按F12,在按了34下後會再次提示出錯。那我們就重頭再來一遍吧
:) (要有耐心) 這次按33下後改按F10,一下後我們會來到這裡:
0167:10014318 cmp
eax,byte +02 <--我們會來到這裡!
0167:1001431b
jz 1001434b
0167:1001431d push dword
[10026854]
0167:10014323 push edi
0167:10014324
call 100121b4 <--這個CALL後會將你輸入的密碼裝入eax指向的記憶體地址處
0167:10014329 push dword [10026854]
0167:1001432f
call 10014350 <--這個CALL就是關鍵所在,伊拉克戰勢的結果就由它來決定了
^_^
0167:10014334 add esp,byte +0c
0167:10014337
test eax,eax <--測試eax,而eax中的值由上面1001432f處的CALL決定
0167:10014339 jnz near 10014291
<--這個跳轉很關鍵哦,從這裡跳到10014291後你在哪兒動什麼手腳意義都不大了,所以我們還是要在這裡動動手腳 :)
0167:1001433f
and dword [100269bc],byte -02
0167:10014346 xor
eax,eax
0167:10014348 pop edi
0167:10014349 pop esi
0167:1001434a ret
上面的流程很清楚嘛,在1001432f處的CALL中程式會對所輸入的密碼做比較,如果正解的話eax就會被置0返回。那還等什麼呢?我們進去吧
^_^
這次可以直接用bpx 1001432f來做斷點,斷到後直接按F8跟進:
0167:10014350 test
byte [100269bc],01
0167:10014357 push ebx
0167:10014358 push ebp
0167:10014359 push
esi
0167:1001435a push edi
0167:1001435b
jz 100143ce
0167:1001435d push dword
[esp+14]
0167:10014361 call 10019017
0167:10014366
pop ecx
0167:10014367 mov ebx,eax
0167:10014369 mov ecx,[100268dc]
0167:1001436f
cmp ebx,ecx
0167:10014371 jl
near 10014424
0167:10014377 mov esi,[100266f4]
0167:1001437d cmp ebx,esi
0167:1001437f
jg near 10014424
0167:10014385 mov
eax,esi
0167:10014387 sub eax,ecx
0167:10014389
inc eax
0167:1001438a test byte [100269bc],02
0167:10014391 jz 10014395
0167:10014393
add eax,eax
0167:10014395 cdq
0167:10014396 idiv dword [10026710]
0167:1001439c
mov edi,ecx
0167:1001439e mov
ebp,eax
0167:100143a0 lea eax,[ecx+ebp]
0167:100143a3
mov [10026860],eax
0167:100143a8 cmp
edi,esi
0167:100143aa jg 10014424
0167:100143ac
cmp edi,ebx
0167:100143ae jz
10014420
0167:100143b0 test byte [100269bc],02
0167:100143b7
jz 100143ca
0167:100143b9 push ebp
0167:100143ba call 1001442c
0167:100143bf mov
esi,[100266f4]
0167:100143c5 pop
ecx
0167:100143c6 add edi,eax
0167:100143c8
jmp short 100143a8
0167:100143ca add
edi,ebp
0167:100143cc jmp short 100143a8
0167:100143ce mov eax,[1002669c]
0167:100143d3
mov edi,[esp+14]
0167:100143d7 xor
ebx,ebx
0167:100143d9 xor esi,esi
0167:100143db
cmp [eax],bl
0167:100143dd jz
10014416
0167:100143df cmp [esi+edi],bl
0167:100143e2
jz 10014416
0167:100143e4 mov
al,[eax+esi] <--上面那些意義不大,直接從這裡開始說吧 ^_^ 此時eax+esi中放的便是正確的密碼,不過是被處理過的“密文”,密碼是一位一位來進行比較的,當前位裝入al中
0167:100143e7 not al
<--al做取反,什麼跟什麼嘛,這樣就得到正確的密碼了,衰!
0167:100143e9
movzx eax,al <--霸佔整個eax :)
0167:100143ec push eax
<--eax入棧
0167:100143ed call 10019122
<--將字元轉換為大寫
0167:100143f2 mov ebp,eax
<--裝eax裝入ebp中
0167:100143f4 movsx
eax,byte [esi+edi] <--esi+edi中裝的是你輸入的密碼,得到當前參加比較的字元
0167:100143f8 push eax
<--入棧
0167:100143f9 call 10019122
<--也是將其轉換為大寫字元
0167:100143fe pop ecx
<--在ecx中也複製一份
0167:100143ff cmp
ebp,eax <--比較正確的密碼與你輸入的密碼的相應位是否相等
0167:10014401 pop ecx
<--ecx還原
0167:10014402 jnz 10014411
<--不相等就跳到10014411處
0167:10014404 mov
eax,[1002669c] <--正確密碼的地址再次裝入eax中
0167:10014409
inc esi <--esi加1,用來比較下一個字元
0167:1001440a cmp [eax+esi],bl <--eax+esi是否為0,也就是看密碼是否比較完畢
0167:1001440d jnz 100143df
<--沒比較完就跳到上邊兒接著比較下一位
0167:1001440f jmp
short 10014416 <--完了跳到10014416處
0167:10014411 mov
eax,[1002669c]
0167:10014416 cmp [eax+esi],bl
<--是否等於bl中的值?
0167:10014419 jnz 10014424
<--不是就跳
0167:1001441b cmp
[esi+edi],bl <--是否等於bl中的值?
0167:1001441e jnz
10014424 <--不是就跳
0167:10014420
xor eax,eax <--嗚嗚嗚…能來到這裡感覺真好
0167:10014422 jmp short 10014427 <--直接跳到10014427處,eax此時為0
0167:10014424 push byte +01
0167:10014426 pop
eax
0167:10014427 pop edi
0167:10014428
pop esi
0167:10014429 pop ebp
0167:1001442a pop ebx
0167:1001442b
ret
明白過來了嗎?程式透過對你輸入的密碼與正確的密碼進行一位一位的比較,來確定你輸入的密碼是否正確。而這個正確的密碼並不是使用的明文,而是被處理過後的密文。說實話這密文也真夠遜的…
^_^ 程式透過對密文進行取反操作來得到正確的密碼,之後再將其轉換為大寫字元。而你輸入的密碼也會被轉換為大寫後與其比較,如果相等就接著比較下一位,直到所有的字元都被比較過了…
呵呵,不難吧,你可以自己寫個小程式來對密文進行取反後再轉換為字串,不過我覺的沒有那個必要了。呵呵,我們可以100143f2處的時候記下程式自己計算出來並轉換為大寫了的字元的ASCII碼,然後到了10014402處用r
fl z指令來阻止程式跳走,接著程式便會計算正確密碼的下一位的值,同樣到了100143f2處的時候把它的ASCII碼記下,然後就一直這樣,直到正確密碼的所有字元都計算出來為止,當然前提條件是你也得輸入一個長度有夠長的密碼,所以我把把Suunb[CCG]換為aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa了,呵呵,只要長度夠了就行了,程式根本就不管具體的位數,它只管正確密碼的各位都已經比較過沒有
:)
用了N個r fl z指令後得到的正確密碼的ASCII碼分別是:
42 38 44 32 59 36 54 39 48 54 54
50 3A 2F 2F 57 57 57 2E 57 45 4E 58 49 4E 2E 4E 45 54
轉換為相應的字元就是:B8D2Y6T9HTTP://WWW.WENXIN.NET
the end.