用olldbg破解,分析ocx控制元件

看雪資料發表於2004-06-23

【破文標題】MP3 Encode/Decode Control 演算法分析 
【破文作者】 daxia2002 
【作者郵箱】 daxia2002@126.com
【使用工具】 Peid,Ollydbg,ida,ActiveX control test container,CoClassSyms
【破解平臺】 Win2000/XP
【軟體名稱】 MP3 Encode/Decode Control
【下載地址】 http://www.streamware-dev.com/products.html
【軟體簡介】MP3 Encode/Decode Control is an ActiveX control allowing you to add MP3 audio encoding and decoding(playing) ability into your  C/C++ and Visual Basic applications. The control is fully documented and includes samples to get started easily.
【軟體特性】
 1.Encodes audio to .MP3 files 
 2.Decodes MP3 audio 
 3.Supports ID3v1 and ID3v2 tags 
 4.Easy to understand ActiveX interface 
 5.Integration with other ActiveX components by Streamware Development 
 Adapted interface for easy understanding by VisualBasic and C/C++ developers 
 Can be used in any programming environment supporting ActiveX controls 
 6.Works in Win95/98/ME/NT/2000/XP environment 

【軟體大小】1.16M
【保護方式】無。
【破解目的】研究OCX控制元件的一般破解和分析方法
【破解宣告】 我是一隻小菜鳥,偶得一點心得,願與大家分享:)

【破解內容】
 說明:olldbg已經內建了除錯dll動態連結庫的功能,fly版主的dll脫殼系列寫的非常精彩,使我受益非潛。但是發現目前版本還沒有除錯ocx控制元件的功能,看學論壇和DFCG論壇也沒有人發表這方面的文章,於是自己試著研究了一下,也借用了很多工具,偶得一點心得,願與大家分享,希望各位老大們批評指正,偶洗耳恭聽。

 工具簡介:1.ActiveX control test container:我想大家都應該知道吧,visual studio帶的專門測試控制元件功能的工具。
    2.CoClassSyms:在REC論壇上找到的輔助工具軟體,能夠把COM和ActiveX控制元件中介面中的方法和屬性匯出成格式為DBG的符號檔案,有了符號檔案,olldbg和ida就能分析出COM和ActiveX控制元件中介面中的方法和屬性所在虛擬地址和名稱了。

用Peid查殼,發現swdmp3.ocx控制元件無殼,為Visual C++語言編寫。
把CoClassSyms.exe 檔案複製到winnt\system32目錄下,在dos視窗環境下執行:CoClassSyms swdmp3.ocx,生成swdmp3.dbg同名的符號檔案。

下面我們先用ida靜態分析一下,強大的ida自動載入對應的符號檔案,在名字視窗中已分析出改控制元件中的方法和屬性名稱,如下:

ISwdAudioEncoder::Open                  1000D3C0   
ISwdAudioEncoder::OpenHandle            1000D940   
ISwdAudioEncoder::SetInputFormat        1000DAE0   
ISwdAudioEncoder::SetInputFormatWFX     1000DE00   
ISwdAudioEncoder::SetOutputFormatVBR    1000E000   
ISwdAudioEncoder::SetOutputFormatABR    1000E1E0   
ISwdAudioEncoder::SetOutputFormatCBR    1000E3B0   
ISwdAudioEncoder::Write                 1000E720   
ISwdAudioEncoder::Close                 1000F420   
ISwdAudioEncoder::Filename_get          10011030   
ISwdAudioEncoder::AddExtension_get      10011060   
ISwdAudioEncoder::AddExtension_put      10011090   
ISwdAudioEncoder::TagData_get           100110B0   
ISwdAudioEncoder::OverwritePrompt_get   100110D0   
ISwdAudioEncoder::OverwritePrompt_put   10011100   
ISwdAudioEncoder::LicenseNumber_get     10011120   
ISwdAudioEncoder::LicenseNumber_put     100111A0   

很顯然,ISwdAudioEncoder::LicenseNumber_put屬性就是設定許可證號的。雙擊滑鼠,跳到程式碼入口,如下:

