【原創】製作AUTOcad2002網路版的Flexlm license 時的另類pediy,純粹是玩,高手略過!

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

製作AUTOcad2002中文網路版的Flexlm license 時的另類pediy,純粹是玩!

軟體名稱: AUTOcad2002中文網路版
應用平臺: Win2000
軟體類別: 地球人都知道
軟體介紹: 地球人都知道 Flexlm7.1f加密 
破解工具: ollydbg 1.10(Fly修改版) ,w32Dasm_2002828_pll621,UltraEdit10.0,c32asm ,剩餘空間檢視器,PEditor
破解目的: 1.自動儲存“製作無限制使用license檔案的關鍵資料”到指定檔案 
           2.練習diy PE
           3.熟悉暫存器的使用,如eax,[eax]....等,順便說一下心得。

破解過程:

通過這篇文章我們將向你介紹暫存器的使用的一些心得,如eax和[eax]區別,以及使用時方法,其實我也是剛明白
至於如何製作FlexLm的license見|http://bbs.pediy.com/showthread.php?s=&threadid=6562|,當然有些重複的我省略了

一、查詢關鍵的存放位置――――準備工作

廢話少說,接上回,我們找到了關鍵地方如下:

程式碼:
* Referenced by a CALL at Addresses: |:00945490   , :0094C1EA   , :0094C7B0   , :0096383C   , :00971159    |:00985C14    | :0094DB50 55                      push ebp    <====先在這個地方下斷 :0094DB51 8BEC                    mov ebpesp :0094DB53 83EC30                  sub esp, 00000030 :0094DB56 C745F08EB94876          mov [ebp-10], 7648B98E   <====這個數在確定l_sg函式上很有用 :0094DB5D C745EC03000000          mov [ebp-14], 00000003 :0094DB64 8B4508                  mov eaxdword ptr [ebp+08] :0094DB67 8B486C                  mov ecxdword ptr [eax+6C] :0094DB6A 8B91D4010000            mov edxdword ptr [ecx+000001D4] :0094DB70 81E200800000            and edx, 00008000 :0094DB76 85D2                    test edxedx :0094DB78 7423                    je 0094DB9D   :0094DB7A 833DC4DAB50000          cmp dword ptr [00B5DAC4], 00000000 :0094DB81 741A                    je 0094DB9D :0094DB83 8B4510                  mov eaxdword ptr [ebp+10] :0094DB86 50                      push eax :0094DB87 8B4D0C                  mov ecxdword ptr [ebp+0C] :0094DB8A 51                      push ecx :0094DB8B 8B5508                  mov edxdword ptr [ebp+08] :0094DB8E 52                      push edx :0094DB8F FF15C4DAB500            call dword ptr [00B5DAC4] <====在這個地方下斷,之後就是我們要的! :0094DB95 83C40C                  add esp, 0000000C   <====我們修改這個地方 :0094DB98 E913010000              jmp 0094DCB0


這時執行,中斷在0094DB50後,我們下,下面這些資料就是我們計算seed1和seed2的關鍵!
*************************

輸入 d [esp+8]
********

0012F608  00000004
0012F60C  1731E48D     data[0]
0012F610  061711DA     data[1] 

0012F614  A3A37979
0012F618  CC926A64
0012F61C  A1136749
0012F620  F174A41F
0012F624  00000000

輸入d [esp]
***********

0131B660  00000066
0131B664  0073001F  
0131B668  AEF0D6A0   job+08
0131B66C  A21343D5   job+0c
0131B670  C156EC2E   job+10 

0131B674  00000000

我們來儲存data[0],data[1],job+08,job+0c,job+10這5個資料到檔案!
我們不講為什麼是這5個資料(其實我也一知半解),我們只是用它來講解!
**********
首先我們來看esp和[esp]區別。輸入d esp和d [esp]你會看到資料視窗不同,廢話!
d esp你會看到一個地址,而他的內容或者說"值"就是"0131B660" !
就是說esp是指向地址"0131B660"
而地址0131B660的值是"00000066", 
d [esp] 顯示的就是esp的值作為地址所指向地址0131B660的值!
比如你d 0131B660就和d [esp]是同樣的結果.
***********
而我們需要儲存的是0012F60C,0012F610,0131B668,0131B66C,0131B670地址的值
對應的就是:
0012F60C ==[esp+8]+4
0012F610 ==[esp+8]+8
0131B668 ==[esp]+8
0131B66C ==[esp]+0c
0131B670 ==[esp]+10


為了容易理解,我們用上面的來表示,當然這是不規範的!

我們的思路:把以上5個地址的內容在此刻(先儲存到我們指定的空間),然後寫到檔案裡

二、查詢剩餘空間:
 推薦:剩餘空間檢視器:  作者:牛博威
   Email:   advice107@sina.com
 用nbw寫的"剩餘空間檢視器"分析,部分結果如下:
