破解紅外遙控編碼分析儀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寫於情人節後兩天。