請選擇 進入手機版 | 繼續訪問電腦版

微剋多資訊

 找回密碼
 註冊

Login

搜索
回覆 6則 瀏覽 1635篇

[工具] 從.msi檔抓出其中的系統登錄碼

該用戶從未簽到

發表於 2013-6-4 21:25 | 顯示全部樓層 |閱讀模式
有些時候想用免安裝軟體的便利,但有時免安裝版的某些功能仍需要登錄碼才會有作用
以7-zip這套軟體為例(只是舉例,這軟體本身還是會動到登錄碼)
免安裝版的沒有快捷選單(pop-up menu),這在使用上有點不便
可以從7-zip的.msi安裝檔中抓出其中的系統登錄碼,設法匯入這些登錄碼,就可讓快捷選單出現

當然以此例而言也能用像FileMenuTools做出類似的選單
也可利用RegScanner,在安裝完7-zip後,找出所有關於7-zip的登錄碼。(這時找到的就不只是安裝程式所寫入的登錄碼而已)
但這裡主要討論「從.msi檔抓出其中的系統登錄碼」這話題

同樣以7-zip.msi為例
UniExtract可解.msi,取出其中的檔案


而要找出.msi檔中的系統登錄碼,可利用.msi編輯軟體
這類軟體有不少
這裡僅提供兩套可免費使用的軟體
一是InstEdit,安裝檔約4.5 mb
另一是Advanced Installer,安裝檔約52 mb

相對於其它同類型的商業軟體,小巧很多,當然功能也可能少了許多

以下就以InstEdit為範例,將7-zip官網上目前供下載的安裝檔7z920-x64.msi,找出其中的登錄碼
軟體的安裝過程就略過不提

安裝好InstEdit後,開啟7z920-x64.msi
參照圖解,移到Registry這個表格,可以發現有11條登錄碼,這是在安裝時會寫入的


請看一下Root那一欄,它是用代碼表示。將滑鼠移過去,可發現1是代表HKEY_CURRENT_USER
順便把另兩個代碼一併列出
0: HKEY_CLASS_ROOT
2: HKEY_LOCAL_MACHINE

Value欄中的那個[INSTALLDIR]就是指軟體的安裝所在

圖中較有用的欄位是Root, Key, Name, Value
知道了這11條登錄碼,只要設法將這11條的東西寫入系統登碼,就可生效(假設已用了免安裝版的7-zip)

方法有幾種,如:
  • 自行用regedit.exe逐條編輯。但下回同樣工作,還是得再人工作業一次,太累人了
  • 將其編輯成一個.reg檔,存檔後雙擊可將其匯入。那個[INSTALLDIR]也要視實際情形修改
  • 利用reg.exe的方式寫入登錄
  • 將Registry表格匯出存成一.idt的純文字檔。

    接著以InstEdit新增一個Package(即新增一個.msi檔),將該.idt匯入,

    並做適當的修改,使這個.msi變成一個專門設置登錄碼的安裝檔。這點自己沒實際做過,但應該是可行的
  • 類似前一作法,不過是改用其它種安裝程式製作軟體,如InnoSetupNSIS,編寫安裝腳本,做成專門設置登錄碼的安裝檔


這裡採用最後一個方法,以InnoSetup為例
InnoSetup有個Third Party(第三方,小三??? )工具叫Inno Script Studio,方便以圖形界面編寫腳本,如下圖


為何圖中是12條?因為新增的那一條是為了方便移除(反安裝)軟體時,可把安裝時寫入的的登錄檔也移除乾淨。(但事實上7-zip程式本身還是會寫入其它的登錄值,所以即使這裡的11條移除乾淨,還是會殘留其它的值)