.text:100111A0 55                push    ebp
.text:100111A1 8B EC             mov     ebpesp
.text:100111A3 51                push    ecx
.text:100111A4 53                push    ebx
.text:100111A5 56                push    esi
.text:100111A6 57                push    edi
.text:100111A7 8B 7D 0C          mov     edi, [ebp+lpString]  //edi指向輸入的許可證號
.text:100111AA 85 FF             test    ediedi    //判斷許可證號是否為空
.text:100111AC 74 25             jz      short loc_100111D3  //為空跳走
.text:100111AE 57                push    edi                   ; lpString  //許可證號入C
.text:100111AF FF 15 7C A1 01 10 call    ds:lstrlenW    //測試許可證號unicode長度
.text:100111B5 8D 74 00 02       lea     esi, [eax+eax+2]
.text:100111B9 8B C6             mov     eaxesi
.text:100111BB 83 C0 03          add     eax, 3
.text:100111BE 24 FC             and     al, 0FCh
.text:100111C0 E8 6B 1E 00 00    call    __alloca_probe
.text:100111C5 8B C4             mov     eaxesp
.text:100111C7 6A 00             push    0
.text:100111C9 56                push    esi
.text:100111CA 57                push    edi
.text:100111CB 50                push    eax
.text:100111CC E8 EF 00 FF FF    call    sub_100012C0
.text:100111D1 8B F8             mov     edieax
.text:100111D3                   
.text:100111D3                   loc_100111D3:                 ; CODE XREF: ISwdAudioEncoder__LicenseNumber_put+Cj
.text:100111D3 8B 5D 08          mov     ebx, [ebp+arg_0]
.text:100111D6 85 FF             test    ediedi
.text:100111D8 8D B3 CC 00 00 00 lea     esi, [ebx+0CCh]
.text:100111DE 75 04             jnz     short loc_100111E4
.text:100111E0 33 C0             xor     eaxeax
.text:100111E2 EB 07             jmp     short loc_100111EB
.text:100111E4                   ; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
.text:100111E4                   
.text:100111E4                   loc_100111E4:                 ; CODE XREF: ISwdAudioEncoder__LicenseNumber_put+3Ej
.text:100111E4 57                push    edi                   ; lpString
.text:100111E5 FF 15 D0 A1 01 10 call    ds:lstrlenA
.text:100111EB                   
.text:100111EB                   loc_100111EB:                 ; CODE XREF: ISwdAudioEncoder__LicenseNumber_put+42j
.text:100111EB 57                push    edi
.text:100111EC 50                push    eax
.text:100111ED 8B CE             mov     ecxesi
.text:100111EF E8 DC BD FF FF    call    sub_1000CFD0
.text:100111F4 8B 06             mov     eax, [esi]
.text:100111F6 68 F0 18 02 10    push    offset String
.text:100111FB 50                push    eax
.text:100111FC E8 5B 29 00 00    call    __mbscmp
.text:10011201 83 C4 08          add     esp, 8
.text:10011204 85 C0             test    eaxeax
.text:10011206 75 0E             jnz     short loc_10011216
.text:10011208                   
.text:10011208                   loc_10011208:                 ; CODE XREF: ISwdAudioEncoder__LicenseNumber_put+310j
.text:10011208 33 C0             xor     eaxeax
.text:1001120A 8D 65 F0          lea     esp, [ebp-10h]
.text:1001120D 5F                pop     edi
.text:1001120E 5E                pop     esi
.text:1001120F 5B                pop     ebx
.text:10011210 8B E5             mov     espebp
.text:10011212 5D                pop     ebp
.text:10011213 C2 08 00          retn    8
.text:10011216                   ; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
.text:10011216                   
.text:10011216                   loc_10011216:                 ; CODE XREF: ISwdAudioEncoder__LicenseNumber_put+66j
.text:10011216 8B 06             mov     eax, [esi]
.text:10011218 83 78 F8 18       cmp     dword ptr [eax-8], 18h  //比較許可證號的長度是否為24位
.text:1001121C 7D 38             jge     short loc_10011256  //大於等於24跳轉到10011256,小於24位顯示下面的
                “License number is wrong.”訊息框
