SoftICE4.05 for win9x的安裝序列號破解(1) (11千字)
SoftICE4.05 for win9x的安裝序列號破解(1)
Passion
破解InstallShield安裝序列號應該說有一套稍微“專門”的一點的方案,準備寫出來和大家交流交流。一般對於5.5版本以下的InstallShield可以用專門的*.INS檔案反編譯器來分析其安裝流程,這比起分析setup.exe來說似乎大多數情況下都能起到事半功倍的效果。(例外?當然有,這個就是。^_^)
對於Cracker來說,SoftICE4.05的序列號怕不少朋友都記住了。這裡拿這個破解工具開刀有好幾個原因:第一就是這個要跳過序列號檢驗很簡單,但要尋出可用序列號來便有些難度,第二就是這個INSTALLSHIELD比較典型全面,既有普通的安裝過程,又有大量的外部程式呼叫,能讀懂它再讀其他的應該也就沒什麼問題,第三便是由於皮大客的點將了。廢話少說,先用ISDCC2反編譯setup.ins再說:
isdcc2 setup.ins > sice405.txt
反編譯出來的文件還不小,其中含有大量的外部DLL呼叫,如檢測滑鼠設定顯示卡等,要找出序列號判斷的地方還真不容易。
開啟sice405.txt,第一條路是查出錯資訊“The serial …… invalid ……”(不好意思,忘了,反正只查一兩個單詞),結果呢?沒有!(事實上出錯提示是在嵌入的外部動態連結庫nminst32.dll中。)
第二條路,查字串“MESSAGEBOX”,找倒是能找到一大片,可惜大多數明文的出錯資訊都不是我們要找的,有兩三個類似於MessageBox(string2,
-65534);等字樣的,也弄不拎清這個string2到底在哪兒被賦值了,想來想去,也不容易成。
第三條路,從頭細細看,看哪兒有突破口。這號反編譯出來的東西,前邊一點點是主程式,後邊一大部分是各種各樣的function實現部分,因此先看看程式體:(雖然相對來講不多,可貼出來不少哇!)
// ------------- MAIN PROGRAM CODE --------------
program
start:
00136E:0002: Disable(12);
001375:0021: number60 = 0;
00137F:0021: number56 = 0;
001389:0021: number59 = 0;
001393:0021: number51 = 1;
00139D:0021: number70 = 0;
0013A7:0021: number49 = 0;
0013B1:00B5: function109();
0013B9:00B5: function107();
0013C1:00B5: function108();
//估計是檢驗作業系統。
0013C9:0022: if (number63 = 0) then
goto label2;
endif;
……
//省略NT部分的一些處理過程。
//這裡下面要裝載一些DLL來進行安裝,如果裝載失敗則出錯。
label1:
001690:0125: string22 = SUPPORTDIR ^ "NMINST32.dll";
0016A7:00B2: UseDLL(string22);
0016AC:0021: number71 = LAST_RESULT;
0016B4:0128: number71 = number71 != 0;
0016C6:0022: if (number71 = 0) then
goto label3;
endif;
0016D4:002A: MessageBox("Setup is unable to load the support DLLs
needed to perform this SoftICE installation.", -65533);
001733:002B: exit;
label2:
001739:0125: string23 = SUPPORTDIR ^ "SINSETUP.dll";
001750:00B2: UseDLL(string23);
………………… //省略部分程式碼
001826:002A: MessageBox("Setup is unable to load the support DLLs
needed to perform this SoftICE installation.", -65533);
001885:002B: exit;
//以上是一些DLL的裝載過程。下面正式開始安裝過程。
//由於安裝程式執行時,順序是封面、協議、序列號,因此序列號檢驗怎麼也不會太靠後。
label4:
00188B:0013: string30 = "";
001893:0013: string31 = "";
00189B:0021: number64 = 0;
0018A5:0021: number65 = 0;
0018AF:0021: number66 = 0;
0018B9:0021: number61 = 0;
0018C3:0021: number68 = 4;
0018CD:0021: number69 = 0;
0018D7:0021: number67 = 4;
0018E1:00B5: function140();
//注意這個Function
0018E9:0021: number71 = LAST_RESULT;
0018F1:0128: number71 = number71 = 1;
001903:0022: if (number71 = 0) then
goto label6;
endif;
001911:00B5: function141();
label5:
00191D:0022: if (0 = 0) then
goto label8;
endif;
………… //省略部分程式碼
label7:
001990:0128: number71 = number62 = 1;
0019A2:0022: if (number71 = 0) then
goto label9;
endif;
0019B0:0023: StrCompare(string13, "");
0019B8:0128: number71 = LAST_RESULT = 0;
0019CA:0022: if (number71 = 0) then
goto label9;
endif;
0019D8:002A: MessageBox("Unable to verify Serial Number. \n This
program will now exit!", -65533);
001A1F:0159: abort;
//這裡大概是要裝入DLL檔案來檢驗序列號。
//這下面的大概就沒用了,省之。
label8:
001A25:00B5: function99();
001A2D:0021: number71 = LAST_RESULT;
001A35:0128: number71 = number71 < 0;
001A47:0022: if (number71 = 0) then
goto label10;
endif;
001A55:002C: goto label21;
………… //省略其他大部分安裝程式碼。
001D43:00B3: UnUseDLL(string22);
001D48:00B3: UnUseDLL(string24);
001D4D:00B3: UnUseDLL(string23);
001D52:0159: abort;
label22:
001D58:002B: exit;
endprogram
需要看看那個function140();的呼叫,下面是function140()的程式碼:
它完成的功能是檢驗登錄檔裡是否有SICE的註冊資訊,如果有則讀出來檢驗檢驗是否正確,如果正確則填到序列號輸入框中免得再辛苦,這種體貼使用者的做法可真不忍心來破哇!――但既然輸入介面的檢驗過程難找,有這個檢驗過程也不錯嘛!
// ------------- FUNCTION function140 --------------
function function140()
number lNumber0;
number lNumber1;
number lNumber2;
number lNumber3;
number lNumber4;
number lNumber5;
number lNumber6;
number lNumber7;
string lString0;
string lString1;
string lString2;
string lString3;
string lString4;
begin
label158:
005CB5:0110: RegDBSetDefaultRoot(-2147483646);
//就是H_L_M
005CBC:0088: RegDBKeyExist("\\Software\\NuMega\\SoftICE");
005CD9:0021: lNumber6 = LAST_RESULT;
005CE1:0128: lNumber6 = lNumber6 = 1;
005CF3:0022: if (lNumber6 = 0) then
goto label160;
endif;
005D01:0013: lString2 = "\\Software\\NuMega\\SoftICE";
005D21:002C: goto label161;
005D2A:0013: lString2 = "\\Software\\Nu-Mega\\SoftICE";
label160:
005D4F:0152: RegDBGetKeyValueEx(lString2, "InstallDir",
lNumber1, lString0, lNumber0);
005D6A:0021: number50 = LAST_RESULT;
005D72:0128: lNumber6 = number50 = 0;
005D84:0022: if (lNumber6 = 0) then
goto label162;
endif;
005D92:0013: string10 = lString0;
label161:
005D9E:0152: RegDBGetKeyValueEx(lString2, "User",
lNumber1, lString0, lNumber0);
005DB3:0021: number50 = LAST_RESULT;
005DBB:0128: lNumber6 = number50 = 0;
005DCD:0022: if (lNumber6 = 0) then
goto label163;
endif;
005DDB:0013: string11 = lString0;
label162:
005DE7:0152: RegDBGetKeyValueEx(lString2, "Company",
lNumber1, lString0, lNumber0);
005DFF:0021: number50 = LAST_RESULT;
005E07:0128: lNumber6 = number50 = 0;
005E19:0022: if (lNumber6 = 0) then
goto label164;
endif;
005E27:0013: string12 = lString0;
label163:
005E33:0128: lNumber6 = number62 = 1;
005E45:0022: if (lNumber6 = 0) then
goto label166;
endif;
005E53:0021: lNumber5 = 0;
005E5D:0013: TARGETDIR = string10;
005E65:0125: lString4 = TARGETDIR ^ "\\nmtrans.dll";
005E7C:007C: GetFileInfo(lString4, 4, lNumber3, lString3);
005E8C:0125: lString4 = TARGETDIR ^ "\\loader32.exe";
005EA4:007C: GetFileInfo(lString4, 4, lNumber4, lString3);
005EB4:0128: lNumber6 = lNumber3 = 0x8bc00;
005EC6:0128: lNumber7 = lNumber4 = 0x1c4fec;
005ED8:0127: lNumber6 = lNumber6 && lNumber7;
005EE3:0022: if (lNumber6 = 0) then
goto label165;
endif;
005EF1:0021: lNumber5 = 1;
label164:
005EFF:0128: lNumber6 = lNumber5 = 0;
005F11:0022: if (lNumber6 = 0) then
goto label166;
endif;
005F1F:002A: MessageBox("Setup could not locate the
correct version of \n SoftIce to update and thus will exit!", -65533);
005F7E:0159: abort;
//上面從登錄檔裡讀安裝路徑、使用者名稱、公司資訊、版本號等。
label165:
005F84:0152: RegDBGetKeyValueEx(lString2, "Serial",
lNumber1, lString0, lNumber0);
005F9B:0021: number50 = LAST_RESULT;
005FA3:00B5: function143(lString0); //讀出序列號後的這個Function重要!
005FAE:0021: lNumber6 = LAST_RESULT;
005FB6:0128: lNumber6 = lNumber6 = 1;
005FC8:0022: if (lNumber6 = 0) then
goto label167;
endif;
005FD6:0013: string13 = lString0;
005FDE:012F: return(1);
005FE7:002C: goto label168;
label166:
005FF0:012F: return(0);
label167:
005FFD:012F: return(0);
006006:00B8: return;
一層層跟下去,看function143的程式碼,很好,不太長:
// ------------- FUNCTION function143 --------------
function function143(pString0)
number lNumber0;
number lNumber1;
string lString0;
string lString1;
string lString2;
string lString3;
string lString4;
string lString5;
string lString6;
begin
//sice的序列號形如xxxx-xxxxxx-xx,儲存在登錄檔裡的也是這個格式。
label190:
0067BE:002F: StrLength(pString0);
0067C3:0021: lNumber1 = LAST_RESULT;
0067CB:0128: lNumber1 = lNumber1 != 14;
0067DD:0022: if (lNumber1 = 0) then
goto label192;
endif;
0067EB:012F: return(0);
//這裡我懷疑有編譯錯誤,應該是如果序列號長14則序次執行到這裡,否則返回0。
0067F8:0030: StrSub(lString1, pString0, 0, 4);
00680A:0030: StrSub(lString2, pString0, 5, 6);
00681C:0030: StrSub(lString3, pString0, 12, 2);
//從登錄檔裡的序列號中取除“-”號外的子串。
00682E:0124: lString6 = lString1 + lString2;
006839:0124: lString0 = lString6 + lString3;
//再拼起來,也就是相當於序列號去掉“-”號。
//下面仍舊懷疑有誤。
006844:0031: StrFind(lString0, "-");
00684D:0128: lNumber1 = LAST_RESULT >= 0;
00685F:0022: if (lNumber1 = 0) then
goto label193;
endif;
00686D:012F: return(0);
label192:
00687A:0125: lString5 = SUPPORTDIR ^ "UTILITY.dll";
006890:00B2: UseDLL(lString5);
//裝載utility.dll來準備進行進一步的序列號檢驗。
006895:0021: lNumber1 = LAST_RESULT;
00689D:0128: lNumber1 = lNumber1 = 0;
0068AF:0022: if (lNumber1 = 0) then
goto label194;
endif;
0068BD:00B4: UTILITY.DigitCheck(lString0);
//這一步是關鍵檢驗過程。
0068C5:0021: lNumber0 = LAST_RESULT;
0068CD:00B3: UnUseDLL(lString5);
label193:
0068D6:0128: lNumber1 = lNumber0 = 1;
0068E8:0022: if (lNumber1 = 0) then
goto label195;
endif;
0068F6:012F: return(1);
//序列號正確則返回1。
0068FF:002C: goto label196;
label194:
006908:012F: return(0);
label195:
006915:00B8: return;
end;
這段說明,SOFTICE安裝時會讀取登錄檔中的序列號資訊(如果有的話)並且進行判斷,這一段的機制與效果和檢驗輸入的序列號是否正確是一樣的。
現在就UTILITY.DigitCheck(lString0);是關鍵了,引數是去掉了“-”號的序列號。
SOFTICE安裝程式執行時會在windows/temp目錄下生成一些臨時的目錄和檔案,其中就包括剛才提到的
utility.dll,下面是其DigitCheck的輸出程式碼。
跟蹤過程也不算太複雜,先填序列號,我填的是5100-0099BB-BB,下斷bpx loadlibrarya do "d esp->8"看載入的DLL檔名,等按“Next”按鈕的時候便會裝入UTILITY.DLL,因此斷在系統領空,返回後看看MOD
UTILITY,我機子上的BASE是1BC0000,因此下面的地址都有一步重定位的變換,為了簡明起見,我使用1000000做基址,這與W32DASM的反彙編程式碼相符合。
digitcheck的入口是1110,因此下斷bpx 0167:1bc1110,斷後便開始了漫長的跟蹤過程。(見下篇)
相關文章
- PhpStorm 2023 啟用序列號最新+PhpStorm 2023 破解安裝包v2023.32023-12-13PHPORM
- IDEA的使用(1):IDEA的安裝和破解2018-06-16Idea
- abbyy finereader14序列號 附安裝教程2020-10-12
- cad2020序列號和金鑰大全 cad2020序列號和金鑰安裝教程2021-11-27
- cad2020序列號和金鑰分享 cad2020序列號和金鑰安裝教程2021-11-10
- AutoCAD2014序列號和金鑰分享 AutoCAD2014序列號和金鑰安裝步驟2022-03-01
- wps office 2019 Pro Plus 整合序列號Vba安裝版2024-07-18
- server2003安裝金鑰 server金鑰序列號2022-03-08Server
- 11月1號2024-11-06
- GX Works2安裝教程(含序列號+圖文教程)2020-09-14
- revit2020序列號和金鑰 revit2020安裝教程2022-04-06
- revit2019序列號和金鑰 revit2019安裝教程2022-03-09
- maya2019序列號和金鑰 maya2019安裝教程2022-04-12
- Resolume Arena 7啟用序列號 Resolume Arena 7破解中文2023-10-26
- windows安裝mysql以及安裝Navicat Premium並破解的方法2018-04-09WindowsMySqlREM
- maya2015序列號和金鑰 Maya2015安裝步驟2022-03-10
- IntelliJ IDEA安裝和破解2019-02-27IntelliJIdea
- 中文BetterMouse破解安裝包2024-01-09
- Oracle 11G RAC叢集安裝(1)——安裝前的準備2020-02-15Oracle
- cad2010序列號和金鑰64位最新通用版 cad2010序列號和金鑰安裝教程詳解2021-12-02
- 11. Oracle for Linux安裝和配置——11.2. Linux安裝和配置——11.2.2.Linux安裝(1)2020-03-08OracleLinux
- MyEclipse2017安裝與破解2018-07-13Eclipse
- 【Oracle】Windows安裝oracle11gR1 database 11.1.0.62018-04-23OracleWindowsDatabase
- pycharm pro啟用序列號最新+pycharm pro漢化破解版2023-12-06PyCharm
- 民間大神破解Windows 11安卓系統2021-11-05Windows安卓
- 技術分享| 如何部署安裝分散式序列號生成器系統2022-06-02分散式
- office2021破解版安裝教程及安裝包2023-05-06
- 【親測可用】maya2024序列號和金鑰 及maya2024破解教程 相容M1/M22024-01-13
- 支援M1 Redis Desktop Manager Mac中文破解版+RDM安裝教程2024-03-06RedisMac
- Mac破解版 Navicat Premium 15 for Mac附安裝教程支援M12023-10-09MacREM
- 序列處理工具Seqkit的安裝以及使用2024-12-01
- oracle11g的安裝,及plsql developer11的安裝、漢化和註冊2018-07-22OracleSQLDeveloper
- apache的安裝和修改埠號2024-03-03Apache
- 破解某美容美髮管理系統加密狗、註冊碼、序列號的研究分析2018-06-14加密
- 11. Oracle for Linux安裝和配置——11.2. Linux安裝和配置——11.2.4. Linux命令(1)2020-03-11OracleLinux
- cad2018序列號和金鑰大全及安裝教程(包含32位及64位)2022-02-28
- SecureCRT For Mac 7.3.0破解版安裝教程、2018-11-09SecurecrtMac
- Axure RP 8 for Mac 序列號啟用 附 完整圖文安裝教程 支援M12023-11-10Mac
- 1. swoole 的安裝2018-06-04