完整的腳本像這樣
  1. [Setup]
  2. DefaultDirName={pf}\7-Zip
  3. AppName=7-Zip
  4. AppVersion= 9.20
  5. ShowLanguageDialog=no
  6. DisableProgramGroupPage=yes
  7. ArchitecturesInstallIn64BitMode=x64
  8. AllowUNCPath=false
  9. OutputBaseFilename=7z920-x64_reg
  10. DisableWelcomePage=true
  11. UsePreviousGroup=false
  12. EnableDirDoesntExistWarning=True
  13. DirExistsWarning=no

  14. [Registry]
  15. Root: "HKLM"; Subkey: "Software\7-Zip"; ValueType: string; ValueName: "Path"; ValueData: "{app}"; Flags: uninsdeletekey
  16. Root: "HKLM"; Subkey: "Software\Microsoft\Windows\CurrentVersion\App Paths\7zFM.exe"; ValueType: string; ValueData: "{app}\7zFM.exe"; Flags: uninsdeletekey
  17. Root: "HKLM"; Subkey: "Software\Microsoft\Windows\CurrentVersion\App Paths\7zFM.exe"; ValueType: string; ValueName: "Path"; ValueData: "{app}\"
  18. Root: "HKLM"; Subkey: "Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved"; ValueType: string; ValueName: "{{23170F69-40C1-278A-1000-000100020000}"; ValueData: "7-Zip Shell Extension"; Flags: uninsdeletevalue
  19. Root: "HKCR"; Subkey: "*\shellex\ContextMenuHandlers\7-Zip"; ValueType: string; ValueData: "{{23170F69-40C1-278A-1000-000100020000}"; Flags: uninsdeletekey
  20. Root: "HKCR"; Subkey: "CLSID\{{23170F69-40C1-278A-1000-000100020000}"; ValueType: none; Flags: uninsdeletekey
  21. Root: "HKCR"; Subkey: "CLSID\{{23170F69-40C1-278A-1000-000100020000}\InprocServer32"; ValueType: string; ValueData: "{app}\7-zip.dll"
  22. Root: "HKCR"; Subkey: "CLSID\{{23170F69-40C1-278A-1000-000100020000}\InprocServer32"; ValueType: string; ValueName: "ThreadingModel"; ValueData: "Apartment"
  23. Root: "HKCR"; Subkey: "Directory\shellex\DragDropHandlers\7-Zip"; ValueType: string; ValueData: "{{23170F69-40C1-278A-1000-000100020000}"; Flags: uninsdeletekey
  24. Root: "HKCR"; Subkey: "Directory\shellex\ContextMenuHandlers\7-Zip"; ValueType: string; ValueData: "{{23170F69-40C1-278A-1000-000100020000}"; Flags: uninsdeletekey
  25. Root: "HKCR"; Subkey: "Drive\shellex\DragDropHandlers\7-Zip"; ValueType: string; ValueData: "{{23170F69-40C1-278A-1000-000100020000}"; Flags: uninsdeletekey
  26. Root: "HKCU"; Subkey: "Software\7-Zip"; ValueType: string; ValueName: "Path"; ValueData: "{app}\"; Flags: uninsdeletekey
複製代碼
此腳本是有包含移除功能的,若不需要,在[Setup]後面加上這行即可
  1. Uninstallable=no
複製代碼
把做好的腳本編譯成執行檔
執行時選好7-zip的所在位置,假設是在D:\7-zip


此例中的那個7-zip字串自動加上,所以選到D:的位置即可

本例的腳本與安裝檔下載

相關參考

本帖子中包含更多資源

您需要 登入 才可以下載或查看,沒有帳號?註冊

x
  • 詳細解說,熱心助人

    csihcs 貢獻度 +10

  • 好文,這不加分真的不行

    rictirse 貢獻度 +35

  • 詳細解說,熱心助人

    gary8349 貢獻度 +20

該用戶從未簽到

 樓主| 發表於 2013-6-4 22:36 | 顯示全部樓層
本帖最後由 divale 於 2013-6-4 22:37 編輯
citiciti 發表於 2013-6-4 22:00
這樣大費周章, 也寫了登錄碼, 有比直接安裝好嗎? 請賜教!

就看情形囉
有些人並不愛用安裝版

譬如
有時免安裝版軟體放在隨身碟可隨插即用,也許暫時只是借用人家的電腦
此時若需要寫入登錄,可能也是臨時性的

再者,若軟體是較大的,在別人的電腦安裝,也許人家也不太願意

另一個例子
若用的是安裝版,這回假設是較大的軟體,安裝要較多時間
系統不幸要重灌,要用該軟體時,也要再灌一次
若用免安裝版,就沒這必要了

從版上分享的軟體有不少是免安裝版來看,習慣用免安裝版的人應該不在少數

其實若要簡單點,用方法4是最快的,只是匯出再匯入的動作而已,再調整一下就是了
用InnoSetup只是自己的偏好習慣而已,而且有些用InnoSetup做的安裝程式,要解出其中的登錄碼,根本比.msi簡單太多了,只要把不需要的腳本部分刪掉即可,簡單的要命

使用道具

該用戶從未簽到

 樓主| 發表於 2013-6-4 23:30 | 顯示全部樓層
本帖最後由 divale 於 2013-6-4 23:43 編輯

順便補充幾點相關的