.text:1001121E 8B 48 F8          mov     ecx, [eax-8]
.text:10011221 85 C9             test    ecxecx
.text:10011223 74 1C             jz      short loc_10011241
.text:10011225 8B 48 F4          mov     ecx, [eax-0Ch]
.text:10011228 85 C9             test    ecxecx
.text:1001122A 7C 09             jl      short loc_10011235
.text:1001122C 8B CE             mov     ecxesi
.text:1001122E E8 0D C1 FF FF    call    sub_1000D340
.text:10011233 EB 0C             jmp     short loc_10011241
.text:10011235                   ; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
.text:10011235                   
.text:10011235                   loc_10011235:                 ; CODE XREF: ISwdAudioEncoder__LicenseNumber_put+8Aj
.text:10011235 68 F0 18 02 10    push    offset String
.text:1001123A 8B CE             mov     ecxesi
.text:1001123C E8 3F 15 00 00    call    sub_10012780
.text:10011241                   
.text:10011241                   loc_10011241:                 ; CODE XREF: ISwdAudioEncoder__LicenseNumber_put+83j
.text:10011241                                                 ; ISwdAudioEncoder__LicenseNumber_put+93j
.text:10011241 8B 4B 50          mov     ecx, [ebx+50h]
.text:10011244 6A 10             push    10h
.text:10011246 68 C8 E1 01 10    push    offset aMp3EncoderCont ; "MP3 Encoder Control"
.text:1001124B 68 68 E8 01 10    push    offset aLicenseNumberI ; "License number is wrong."
.text:10011250 51                push    ecx
.text:10011251 E9 B1 02 00 00    jmp     loc_10011507
.text:10011256                   ; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
.text:10011256                   
.text:10011256                   loc_10011256:                 ; CODE XREF: ISwdAudioEncoder__LicenseNumber_put+7Cj
.text:10011256 8B 16             mov     edx, [esi]    //edx指向許可證號
.text:10011258 B8 05 00 00 00    mov     eax, 5      //eax=5
.text:1001125D 8B 4A F8          mov     ecx, [edx-8]    //ecx=許可證號的長度
.text:10011260 3B C8             cmp     ecxeax
.text:10011262 7D 02             jge     short loc_10011266
.text:10011264 8B C1             mov     eaxecx
.text:10011266                   
.text:10011266                   loc_10011266:                 ; CODE XREF: ISwdAudioEncoder__LicenseNumber_put+C2j
.text:10011266 8B 0D 30 D0 01 10 mov     ecx, off_1001D030
.text:1001126C 6A 00             push    0
.text:1001126E 6A 00             push    0
.text:10011270 8D 55 0C          lea     edx, [ebp+lpString]
.text:10011273 89 4D 0C          mov     [ebp+lpString], ecx
.text:10011276 50                push    eax
.text:10011277 52                push    edx
.text:10011278 8B CE             mov     ecxesi
.text:1001127A E8 91 14 00 00    call    sub_10012710    //取許可證號前5位
.text:1001127F 8D 45 0C          lea     eax, [ebp+lpString]  //eax指向許可證號前5位
.text:10011282 8D 4D FC          lea     ecx, [ebp+var_4]
.text:10011285 50                push    eax
.text:10011286 E8 85 12 00 00    call    sub_10012510
.text:1001128B 8D 4D 0C          lea     ecx, [ebp+lpString]
.text:1001128E E8 1D BB FF FF    call    sub_1000CDB0
.text:10011293 8B 4D FC          mov     ecx, [ebp+var_4]  //ecx指向許可證號前5位
.text:10011296 68 60 E8 01 10    push    offset aMped          ; "MPED-"  //內定的5位固定字元
.text:1001129B 51                push    ecx
.text:1001129C E8 BB 28 00 00    call    __mbscmp    //進行比較
.text:100112A1 8B 0D 34 D0 01 10 mov     ecx, off_1001D034
.text:100112A7 83 C4 08          add     esp, 8
.text:100112AA 8B 3D A8 A0 01 10 mov     edids:InterlockedDecrement
.text:100112B0 85 C0             test    eaxeax    //測試比較結果
.text:100112B2 8B 45 FC          mov     eax, [ebp+var_4]
.text:100112B5 0F 95 C3          setnz   bl      //置標誌為給bl
.text:100112B8 8D 50 F4          lea     edx, [eax-0Ch]
.text:100112BB 3B D1             cmp     edxecx
.text:100112BD 74 19             jz      short loc_100112D8
.text:100112BF 83 C0 F4          add     eax, 0FFFFFFF4h
.text:100112C2 50                push    eax                   ; lpAddend
.text:100112C3 FF D7             call    edi ; InterlockedDecrement
.text:100112C5 85 C0             test    eaxeax
.text:100112C7 7F 0F             jg      short loc_100112D8
.text:100112C9 8B 45 FC          mov     eax, [ebp+var_4]
.text:100112CC 83 C0 F4          add     eax, 0FFFFFFF4h
.text:100112CF 50                push    eax
.text:100112D0 E8 5B 1C 00 00    call    sub_10012F30
.text:100112D5 83 C4 04          add     esp, 4
.text:100112D8                   
.text:100112D8                   loc_100112D8:                 ; CODE XREF: ISwdAudioEncoder__LicenseNumber_put+11Dj
.text:100112D8                                                 ; ISwdAudioEncoder__LicenseNumber_put+127j
.text:100112D8 8B 06             mov     eax, [esi]  //eax指向指向輸入的許可證號
.text:100112DA 84 DB             test    blbl    //測試bl標誌位
.text:100112DC 74 3B             jz      short loc_10011319  //為0跳到10011319,否則位顯示下面的
                “License number is wrong.”訊息框