******************************************
    名稱     RVA     OA        尺寸D   可寫否
   .text  005e3a27  005e3a27   1497      否
  .rdata  006b6c94  006b6c94    876      否
   .data  0076089c  0076089c  -415900      可
   .rsrc  00771ad8  0070bad8   1320      否
有效剩餘空間(位元組D)為: 3693 

******************************************
    我們用.rdata段,就說從檔案偏移地址006b6c94開始,有876位元組可用空間。但是.rdata段為不可寫,無法利用這裡的空間宣告變數。不過不

要緊,用PEditor把這個節區屬性改成可寫便可以了(方法不羅嗦了,簡單)。事實證明,整個檔案中.rdata區段最後的剩餘空間可以被正確加

載(win2000),這供我們利用足夠了!

三、準備winapi函式

我們準備改造註冊主程式acad.exe,但是由於acad.exe輸入函式表裡沒有大部分winapi函式,不是他不呼叫而是反編譯後看不到函式名。但是

我們可以用peditor或者LordPE等工具找到winapi函式,再說即使沒有我們也可以新增!具體方法我不說了,看雪書裡有,找到如下:
 
KERNEL32.CreateFileA 
 
FF1560479E00     call [009e4760] 
*****************
KERNEL32.SetFilePointer

FF15A4489E00     call [009e48a4]
*****************
KERNEL32.WriteFile     

FF15A8489E00     call [009e48a8]
*******************

這裡說一下call [009e4760]和call 009e4760不同,[009e4760]是指009e4760的值

四、修改工作


1.變數組織:我們需要用的變數就設在.rdata段006b6c94後面

6b6c96 :    儲存號碼的檔案地址.我們指定在C:\cad.txt裡,也可以其他,隨便了,不過不要太長!
6b6ca0 :    WriteFile函式的一個引數,資料緩衝區。對我們來說沒用。不過不可少!
6b6cac :    檔案控制程式碼地址 
6B6CB0 :    我們儲存的5個資料的儲存地方,每個分配8個位元組
6B6CD8 :    一個臨時的存放esp指標的地方
6b6ce0 :    我們的修改程式碼區 


這是檔案偏移地址file offset,在使用中要轉換,具體參照看雪的書。

2.修改檔案,跳轉到我們的程式碼區

:0094DB8F FF15C4DAB500      call dword ptr [00B5DAC4] <====在這個地方下斷,之後就是我們要的!
:0094DB95 83C40C            add esp, 0000000C   <====我們修改這個地方,在esp改變前儲存他!
:0094DB98 E913010000        jmp 0094DCB0

0094DB95  E946911600         jmp ab6ce0
0094DB95  90                 nop
0094DB96  90                 nop
0094DB97  90                 nop
不足處不上90,下面兩句後面補上。
 add esp, 0000000C   
 jmp  0094DCB0

0094DB95跳到我們的程式碼,我們在.rdata段006b6c96開始我們的工作:

*********************************

00AB6CE0    8925 D86CAB00        mov [AB6CD8], esp <===此時的esp指標儲存在AB6CD8
  為什麼要儲存esp指標呢? 因為是堆疊暫存器,在堆疊操作時要變化比如下面一句pushad,而我們需要的是此刻的esp,
只好儲存一下。這裡順便說一下,eax,ebx,edx,ecx是資料暫存器,
而esp,epb,esi,edi是指標及變址暫存器,因為我們在補丁程式時,
不可避免使用暫存器,這時我們最好使用eax,ebx,edx,ecx是資料暫存器,
否則可能會造成堆疊混亂,一點心得。

00AB6CE6    60                   pushad  <===所有的暫存器依次入棧,保持堆疊平衡,後面對應popad
00AB6CE7    A1 D86CAB00          mov eax, [AB6CD8] <===儲存在AB6CD8的關鍵esp指標,這裡有我們要的資料!!
00AB6CEC    90                   nop
00AB6CED    36:8B58 08           mov ebx, [eax+8] <===相當於前面[esp+8]的地址,我們傳給ebx
00AB6CF1    83C3 04              add ebx,4  <===相當於來到前面[esp+8]+4的地址
00AB6CF4    36:8B0B              mov ecx,[ebx] <===相當於前面[esp+8]+4的地址的值我們傳給ecx
00AB6CF7    890D B06CAB00        mov [AB6CB0], ecx  <===相當於前面[esp+8]+4的值儲存在AB6CB0
  為什麼這麼麻煩? 因為“mov [AB6CB0], [ebx]”這彙編命令不存在。
