標題有點無厘頭,不過說穿了是個簡單的技巧而已。

首先,我猜有更好的做法,如有網友說可用 LoadResource / LoadResourceString 方式完成。

 

問題敘述

 

(1) Q1 : 一開始我用 C/C++ 產生 exe,這個 exe 像是直譯器,會去讀某個 script file,做相對應的事。但如此一來,要在某台電腦裡執行某些 script 時,就必須要給兩個檔案 (exe 和 script ),有辦法包成一個就好嗎?

(2) Q2 : 程式有接硬體,程式碼裡某項功能有鎖特定之硬體序號等資訊(將近 1KB 資訊),但每次客戶有需求時,就必須要把硬體序號等資訊重新改過,再  rebuild 過。有辦法不重新 rebuild 嗎?

 

Sol

 

關於問題 (1) 其實有個偷機的方式,只是最後我沒那麼做。假設要傳給 client 的是 Script.exe 和 Script.txt,這時可以用一些壓縮軟體做輔助,如 WinRar。把這兩個檔案壓成 .exe ,選項有一個是解壓後自動執行 (這裡就選 Script.exe),再把解壓出來的檔案砍掉。

 

假設專案名是 Script,另一個方式,我在 source code 裡面,直接用 static const char szInstrBuf[2M] = "HelloHelloHello....." ; 

重點是 szInstrBuf 的內容一定要填滿到 2MB 那麼大,這樣編出來的 Script.exe ,用二進位軟體去找,一定找得到這串 ASCII 數值。

這樣就能改變 szInstrBuf 內容。

 

是的,既然可以改變 szInstrBuf 內容,所以可以把所有的 Script 的內容全都寫到 szInstrBuf 裡面去,這樣原本對檔案做處理的動作,

就變成轉向對 szInstrBuf 做處理。

 

換句話說,這時需要再寫一個輔助小工具,將 Script.txt 的內容,寫到 Script.exe 裡面szInstrBuf 位置,壞處是 Script.txt 經過處理後的長度不能超過 2MB,只能寫些小的 Script ( 這個小工具就真的是變成假編譯器了?)

 

照這方式跑,其實 Q2 的流程也一樣,這裡就不多說了。

 

 

 

edisonx 發表在 痞客邦 PIXNET 留言(2) 人氣()


留言列表 (2)

發表留言
  • novus
  • 剛好以前玩過類似的把戲,不過最近好懶得寫東西,只提供若干關鍵字...

    1. 關於陣列的方法,讓我想起古代有一種圖檔叫做 xpm,很多影像瀏覽瀏覽軟體都可以直接觀看,其實本質上是 C header。以前很多小遊戲都靠他。

    2. 關於 resource 的玩法,可以找找 UpdateResource 範例。

    3. 會玩 linker 的話,可以自己創區段塞資料,但程式碼裡面可能需要依賴開發工具特有功能來讀取區段。不過像你這裡講的 Q2 大概都不需要整個 rebuild,在 build script 當中加條件多 link 一個資料檔即可,詳細情形要看你們怎麼設計。
  • novus 真的又讓我崇拜一次了,我從沒想過從 linker 那裡下手,有空的話我 google 一下詳細的作法,謝謝你的指導。 :D

    edisonx 於 2013/10/28 10:29 回覆

  • novus
  • 我只是略懂而已,剛好以前玩過 binutils。

    我不太熟 VC 的 linker,在 gcc 下可用下列步驟把資料轉成 .o 檔。另一個方式是用objcopy。

    ld -Ur -b binary -o my_data.o my_data.txt

    my_data.txt 可以換成圖檔、音樂檔等等,建出來的 .o 可以用普通的方式和其他 .o 檔連結成執行檔。


    在程式碼中可以透過下面 symbol 存取內容。有些版本的 gcc 開頭要底線,有些不用。
    extern char _binary_my_data_txt_start[];
    extern char _binary_my_data_txt_end[];
    extern char _binary_my_data_txt_size[];

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