.text:100112DE 8B 48 F8          mov     ecx, [eax-8]
.text:100112E1 85 C9             test    ecxecx
.text:100112E3 74 1C             jz      short loc_10011301
.text:100112E5 8B 48 F4          mov     ecx, [eax-0Ch]
.text:100112E8 85 C9             test    ecxecx
.text:100112EA 7C 09             jl      short loc_100112F5
.text:100112EC 8B CE             mov     ecxesi
.text:100112EE E8 4D C0 FF FF    call    sub_1000D340
.text:100112F3 EB 0C             jmp     short loc_10011301
.text:100112F5                   ; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
.text:100112F5                   
.text:100112F5                   loc_100112F5:                 ; CODE XREF: ISwdAudioEncoder__LicenseNumber_put+14Aj
.text:100112F5 68 F0 18 02 10    push    offset String
.text:100112FA 8B CE             mov     ecxesi
.text:100112FC E8 7F 14 00 00    call    sub_10012780
.text:10011301                   
.text:10011301                   loc_10011301:                 ; CODE XREF: ISwdAudioEncoder__LicenseNumber_put+143j
.text:10011301                                                 ; ISwdAudioEncoder__LicenseNumber_put+153j
.text:10011301 8B 4D 08          mov     ecx, [ebp+arg_0]
.text:10011304 6A 10             push    10h
.text:10011306 68 C8 E1 01 10    push    offset aMp3EncoderCont ; "MP3 Encoder Control"
.text:1001130B 68 68 E8 01 10    push    offset aLicenseNumberI ; "License number is wrong."
.text:10011310 8B 51 50          mov     edx, [ecx+50h]
.text:10011313 52                push    edx
.text:10011314 E9 EE 01 00 00    jmp     loc_10011507
.text:10011319                   ; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
.text:10011319                   
.text:10011319                   loc_10011319:                 ; CODE XREF: ISwdAudioEncoder__LicenseNumber_put+13Cj
.text:10011319 8A 50 09          mov     dl, [eax+9]  //取輸入的許可證號的第10位
.text:1001131C B1 2D             mov     cl, 2Dh  //cl='-'
.text:1001131E 3A D1             cmp     dlcl    //比較許可證號的第10位是否等於'-'
.text:10011320 0F 85 A9 01 00 00 jnz     loc_100114CF  //不等跳走
.text:10011326 38 48 0E          cmp     [eax+0Eh], cl  //相等繼續比較許可證號的第15位是否等於'-'
.text:10011329 0F 85 A0 01 00 00 jnz     loc_100114CF  //不等跳走
.text:1001132F 38 48 13          cmp     [eax+13h], cl  //相等繼續比較許可證號的第20位是否等於'-'
.text:10011332 0F 85 97 01 00 00 jnz     loc_100114CF   //不等跳走
.text:10011338 8B 0E             mov     ecx, [esi]
.text:1001133A B8 04 00 00 00    mov     eax, 4
.text:1001133F 8B 49 F8          mov     ecx, [ecx-8]
.text:10011342 83 F9 09          cmp     ecx, 9
.text:10011345 7D 03             jge     short loc_1001134A
.text:10011347 8D 41 FB          lea     eax, [ecx-5]
.text:1001134A                   
.text:1001134A                   loc_1001134A:                 ; CODE XREF: ISwdAudioEncoder__LicenseNumber_put+1A5j
.text:1001134A 83 F9 05          cmp     ecx, 5
.text:1001134D 7D 02             jge     short loc_10011351
.text:1001134F 33 C0             xor     eaxeax
.text:10011351                   
.text:10011351                   loc_10011351:                 ; CODE XREF: ISwdAudioEncoder__LicenseNumber_put+1ADj
.text:10011351 8B 15 30 D0 01 10 mov     edx, off_1001D030
.text:10011357 6A 00             push    0
.text:10011359 6A 05             push    5
.text:1001135B 50                push    eax
.text:1001135C 8D 45 0C          lea     eax, [ebp+lpString]
.text:1001135F 8B CE             mov     ecxesi
.text:10011361 50                push    eax
.text:10011362 89 55 0C          mov     [ebp+lpString], edx
.text:10011365 E8 A6 13 00 00    call    sub_10012710  //取輸入的許可證號的6至9位
.text:1001136A 8D 4D 0C          lea     ecx, [ebp+lpString]  //ecx指向輸入的許可證號的6至9位
.text:1001136D 51                push    ecx
.text:1001136E 8D 4D FC          lea     ecx, [ebp+var_4]
.text:10011371 E8 9A 11 00 00    call    sub_10012510    //將許可證號的6至9位儲存到[0012ec78]
.text:10011376 8D 4D 0C          lea     ecx, [ebp+lpString]
.text:10011379 E8 32 BA FF FF    call    sub_1000CDB0
.text:1001137E 8B 55 FC          mov     edx, [ebp+var_4]
.text:10011381 52                push    edx    //edx指向輸入的許可證號的6至9位
.text:10011382 E8 99 01 00 00    call    sub_10011520  //判斷許可證號的每一位是否在0-9,a-f,A-F之間
.text:10011387 8B 15 34 D0 01 10 mov     edx, off_1001D034
.text:1001138D 66 A3 74 19 02 10 mov     word ptr dword_10021974, ax  //ax=許可證號的6至9位,儲存到10021974
.text:10011393 8B 45 FC          mov     eax, [ebp+var_4]
.text:10011396 83 C4 04          add     esp, 4
.text:10011399 8D 48 F4          lea     ecx, [eax-0Ch]
.text:1001139C 3B CA             cmp     ecxedx
.text:1001139E 74 19             jz      short loc_100113B9
.text:100113A0 83 C0 F4          add     eax, 0FFFFFFF4h
.text:100113A3 50                push    eax                   ; lpAddend
.text:100113A4 FF D7             call    edi ; InterlockedDecrement
.text:100113A6 85 C0             test    eaxeax
.text:100113A8 7F 0F             jg      short loc_100113B9
.text:100113AA 8B 55 FC          mov     edx, [ebp+var_4]
.text:100113AD 83 C2 F4          add     edx, 0FFFFFFF4h
.text:100113B0 52                push    edx
.text:100113B1 E8 7A 1B 00 00    call    sub_10012F30
.text:100113B6 83 C4 04          add     esp, 4
.text:100113B9                   
.text:100113B9                   loc_100113B9:                 ; CODE XREF: ISwdAudioEncoder__LicenseNumber_put+1FEj
.text:100113B9                                                 ; ISwdAudioEncoder__LicenseNumber_put+208j
.text:100113B9 8B 0E             mov     ecx, [esi]
.text:100113BB B8 04 00 00 00    mov     eax, 4
.text:100113C0 8B 49 F8          mov     ecx, [ecx-8]
.text:100113C3 83 F9 0E          cmp     ecx, 0Eh
.text:100113C6 7D 03             jge     short loc_100113CB
.text:100113C8 8D 41 F6          lea     eax, [ecx-0Ah]
.text:100113CB                   
.text:100113CB                   loc_100113CB:                 ; CODE XREF: ISwdAudioEncoder__LicenseNumber_put+226j
.text:100113CB 83 F9 0A          cmp     ecx, 0Ah
.text:100113CE 7D 02             jge     short loc_100113D2
.text:100113D0 33 C0             xor     eaxeax
.text:100113D2                   
.text:100113D2                   loc_100113D2:                 ; CODE XREF: ISwdAudioEncoder__LicenseNumber_put+22Ej
.text:100113D2 8B 15 30 D0 01 10 mov     edx, off_1001D030
.text:100113D8 6A 00             push    0
.text:100113DA 6A 0A             push    0Ah
.text:100113DC 50                push    eax
.text:100113DD 8D 45 0C          lea     eax, [ebp+lpString]
.text:100113E0 8B CE             mov     ecxesi
.text:100113E2 50                push    eax
.text:100113E3 89 55 0C          mov     [ebp+lpString], edx
.text:100113E6 E8 25 13 00 00    call    sub_10012710    //取輸入的許可證號的11至14位
.text:100113EB 8D 4D 0C          lea     ecx, [ebp+lpString]
.text:100113EE 51                push    ecx
.text:100113EF 8D 4D FC          lea     ecx, [ebp+var_4]
.text:100113F2 E8 19 11 00 00    call    sub_10012510
.text:100113F7 8D 4D 0C          lea     ecx, [ebp+lpString]
.text:100113FA E8 B1 B9 FF FF    call    sub_1000CDB0
.text:100113FF 8B 55 FC          mov     edx, [ebp+var_4]
.text:10011402 52                push    edx      //edx指向輸入的許可證號的11至14位
.text:10011403 E8 18 01 00 00    call    sub_10011520    //判斷許可證號的每一位是否在0-9,a-f,A-F之間
.text:10011408 83 C4 04          add     esp, 4
.text:1001140B 8D 4D FC          lea     ecx, [ebp+var_4]
.text:1001140E 66 A3 76 19 02 10 mov     word ptr dword_10021974+2, ax //ax=許可證號的11至14位,儲存到10021976
.text:10011414 E8 97 B9 FF FF    call    sub_1000CDB0
.text:10011419 6A 04             push    4
.text:1001141B 8D 45 0C          lea     eax, [ebp+lpString]
.text:1001141E 6A 0F             push    0Fh
.text:10011420 50                push    eax
.text:10011421 8B CE             mov     ecxesi
.text:10011423 E8 D8 14 00 00    call    sub_10012900    //取輸入的許可證號的16至19位
.text:10011428 8B 00             mov     eax, [eax]
.text:1001142A 50                push    eax      //eax向輸入的許可證號的16至19位
.text:1001142B E8 F0 00 00 00    call    sub_10011520    //判斷許可證號的每一位是否在0-9,a-f,A-F之間
.text:10011430 83 C4 04          add     esp, 4
.text:10011433 8D 4D 0C          lea     ecx, [ebp+lpString]
.text:10011436 66 A3 78 19 02 10 mov     word_10021978, ax  //ax=許可證號的16至19位,儲存到10021978
.text:1001143C E8 6F B9 FF FF    call    sub_1000CDB0
.text:10011441 6A 04             push    4
.text:10011443 8D 4D 0C          lea     ecx, [ebp+lpString]
.text:10011446 6A 14             push    14h
.text:10011448 51                push    ecx
.text:10011449 8B CE             mov     ecxesi
.text:1001144B E8 B0 14 00 00    call    sub_10012900    ///取輸入的許可證號的21至24位
.text:10011450 8B 00             mov     eax, [eax]
.text:10011452 50                push    eax      //eax向輸入的許可證號的21至24位
.text:10011453 E8 C8 00 00 00    call    sub_10011520    //判斷許可證號的每一位是否在0-9,a-f,A-F之間
.text:10011458 83 C4 04          add     esp, 4
.text:1001145B 8D 4D 0C          lea     ecx, [ebp+lpString]
.text:1001145E 66 A3 7A 19 02 10 mov     word_1002197A, ax  //ax=許可證號的21至24位,儲存到1002197A
.text:10011464 E8 47 B9 FF FF    call    sub_1000CDB0    //下面對儲存的許可證號進行運算處理
.text:10011469 66 8B 15 7A 19 02+mov     dx, word_1002197A  //儲存許可證號的21至24位到dx
.text:10011470 8B 0D 74 19 02 10 mov     ecx, dword_10021974  //10021974儲存許可證號的6至9位,10021976儲存許可證號的11至14位
                //10021976對應ecx高word位,10021974對應ecx低word位