一般較常見的安裝程式製作軟體產生的格式大約有幾大類
一是前述的.msi
二是NSIS
三是InnoSetup
二、三所用的的副檔名都是.exe
當然還有其它種,這裡只列常見的

前述三者中的安裝程式檔案,一般都可利用UniExtract解出
但NSIS與Inno Setup都有加密模組,若採用加密時,裡面的檔案就不是那麼容易被解出(除了執行安裝程式本身會把檔案解出)

NSIS安裝檔中的安裝腳本在加入安裝檔時有做了部分編譯
要解出其中的安裝腳本,只能用7-zip 4.4 beta這個版本,其它版本能解出其中的其它檔案,但無法解出安裝腳本
即使解出安裝腳本,因做了部分編譯,看得到的內容也與原本相差很多,要還原恐怕也是大費周章
上述關於NSIS這段文字可參見這篇
這種要瞭解安裝腳本的內容,並非完全不可能,但要多花些功夫,較為麻煩

InnoSetup若沒加密,解開後即可找到安裝腳本,內容很容易辨識,幾乎可以說是與原來的一模一樣(除了檔案來源改用{app}表示以外,因檔案解開是放在{app}目錄下的。另外就是若其中有用了進階的pascal script功能,這部分會被編譯成.dll,但會用到這種進階功能的,並不是很常見)
※一樓本文中的那個腳本,是在圖形界面中做的,只有那個登錄碼[Registry]那段較囉嗦,要對照那11條逐一填入,前面的[Setup]那段則只是看圖填文字而已,腳本是自動產生的。對了,其中有指定了x64,只能在64位元環境執行

所以若有人做了某種軟體,想讓自己做出的安裝程式能方便別人改裝成免安裝版,要採用何種製作軟體?應該很清楚了,可參考上述文字
據觀察,多數的軟體,其安裝程式一般都不會採加密的
  • 詳細解說,熱心助人

    gary8349 貢獻度 +20

使用道具

該用戶從未簽到

 樓主| 發表於 2013-6-5 21:04 | 顯示全部樓層
謝謝G大的評分鼓勵

這些是自己從別人那裡學來的東西,不然憑自己肉腳程度,哪懂這些作法。只是把學上手的東西運用在不同用途罷了

那麼我聽來的這作法原來是運用在哪方面呢?以下就以一個虛擬假設的故事來做說明好了

A君在某機構擔任資訊人員的工作,該機構有套常用的軟體要安裝在每個員工的PC上,PC數大約50幾台。因沒有軟體派送系統,且安裝時需要管理員權限,並要輸入軟體授權碼,所以A君要親自到每台PC安了。除了購入該軟體首次使用時的安裝外,還有以下這些狀況也是安裝該軟體的時機:
  • 購入新PC
  • 舊機OS升級重灌
  • 舊機維修後重灌(有採用系統還原時,尚可省些事)

該軟體是機構長久以來,以及未來都會使用的常用軟體,總之這套軟體會帶給A君超過上百次的安裝機會

而安裝一次也要花費不少時間與精神,因為情況如下:
  • 安裝原始版本軟體時,要輸入一大串幾十個字元長到令人記都記不住的軟體授權碼,有數個畫面供勾選以下項目如:
    • 確認使用協議
    • 安裝目的資料夾
    • 軟體元件
    • 建立程式群組與捷徑

    林林總總免不了要勾勾選選不少次
  • 原始版本裝完後,還有升級版程式,要再輸入一次一大串授權碼
  • 可能還再加上幾個補丁檔(哪有人做的這麼麻煩的?不信哦?看看這個如何?)
  • 軟體是外國人寫的,所以要再裝多國語系檔,而這個語系的豬頭安裝程式不但裝了中文檔,也把一般華人看不懂的希臘文、突厥文、梵文、蝌蚪文、蚯蚓文…都裝了進去(很多軟體都這麼搞,如LibreOffice)。致佔了太多硬碟空間,還要自行人工刪除
  • 事情還沒完,還要加裝幾個外掛程式、模組或附加元件之類的東西,啥?又要輸入另一組長到令人結巴的軟體序號?沒辦法啦,外掛程式是另一家軟體廠商寫的,所以又是另一組序號呀!

就像這樣,要完整安裝這套軟體,必須執行8個安裝程式,輸入四、五次序號之類的字串,從數十個視窗畫面勾勾選選一、二十項的設定…

A君心中不免暗地咒罵:「槓!安裝這什麼鳥軟體?這麼折騰人,真不是人幹的工作。」於是思考有無較方便的方式。
有種方式是用AutoIt來應付這種狀況,但這老兄選擇另一種作法

