I am Back :) 貼個安裝程式的破解 (6千字)

看雪資料發表於2003-04-06

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.

相關文章