.text:10011476 66 03 15 78 19 02+add     dx, word_10021978  //dx=許可證號的21至24+許可證號的16至19位
.text:1001147D 8B 7D 08          mov     edi, [ebp+arg_0]
.text:10011480 66 03 15 76 19 02+add     dxword ptr dword_10021974+2  //dx=許可證號的21至24+許可證號的16至19位+許可證號的11至14位
.text:10011487 03 D1             add     edxecx      //edx=許可證號的21至24+許可證號的16至19位+許可證號的11至14位+ecx
.text:10011489 F7 DA             neg     edx      //edx取反
.text:1001148B 66 F7 DA          neg     dx      //dx取反
.text:1001148E 1B D2             sbb     edxedx    //edx=edx-edx-C(C為進位標誌)
.text:10011490 42                inc     edx      //edx=edx+1
.text:10011491 66 89 15 7C 19 02+mov     word ptr dword_1002197C, dx //將dx儲存到1002197C
.text:10011498 A1 7C 19 02 10    mov     eax, dword_1002197C  //eax=dx
.text:1001149D 25 FF FF 00 00    and     eax, 0FFFFh    //與0FFFFh相與
.text:100114A2 89 87 D4 00 00 00 mov     [edi+0D4h], eax  //儲存結果
.text:100114A8 66 83 3D 7C 19 02+cmp     word ptr dword_1002197C, 0 //與0比較
.text:100114B0 0F 85 52 FD FF FF jnz     loc_10011208    //不為0跳轉到10011208,為0顯示"License number is wrong."資訊
.text:100114B6 8B CE             mov     ecxesi
.text:100114B8 E8 33 11 00 00    call    sub_100125F0
.text:100114BD 8B 4F 50          mov     ecx, [edi+50h]
.text:100114C0 6A 10             push    10h
.text:100114C2 68 C8 E1 01 10    push    offset aMp3EncoderCont ; "MP3 Encoder Control"
.text:100114C7 68 68 E8 01 10    push    offset aLicenseNumberI ; "License number is wrong."
.text:100114CC 51                push    ecx
.text:100114CD EB 38             jmp     short loc_10011507
.text:100114CF                   ; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
.text:100114CF                   
.text:100114CF                   loc_100114CF:                 ; CODE XREF: ISwdAudioEncoder__LicenseNumber_put+180j
.text:100114CF                                                 ; ISwdAudioEncoder__LicenseNumber_put+189j
.text:100114CF                                                 ; ISwdAudioEncoder__LicenseNumber_put+192j
.text:100114CF 8B 06             mov     eax, [esi]
.text:100114D1 8B 48 F8          mov     ecx, [eax-8]
.text:100114D4 85 C9             test    ecxecx
.text:100114D6 74 1C             jz      short loc_100114F4
.text:100114D8 8B 48 F4          mov     ecx, [eax-0Ch]
.text:100114DB 85 C9             test    ecxecx
.text:100114DD 7C 09             jl      short loc_100114E8
.text:100114DF 8B CE             mov     ecxesi
.text:100114E1 E8 5A BE FF FF    call    sub_1000D340
.text:100114E6 EB 0C             jmp     short loc_100114F4
.text:100114E8                   ; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
.text:100114E8                   
.text:100114E8                   loc_100114E8:                 ; CODE XREF: ISwdAudioEncoder__LicenseNumber_put+33Dj
.text:100114E8 68 F0 18 02 10    push    offset String
.text:100114ED 8B CE             mov     ecxesi
.text:100114EF E8 8C 12 00 00    call    sub_10012780
.text:100114F4                   
.text:100114F4                   loc_100114F4:                 ; CODE XREF: ISwdAudioEncoder__LicenseNumber_put+336j
.text:100114F4                                                 ; ISwdAudioEncoder__LicenseNumber_put+346j
.text:100114F4 8B 55 08          mov     edx, [ebp+arg_0]
.text:100114F7 6A 10             push    10h                   ; uType
.text:100114F9 68 C8 E1 01 10    push    offset aMp3EncoderCont ; lpCaption
.text:100114FE 68 68 E8 01 10    push    offset aLicenseNumberI ; lpText
.text:10011503 8B 42 50          mov     eax, [edx+50h]
.text:10011506 50                push    eax                   ; hWnd
.text:10011507                   
.text:10011507                   loc_10011507:                 ; CODE XREF: ISwdAudioEncoder__LicenseNumber_put+B1j
.text:10011507                                                 ; ISwdAudioEncoder__LicenseNumber_put+174j
.text:10011507                                                 ; ISwdAudioEncoder__LicenseNumber_put+32Dj
.text:10011507 FF 15 80 A2 01 10 call    ds:MessageBoxA
.text:1001150D 8D 65 F0          lea     esp, [ebp+var_10]
.text:10011510 B8 05 40 00 80    mov     eax, 80004005h
.text:10011515 5F                pop     edi
.text:10011516 5E                pop     esi
.text:10011517 5B                pop     ebx
.text:10011518 8B E5             mov     espebp
.text:1001151A 5D                pop     ebp
.text:1001151B C2 08 00          retn    8
.text:1001151B                   ISwdAudioEncoder__LicenseNumber_put endp

