StarUML破解筆記
1.前言
這個學期開了uml的課程,老師讓下載了一個staruml,結果不是個免費軟體,看了一價格竟然要70美元,於是就看看能不能試著破解一下。雖然過程中查到網上有許多教程,不過都是直接改文件的那種,但是本著學習的態度,我決定從頭到尾開始弄,最後做個激活碼生成的工具來,雖然並不是很難,但是卻也學到不少東西。
2.過程
首先進入StarUML的安裝目錄,發現是nodejs寫的,然後打開軟體,在輸入激活碼的地方隨意輸入下試試,返回錯誤信息:,進入其根目錄下的www目錄,裡面有個main.js,體積挺大,打開試著查詢了下剛才返回的錯誤提示,還真有,而且,還意外的看到其上方有一個RSA的私鑰,然後我猜著估計就是RSA加密的密鑰,可惜不知道數據格式,接著分析。
在www目錄里有個license目錄,進入裡面發現有個node,再進入node目錄發現有一個叫的文件,打開後可以清楚的看到其驗證激活碼的函數,代碼如下:
varNodeRSA=require("node-rsa");
functionvalidate(PK,name,product,licenseKey){
varpk,decrypted;
try{
pk=newNodeRSA(PK);
decrypted=pk.decrypt(licenseKey,"utf8");
}catch(err){
returnfalse;
}
varterms=decrypted.trim().split("
");
if(terms[]===name&&terms[1]===product){
return{
name:name,
product:product,
licenseType:terms[2],
quantity:terms[3],
licenseKey:licenseKey
};
}else{
returnfalse;
}
}
通過代碼可以知道,激活碼里可能主要有以下幾個屬性:
name
product
licenseType
quantity
屬性之間使用來分隔,各部分都是幹嘛還是挺明了的,不過具體值是什麼還是要接著分析,但是這下我們已經知道了其數據的主要格式了,又因為目前我們現在只知道私鑰,並不知道公鑰,無法加密,於是我們通過私鑰來生成公鑰,首先將私鑰保存到文件,將裡面的
給替換成換行符,然後使用openssl來求公鑰,命令如下:
運行後,我們便可以得到公鑰。
然後回到mian.js這個文件接著分析,在錯誤提示的附近可以找到這樣一段代碼:
這個是調用剛才的那個激活碼驗證的函數,可以看到傳入的參數,由傳入的參數可以知道,product的值是的值,那麼這個屬性是什麼呢,在www目錄中有個文件,打開可以看到有個的屬性,這個就是product的值。然後應該是用戶名,這樣只剩下licensetype和quantity沒有解決了,繼續分析main.js,在向下分析的時候,看到這樣一段代碼:
varlicenseStatus=LicenseManager.getStatus();
if(licenseStatus===LicenseManager.STAT_REGISTERED){
varinfo=LicenseManager.getLicenseInfo(),
licenseTypeName;
switch(info.licenseType){
case"PS":
licenseTypeName="Personal";
break;
case"CO":
licenseTypeName="Commercial";
break;
case"ED":
licenseTypeName="Educational";
break;
case"CR":
licenseTypeName="Classroom";
break;
}
$license.html("Licensed to "+info.name);
$licenseType.html(licenseTypeName+" License");
$quantity.html(info.quantity+" User(s)");
這是個關於裡面顯示的,如果我們註冊成功就會顯示相應的註冊信息,裡面有個switch,可以看到所擁有的幾個licesetype值,以及下面的quantity可以知道是類似於註冊給誰或哪個組織的那種東西,於是,至此,這樣東西就全明白了,可以開始生成註冊碼了。
在一開始我是用php寫的,但是一直不對,後來查詢了一下,因為staruml使用的是node-rsa這個模塊,而這個模塊默認使用的是pskc#1 oaep填充的方式,而php的openssl相關函數默認使用的pskc#1的填充方式,但是我把填充方式改成oaep的時候,卻無法返回任何值,也沒有查到相關資料,困擾了好久最後還是決定使用nodejs來寫了,畢竟可以直接用他的node-rsa模塊,最終生成的密文使用base64加密。代碼沒有什麼難度,主要代碼如下:
varNodeRSA=require("node-rsa");//引入模塊
varkey=newNodeRSA(pk);//載入公鑰
res.write(key.encrypt(data,"base64"));//加密數據
TAG:信安之殤 |