他設法查出這8個安裝程式,裝了什麼檔案到什麼位置,寫入哪些系統登錄碼。並發現到,像填寫軟體授權碼時,是會寫入某幾個特定的註冊檔案中(如.dll檔),或登錄碼中。了解了這些東西,A君就乾脆利用InnoSetup把這些東西全打包在另一新的安裝程式中,那些註冊檔、登錄碼也都在其中了,並把不必要的語系檔排除掉。
因為在機構中,這軟體都是裝在固定目錄,用相同軟體元件、程式群組…所以這些設定也一併固定做在此安裝程式中,就不需要在安裝過程中勾勾選選。

於是做出只需一個安裝畫面,真正一鍵搞定的安裝程式。用這作法也用不著AutoIt了。若在往後,該軟體出新的更新程式,只要直接將之前做好的安裝程式檔案解開,加入新的檔案,重新編譯產生新版的安裝程式檔即可。若是用AutoIt的作法,便要把之前做的執行8個安裝檔的AutoIt程式,再補加上執行這次新的更新程式,相對上會較為麻煩

就這樣從原本繁鎖的8次安裝工作變成一鍵安裝,人生豈不快哉?當然過程也是要花些心力就是了

而用InnoSetup的作法還有個好處是,只要有留住新產生的安裝程式檔案,即使將之前InnoSetup專案中做包裝編譯的檔案給刪了(也許是佔太多空間,不想保留),安裝腳本也不見了,只要從安裝程式檔中解開即可取得安裝腳本,且如前述,加入更新修正也很方便

※以往用.msi常發生裝完後,下回啟動主程式時,又出現要求放入安裝光碟的視窗,煩不勝煩。而用InnoSetup做的安裝,不會有此情形,且配合圖形界面使用上也很直覺,好用又簡單,這也是故事中A君不愛.msi而是採InnoSetup的原因之一

以上故事結束,再提另一種例子,看倌們應該多少有遇過的情形

某些「好用」軟體總是受人歡迎,這類軟體原本安裝完後要再輸入註冊碼或加入破解檔才能正常使用或擁有完整功能。而網路上總是會有好心人分享這種軟體的「更好用」版本,安裝後即可正常使用,無需再另行註冊、破解、甚至中文化。其作法就類似上述
但要用這種「更好用」軟體要注意來源的可靠性,不然可能要擔心其中是否被加入惡意程式、廣告、木馬、病毒…的風險

呵,不小心透露了別人的手法,不過應該沒關係,這也不是什麼天大機密,且已經算普遍了。要謝謝這些人採用了這些作法,讓大家能更方便使用這些好用的軟體啦!

自己只是把從別人那裡看到聽到學到的見聞,在這裡改用自己的文字做個轉述與分享,也謝謝各位看倌耐心觀賞
哈!不意竟寫了超過2小時。也算是順便練練打字吧!

使用道具

該用戶從未簽到

發表於 2013-6-11 18:48 | 顯示全部樓層
又學一招, 可以比對一下 TOTAL UNINSTALL 的登錄,
對於可以做出更好的免裝軟體十分有用呢

使用道具

該用戶從未簽到

發表於 2013-6-13 11:18 | 顯示全部樓層
以前常用universal extractor來把一些執行程式解開,叢中即可獲得免安裝檔,不過有時解不開,或解開也無法使用,如今經過版大解說,豁然開朗,受益良多,感謝

使用道具

該用戶從未簽到

 樓主| 發表於 2013-6-13 16:07 | 顯示全部樓層
pctom 發表於 2013-6-13 11:18
以前常用universal extractor來把一些執行程式解開,叢中即可獲得免安裝檔,不過有時解不開,或解開也無法使用 ...

以前自己也遇過一種解不開的情形,是上述沒提到的,這裡也順便補充一下

上述提到使用加密功能時會無法解開
而自己之前遇到的另一種解不開的情形是像這樣
安裝檔是以較新版的InnoSetup所製作,採用的壓縮演算法較新版
而所用的Universal Extractor,其中附的7-zip工具版本較舊(因InnoSetup通常採lzma壓縮,故UE會以7-zip解這種安裝檔),無法解較新版的壓縮格式
後來,將UE其中的7-zip工具換成最近的版本就可以了,UE本身並不用換新

1 0

使用道具

您需要登入後才可以回帖 登入 | 註冊

本版積分規則

Discuz! X

© 2009-2017 Microduo

快速回覆 返回頂部 返回列表