讓我們開始啟動olldbg動態除錯,用olldbg載入ActiveX control test container後,F9執行,在ActiveX control test container中
選擇edit->new control,選擇mp3encoder class。切換到olldbg,ALT+E開啟模組視窗,選擇swdmp3.ocx,右鍵選擇"檢視名稱",型別為"檔案庫"的
條目資訊就是olldbg根據符號檔案生成的控制元件的介面資訊,雙擊ISwdAudioEncoder::LicenseNumber_put,來到我們想要的地方,在10011A0處下斷點,
切換到ActiveX control test container,選擇control->invoke methods,選擇LicenseNumber(PropPut),引數框輸入我們生成的註冊碼
MPED-5446-1AF5-56FC-39C9,點選"set value",再點選"invoke",中斷在10011A0,我們就可以開始跟蹤分析了。


演算法總結:首先註冊碼的長度為24位,前5位為'MPED-'是固定的,第10、15、20位為'-',6至9位、11至14位、16至19位、21至24位
每一位在0-9,a-f,A-F之間,所以註冊碼的形式位:MPED-XXXX-XXXX-XXXX-XXXX。假設第二組數值為X2,第三組數值為X3,第四組數值為X4
第五組數值為X5,由最後往前推,要想註冊成功,edx=[1002197C]<>0,因為edx=edx-edx-C edx結果不是為0就為-1,如果edx=-1則inc edx後為0,
所以要edx=0,即C=0,進位標誌由最後neg dx決定,當dx=0時C=0,所以最終X3X2+X3+X4+X5低16位為0即可,只要X2+X3+X4+X5低16位為0即可,
所以(X2+X3+X4+X5)mod 10000h=0即可,讓X2+X3+X4+X5=10000h就滿足條件,最終的演算法就是X2+X3+X4+X5=10000h,是不是很簡單!