00AB6CFD    83C3 04              add ebx,4  <===相當於來到前面[esp+8]+8的地址
00AB6D00    36:8B0B              mov ecx, [ebx]    <===相當於前面[esp+8]+8的地址的值我們傳給ecx
00AB6D03    890D B86CAB00        mov [AB6CB8],ecx  <===相當於前面[esp+8]+8的值儲存在AB6CB8
00AB6D09    36:8B18              mov ebx, [eax] <===相當於前面[esp]的地址,我們傳給ebx
00AB6D0C    83C3 08              add ebx,8  <===相當於來到前面[esp]+8的地址
00AB6D0F    36:8B0B              mov ecx, [ebx] <===相當於前面[esp]+8的地址的值我們傳給ecx
00AB6D12    890D C06CAB00        mov [AB6CC0],ecx  <===同上
00AB6D18    83C3 04              add ebx,4  <===相當於來到前面[esp]+0c的地址
00AB6D1B    36:8B0B              mov ecx, [ebx]
00AB6D1E    890D C86CAB00        mov [AB6CC8],ecx
00AB6D24    83C3 04              add ebx,4  <===相當於來到前面[esp]+10的地址
00AB6D27    36:8B0B              mov ecx, [ebx]
00AB6D2A    890D D06CAB00        mov [AB6CD0],ecx
這裡我們看到mov ecx, [ebx]和 mov ecx, ebx是不同,
前者[ebx]是的ebx地址的值給ecx,後者是ebx,相當於ecx=ebx複製!


00AB6D30    90                   nop
00AB6D31    90                   nop
00AB6D32    90                   nop
00AB6D33    90                   nop
00AB6D34    6A 00                push 0
00AB6D36    6A 02                push 2  ;FILE_ATTRIBUTE_HIDDEN,建立檔案時使檔案屬性為隱藏
00AB6D38    6A 04                push 4  ;OPEN_ALWAYS.如果不存在該檔案,則建立之
00AB6D3A    6A 00                push 0
00AB6D3C    6A 03                push 3  ;允許其他程式使用檔案(為了不發生意外,所以這樣設定) 
00AB6D3E    68 000000C0          push C0000000
00AB6D43    68 966CAB00          push 00AB6C96      ; ASCII "C:\cad.txt"指向我們存檔檔案 
00AB6D48    FF15 60479E00        call [009e4760]    ; KERNEL32.CreateFileA
00AB6D4E    A3 AC6CAB00          mov  [AB6CAC],eax  ;儲存檔案控制程式碼留給WriteFile用
00AB6D53    6A 02                push 2  ;FILE_END.設定檔案末尾
00AB6D55    6A 00                push 0
00AB6D57    6A 00                push 0  ;設定檔案指標為檔案末尾
00AB6D59    50                   push eax  ;檔案控制程式碼
00AB6D5A    FF15 A4489E00        call [009e48a4]   ; KERNEL32.SetFilePointer
00AB6D60    6A 00                push 0   
00AB6D62    68 A06CAB00          push 00AB6CA0   ;WriteFile函式的一個引數,對我們來說沒用,不過不可少!
00AB6D67    6A 28                push 28   ;儲存的資料總長度,8x5=40位元組
00AB6D69    68 B06CAB00          push 00AB6CB0  ;儲存的資料開始地址
00AB6D6E    90                   nop
00AB6D6F    FF35 AC6CAB00        push [AB6CAC]  ;前面儲存的檔案控制程式碼
這裡我們看到push [AB6CAC]和push AB6CAC是不同,前者是的地址的值給入棧,後者是地址,
00AB6D75    FF15 A8489E00        call [009e48a8]    ; KERNEL32.WriteFile
00AB6D7B    61                   popad  <===所有的暫存器依次出棧,保持堆疊平衡
00AB6D7C    83C4 0C              add esp,0C  <===補上
00AB6D7F  - E9 2C6FE9FF          jmp 0094DCB0 <===補上,直接跳去
***********
完工!!
***********
用UltraEdit等工具寫acad.exe

這裡再說一下pll621的C32asm,絕對是好東東,雖然我習慣用W32dasm,但C32asm的彙編程式碼查詢器,絕對是好,我覺得可以拋棄hiew了,用C3

2asm的彙編程式碼查詢器寫彙編,然後再用16進位制編輯器如UltraEdit10把程式碼寫到檔案裡,再結合ollydbg 1.10除錯一下,美啊!我以上新增的

程式碼就是這樣的,幾乎一次成功(除了改幾個跳轉的程式碼)!感謝pll621提供的好東東。

開啟acad執行,然後用UltraEdit開啟"C:\cad.txt"我們存檔的檔案(紀事本開啟是亂碼)看到如下:

8D E4 31 17 00 00 00 00 DA 11 17 06 00 00 00 00
68 B6 31 01 00 00 00 00 D5 43 13 A2 00 00 00 00
2E EC 56 C1 00 00 00 00 


為什麼和前面的不一樣?因為儲存都是高位在前,低位在後,堆疊!
你只要自己再到著抄一遍

1731E48D     data[0]
0012F610     data[1] ..........略

當然有好事的可以編一段,重新排版,並且直接存為txt檔案格式。

五、最後
 
好累啊,其實這是我自己自找麻煩,高手們可以不必看。當時是為了破解cad2004時用的,因為她加了一個猛殼,沒法動態除錯。
最後也沒用上,因為關鍵點還沒找到,哎。雖然已經成功製作了cad2004的license,那是因為autodesk公司太傻!

寫出來,如果可以給初學pediy的一點幫助,我就知足了。


相關文章