破解紅外遙控編碼分析儀3.0――上次問過的,現在終於破了。 (6千字)

看雪資料發表於2001-02-16

破解紅外遙控編碼分析儀3.0
Passion

前不久一同學使用紅外遙控編碼分析儀3.0,說是未註冊版本僅僅可輸出紅外線介面資料3次(3次的確也太少了點),於是找我碰碰運氣看能不能破。我瞧這軟體說明,說要向作者付“一噸午飯”註冊,天啊!要勒緊褲帶少吃多少頓才能湊足這一噸?“民以食為天”,破吧!
這個東西加了殼,由於我脫殼經驗不足,在這裡耽擱了兩天。Fileinfo查不出是什麼殼,後來下了個GTW,說是ASPack 1.083,於是用PROCDUMP的unpack,脫出來的檔案卻不能執行,出什麼EAccessVoilation。找個專門脫它的工具,照樣非法操作。看來只有手工脫了。還好,我們有中國人值得驕傲的TRW2000。
找入口點找得我頭暈,(此處省略不成功脫殼過程XXXX次)。後來終於碰上了一個段轉換的RET,執行完RET後來到以下處:

A1BCA34800              mov eax, dword ptr [0048A3BC]        ;這條居然是入口!不是PUSH EBP?
C1E002                  shl eax, 02
A3C0A34800              mov dword ptr [0048A3C0], eax
57                      push edi
51                      push ecx

在MOV EAX, dword ptr [0048A3BC]處來個PEDUMP,嘿嘿,脫殼成功。

接著便是破註冊的過程了。程式執行時會生成一個本機號,估計是把電腦的各種引數都計算出來湊成一塊兒的。演算法複雜得很。――先試試再說。執行程式IRVIEWER.EXE,啪地出來個視窗告訴你沒註冊,還把本機號多少多少多少告訴你。按確定後點選單中的註冊出現註冊輸入框。隨便亂填後按確定,窗體先消失,然後告訴你錯誤。沒的說,跟吧。下斷 bpx hmemcpy,斷後pmodule,清斷點按F10跟蹤,在IRVIEWER和COMCTL32.DLL和kernerl、user等之間跳了幾次後終於來到以下處:

:00402A7A 8B0D50354900            mov ecx, dword ptr [00493550]
:00402A80 8B01                    mov eax, dword ptr [ecx]
:00402A82 8B80E8020000            mov eax, dword ptr [eax+000002E8]
:00402A88 E80B210400              call 00444B98
:00402A8D 8D45FC                  lea eax, dword ptr [ebp-04]
:00402A90 E8DB360000              call 00406170
:00402A95 50                      push eax
:00402A96 E8212F0000              call 004059BC                ;這裡驗證註冊碼是否正確。
:00402A9B 59                      pop ecx
:00402A9C 3B0548BD4900            cmp eax, dword ptr [0049BD48]        ;正確標誌
:00402AA2 0F95C2                  setne dl                ;對則DL為0,否則……
:00402AA5 83E201                  and edx, 00000001            ;否則為1
:00402AA8 52                      push edx
:00402AA9 FF4DD4                  dec [ebp-2C]
:00402AAC 8D45FC                  lea eax, dword ptr [ebp-04]
:00402AAF BA02000000              mov edx, 00000002
:00402AB4 E8E3600800              call 00488B9C
:00402AB9 59                      pop ecx
:00402ABA 84C9                    test cl, cl
:00402ABC 7429                    je 00402AE7                ;這裡不跳則出錯。
:00402ABE 6A00                    push 00000000

但如果改00402ABC處的JE,居然無效。只有改00402AA2處了。把setne dl和AND EDX,00000001改成MOV EDX,0和NOP即可。
也就是把
0F 95 C2 83 E2 01 52
改為:
BA 00 00 00 00 90 ..

改掉脫殼後的EXE檔案後再執行,選選單中的註冊,在註冊框中亂填一氣,按確定。……嗯?什麼都沒有?
那這樣算不算註冊成功?關閉程式再執行,仍然提示未註冊。看來不行。
不過注意到一點,亂填一氣的註冊碼在程式再度執行後在註冊框中仍然存在,看來註冊這一步應該是透過了,但程式啟動的時候還有一步檢驗的過程,那兒通不過,就得每次執行程式都得註冊一次了。
用FILEmonitor和regmonitor監視程式執行中登錄檔和檔案的變化,終於從千頭萬緒中看到了C:\WINDOWS\IRVIEW.INI檔案。註冊框的檢驗透過後關閉程式時會把“正確”的註冊碼寫入C:\WINDOWS\IRVIEW.INI檔案。其內容為:

[Register]
SerialNum=0987654321

這樣就需要跟蹤程式開始讀檔案的部分。我於是就用TRW2000來LOAD它,下斷Createfilea也好,下getprivateprofilestring也好,下getprivateprofileint也好,下readfile也好,下openfile和其ex也好,居然要麼是什麼都攔不住(這是什麼原因還請各位指點),要麼就是在彈出提示未註冊框後中斷。我幾乎覺得山窮水盡了。後來仔細想想又找到了法子。――程式不是會把這個“正確”的註冊碼讀進來嗎?我就查它就行了。
在彈出註冊框時按Ctrl+M切入TRW2000,s 0 ffffffff '0987654321',真的找到一個地址47B490。
退出程式重新load,下bpm 47b490 w,後來中斷幾次,看看哪次47b490處會出現0987654321。
哈哈,這裡!――這裡中斷已經離目標不遠了。
(據REGMON分析,程式是先讀許多登錄檔引數再讀的IRVIEW.INI檔案,也就是說很可能本機號的計算在註冊碼的讀出之前處理,可以跳過許多麻煩的演算法程式了。)

不多久來到此處:

:0040325B E80C270000              call 0040596C
:00403260 A348BD4900              mov dword ptr [0049BD48], eax
:00403265 B850BD4900              mov eax, 0049BD50
:0040326A E8012F0000              call 00406170
:0040326F 50                      push eax
:00403270 E847270000              call 004059BC                ;這裡是驗證過程
:00403275 59                      pop ecx
:00403276 3B0548BD4900            cmp eax, dword ptr [0049BD48]        ;這裡是關鍵比對
:0040327C 0F849E000000            je 00403320                ;正確則跳,否則出錯。
:00403282 66C7459C5000            mov [ebp-64], 0050
:00403288 8D45D0                  lea eax, dword ptr [ebp-30]
:0040328B E8B02E0000              call 00406140
:00403290 8BD0                    mov edx, eax
:00403292 FF45A8                  inc [ebp-58]
:00403295 A148BD4900              mov eax, dword ptr [0049BD48]
:0040329A E89D2F0000              call 0040623C
:0040329F 8D55D0                  lea edx, dword ptr [ebp-30]
:004032A2 52                      push edx
:004032A3 8D45CC                  lea eax, dword ptr [ebp-34]
:004032A6 E8952E0000              call 00406140
:004032AB 50                      push eax
:004032AC FF45A8                  inc [ebp-58]

* Possible StringData Ref from Data Obj ->"該軟體沒有註冊,請向作者註冊.
註冊號: "
                                  |
:004032AF BA01A84800              mov edx, 0048A801
    …………  ;下邊就省了。
    
很好。把je 00403320改成JMP 00403320就行。
也就是做以下修改:
0F 84 9E 00 00 00 66 C7
E9 9F 00 .. .. 90 .. ..

儲存檔案後執行,萬事大吉!――實際上只改此處就行。

這個軟體在華軍上的軟體分類中的“其他欄目”中有下載,不是列表中的第一個地址!那是錯的,雖然也是一個IR.EXE,卻是什麼InternetRadio。 ^_^
這個東西如果用靜態分析查詢字串引用的方法來破可能還會簡單得多,我沒這樣做,因為……還不熟,找註冊碼就更沒本事了。嘿嘿!

後記:
本文在打字過程中完成50%左右時正待儲存,卻出來個儲存錯誤,然後Uedit32被中止,我差點氣暈,趕忙啟動TRW2000,查詢記憶體中的"IRVIEW.INI",結果萬幸,找到了我這可憐的半篇文章。但VMM模式下不可寫盤,我於是下個BPX HMEMCPY,暫時退出,隨便在那個程式的框中敲一字元,斷時就脫離VMM模式了,來個w,好,總算沒浪費力氣。
――Passion寫於情人節後兩天。

相關文章