簡單的用VB做了個序號產生器:
Private Sub Command1_Click()
Dim x2, x3, x4, x5 As Long
Do
x2 = CLng((&H10000 - &H1000) * Rnd() + &H1000)
x3 = CLng((&H10000 - &H1000) * Rnd() + &H1000)
x4 = CLng((&H10000 - &H1000) * Rnd() + &H1000)
x5 = CLng(&H10000 - x2 - x3 - x4)
Loop Until Len(Hex$(x5)) = 4
Text1.Text = "MPED-" & Hex$(x2) & "-" & Hex$(x3) & "-" & Hex$(x4) & "-" & Hex$(x5)
End Sub

Private Sub Command2_Click()
End
End Sub


Private Sub Form_Load()
Dim x2, x3, x4, x5 As Long
Do
x2 = CLng((&H10000 - &H1000) * Rnd() + &H1000)
x3 = CLng((&H10000 - &H1000) * Rnd() + &H1000)
x4 = CLng((&H10000 - &H1000) * Rnd() + &H1000)
x5 = CLng(&H10000 - x2 - x3 - x4)
Loop Until Len(Hex$(x5)) = 4
Text1.Text = "MPED-" & Hex$(x2) & "-" & Hex$(x3) & "-" & Hex$(x4) & "-" & Hex$(x5)
End Sub

其他的三種控制元件(Streamware.CD.Extractor.Control,Streamware.OGG.Encoder.Control.v1.0,Streamware.WMA.Encoder.Control)
演算法是換湯不換藥,分別為:
1.Streamware.CD.Extractor.Control
固定資訊'RIPC',X2+X3_X5=10000h
2.Streamware.OGG.Encoder.Control
固定資訊'OVED',X3+X4_X2=10000h
3.Streamware.WMA.Encoder.Control
固定資訊'WMED',X1-X2_X4=10000h

寫的好累人,謝謝您耐心看完。
            daxia2002 於2004-6-23晚

相關文章