線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2907
推到 Plurk!
推到 Facebook!

問 有關 windows 下,檔案被複製後的戳記

答題得分者是:P.D.
ANDY8C
資深會員


發表:114
回覆:582
積分:299
註冊:2006-10-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-09-01 06:00:17 IP:210.66.xxx.xxx 訂閱
原始檔案 AA.EXE (1) , DELPHI 產生的 EXE 檔

若 AA.EXE(1) 被複製後,產生 複製-AA.EXE(2)

若 複製-AA.EXE(2) , 再被複製一次後,產生 複製-複製-AA.EXE(3)

請問 WINDOWS 有何戳記(存取時間或狀態) , 可以用 DELPHI 來判斷出 AA.EXE(1) , AA.EXE(2) , AA.EXE(3) 的不同嗎 ??
也就是 AA.EXE 內部可以寫一段程式,可以讀取 AA.EXE 自己的 "某些記錄" ,告訴自己是不是被複製後的檔案或已被複製多少次.


目的 : 不允許被複製後的 EXE ,到處執行 !!

謝謝您
------
---------------------------------------
偶爾才來 KTOP ,交流條碼問題,在 FB [條碼標籤達人] 社團留言,感恩.
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-09-01 12:08:37 IP:118.169.xxx.xxx 未訂閱
如果是以Delphi寫的, 不管程式如何複製, 其 Form的 caption(Title)應該都是不會改變的, 
所以不如換個角度來想, 把AA.EXE 鎖住只能執行一次, 那複製的程式, 也都是與AA一樣,
所以所有程式只能跑一支, 那複製下來的也沒有什麼作用了!
===================引 用 ANDY8C 文 章===================
原始檔案 AA.EXE (1) , DELPHI 產生的 EXE 檔

若 AA.EXE(1) 被複製後,產生 複製-AA.EXE(2)

若 複製-AA.EXE(2) , 再被複製一次後,產生複製-複製-AA.EXE(3)

請問 WINDOWS 有何戳記(存取時間或狀態) , 可以用 DELPHI 來判斷出 AA.EXE(1) , AA.EXE(2) , AA.EXE(3) 的不同嗎 ??
也就是 AA.EXE 內部可以寫一段程式,可以讀取 AA.EXE 自己的 "某些記錄" ,告訴自己是不是被複製後的檔案或已被複製多少次.


目的 : 不允許被複製後的 EXE ,到處執行 !!

謝謝您
Victor4022
中階會員


發表:0
回覆:76
積分:90
註冊:2011-02-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-09-01 23:41:31 IP:122.126.xxx.xxx 訂閱
您的需求可能比較難以程式邏輯實作, 因為"複製"的行為模式太多種,例如: 包括把檔案從 C:\ 剪下後貼到 D:\, 事實上File system 會發出以下動作:
1. C:\ 發出檔案刪除的 notify
2. D:\ 發出檔案新增的 notify
可是對操作的使用者而言, 我們的認知只是"檔案搬移", 並不是複製(其實可以把複製想成"新增")

另外, Windows copy file 只會變更 CreatedTime/ LastWriteTime/ LastAccesstime 的"LastAccesstime"這個時間戳記,
除非檔案本體有被修改或是搬移到不同磁區(才會改變CreatedTime 或 LastWriteTime)

小弟建議是:
1. 如果只是單純想讓這支程式同時只能執行一次, 可用 windows mutex 這個 kernel object
2. 如果不想讓程式到處"複製到他台電腦"執行, 可以考慮第一次執行此程式, 進行註冊的動作(寫 Registry/ 寫ini到 local/ 寫個觸發動作到網路上某個檔, 某個database engine, 某個網頁), 透過一些設計放行的流程, 讓有權的人決定哪些電腦能執行
3. 如果真的硬要限制"不允許被複製後的 EXE"這個需求達成的話, 可以考慮每一次開啟程式時, 讓程式把自己載入記憶體內, 每次執行都在檔案尾端寫入特徵值(例如當前時間戳記),並且在 Registry 或 ini 內也寫下同份特徵, 每次程式啟動時都同時檢查此兩項特徵, 再決定允不允許執行, 這篇
"TMemoryStream 如何執行 exe " http://delphi.ktop.com.tw/board.php?cid=30&fid=72&tid=101338 可以滿足這一點實作面的方式

不過第三點, 會被某些防毒軟體識為惡意程式(因為會更改本身程式的內容), 而且您的檔案如果有經過簽章, 就不適合這個方式




===================引 用 ANDY8C 文 章===================
原始檔案 AA.EXE (1) , DELPHI 產生的 EXE 檔

若 AA.EXE(1) 被複製後,產生 複製-AA.EXE(2)

若 複製-AA.EXE(2) , 再被複製一次後,產生複製-複製-AA.EXE(3)

請問 WINDOWS 有何戳記(存取時間或狀態) , 可以用 DELPHI 來判斷出 AA.EXE(1) , AA.EXE(2) , AA.EXE(3) 的不同嗎 ??
也就是 AA.EXE 內部可以寫一段程式,可以讀取 AA.EXE 自己的 "某些記錄" ,告訴自己是不是被複製後的檔案或已被複製多少次.


目的 : 不允許被複製後的 EXE ,到處執行 !!

謝謝您
ANDY8C
資深會員


發表:114
回覆:582
積分:299
註冊:2006-10-29

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-09-02 00:26:00 IP:210.66.xxx.xxx 訂閱
 感謝 P.D. 及 VICTOR4022 前輩的回覆 ,
感覺答案似乎已經浮現,只差實作的過程
假設我幫 甲 客製化一支小軟體,僅有車馬費的收入
客戶也答應下次有同樣需求,會再找我,付另一次費用,聽了自我感覺良好......(賣軟體常會被客戶騙,也願意被騙...)
所以這次的售價,因客戶很 "柪" ,下次,下下次...,因業務經驗不夠,幻想真會賣出很多次,
所以軟體價格只能無情的被砍,說實在的,對軟體的開發及接案信心會打折...
因為我們....是做軟體的,所以業務能力,遠低於技術能力.... 至少我是如此
我問題的實務思考點很簡單,
當您某一天再去服務時,您會發現您的軟體會出現在不同的 PC,
因為寫的太好了,所以客戶安裝都可以 "自動化" ,不過心情不會很好...
所以我才會想 "客戶自己複製" 的時候,該複製後的 EXE 檔案,不能動作.
當然,也有人說可以掛 "尿袋" .... KEYPRO 的東西,我是想省下這部份的錢
想由簡單的檔案狀態, "整整" 客戶就好.
謝謝您
------
---------------------------------------
偶爾才來 KTOP ,交流條碼問題,在 FB [條碼標籤達人] 社團留言,感恩.
Victor4022
中階會員


發表:0
回覆:76
積分:90
註冊:2011-02-20

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-09-02 10:34:26 IP:114.34.xxx.xxx 訂閱
再仔細看完您的需要,突然能體驗您的心情,小弟之前有幫忙公司購買外國一家元件 (LMD Innovative),
他們的做法小弟很喜歡,簡短的與您分享一下:

1. LMD Innovative 會對付款購買的客戶,提供一支專屬這個客戶的註冊程式。
2. 我們拿到此註冊程式後,在自己開發環境上安裝並進行註冊。
3. 註冊後,可以使用該註冊工具 (LMD RegUtility),瀏覽自己的購買產品資訊(包括Userid/ Password/ 版本別/ 產品下載網址)。
4. 可透過註冊工具,連到 LMD Innovative 官方客戶下載網站,可以瀏覽與下載自己曾經購買元件版本的更新版或Help。
5. 該網站上,登入後的首頁最上方,就有明確的登入資訊,清楚告訴我們以下資訊:
a. 前次登入時間。
b. 總登入次數。
c. 總下載次數。

您可以把這想法,轉變成適合您的控管或"善意提醒使用者"的方式,來讓使用者知道他們使用的程式,必須被註冊、而且下載更新時會被記錄次數,
如果有公司或有其他人士刻意散佈註冊程式的話,官方其實很好調查是由哪一個當初購買的使用者散佈出去。

ANDY8C
資深會員


發表:114
回覆:582
積分:299
註冊:2006-10-29

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-09-02 13:04:44 IP:210.66.xxx.xxx 訂閱
您這方法不錯 !! 應該是如此做...

但我的軟體是 win32 模式,非 Browser Base 或 Web Base

另外,有些客戶的 pc 是無法上 internet , 無法做遠端驗證

謝謝您
===================引 用 Victor4022 文 章===================

5. 該網站上,登入後的首頁最上方,就有明確的登入資訊,清楚告訴我們以下資訊:
a. 前次登入時間。
b. 總登入次數。
c. 總下載次數。

您可以把這想法,轉變成適合您的控管或"善意提醒使用者"的方式,來讓使用者知道他們使用的程式,必須被註冊、而且下載更新時會被記錄次數,
如果有公司或有其他人士刻意散佈註冊程式的話,官方其實很好調查是由哪一個當初購買的使用者散佈出去。

------
---------------------------------------
偶爾才來 KTOP ,交流條碼問題,在 FB [條碼標籤達人] 社團留言,感恩.
mitchellhu
一般會員


發表:23
回覆:53
積分:15
註冊:2007-06-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-09-02 18:48:49 IP:123.204.xxx.xxx 訂閱
 之前幫客戶開發軟體也有類似的情況。不過是客戶的資訊㽞位要求,是否可以防止使用者自已copy exe拿到別的地方(競爭對手公司)使用。
後來討論出的方案是,exe執行時,會先檢查驗証作業,這個驗証用一個很笨的方法作的。
因為每部電腦的cpu id 都有各自的編號,我就取出編號後,用md5處理過。 這個md5的處理程式是放在資訊管制人員的手上。
使用者第一次執行exe檔時,會顯示一組字串(就是該部pc 的cup id),這時user就得將這能字串報給資訊管制人員。
資訊管制人員,就run md5的加密程式,產生一個ini檔,內有加密後的md5值。再將這個ini檔給user。
user將ini檔放置到該部電腦的特定位置,這時再執行一次exe檔時,程式會比較md5加密值是否相同,相同exe才會續執行,不同則無法使用。
細部的寫法我記不太清楚了,有需求請告訴我。希望 能幫到你。
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-09-02 22:47:34 IP:118.169.xxx.xxx 未訂閱
經過你的說明, 我曾經做過一支程式
把要執行的程式(A)放在這支程式(B)
然後到客戶那邊安裝(就是執行 B),
這時 B程式就會把A解出來(利用TMemoryStream),
不僅如此, 我會在A的尾端加入當時存入時間做識別,
這有點像駭客(可能會遭部份防毒視為狀況, 但卡巴沒有問題)
而在A程式中會去檢查這個外加的時間註記與該檔的日期時間
是否match, 如果不match就認定是不合法, 這樣是否是你想要的?
ANDY8C
資深會員


發表:114
回覆:582
積分:299
註冊:2006-10-29

發送簡訊給我
#9 引用回覆 回覆 發表時間:2011-09-02 23:45:02 IP:115.30.xxx.xxx 訂閱
就是如此啦 !  
那是 一支 B.EXE 就好,還是 A.EXE B.EXE 各一支
可以全都的動作,在一支程式中全部完成嗎 ? ?

===================引 用 P.D. 文 章===================
經過你的說明, 我曾經做過一支程式
把要執行的程式(A)放在這支程式(B)
然後到客戶那邊安裝(就是執行 B),
這時B程式就會把A解出來(利用TMemoryStream),
不僅如此, 我會在A的尾端加入當時存入時間做識別,
這有點像駭客(可能會遭部份防毒視為狀況, 但卡巴沒有問題)
而在A程式中會去檢查這個外加的時間註記與該檔的日期時間
是否match, 如果不match就認定是不合法, 這樣是否是你想要的?
------
---------------------------------------
偶爾才來 KTOP ,交流條碼問題,在 FB [條碼標籤達人] 社團留言,感恩.
Victor4022
中階會員


發表:0
回覆:76
積分:90
註冊:2011-02-20

發送簡訊給我
#10 引用回覆 回覆 發表時間:2011-09-03 00:05:45 IP:122.126.xxx.xxx 訂閱
可以的, 小弟就是參考之前 P.D. 大提問的內容, 才想到有這招 :) 如下

>> 3. 如果真的硬要限制"不允許被複製後的 EXE"這個需求達成的話, 可以考慮每一次開啟程式時, 讓程式把自己載入記憶體內, 每次執行都在檔案尾端寫入特徵值(例>> 如當前時間戳記),並且在 Registry 或 ini 內也寫下同份特徵, 每次程式啟動時都同時檢查此兩項特徵, 再決定允不允許執行, 這篇
>> "TMemoryStream 如何執行 exe " http://delphi.ktop.com.tw/board.php?cid=30&fid=72&tid=101338 可以滿足這一點實作面的方式
>>
>> 不過第三點, 會被某些防毒軟體識為惡意程式(因為會更改本身程式的內容), 而且您的檔案如果有經過簽章, 就不適合這個方式



===================引 用 ANDY8C 文 章===================
就是如此啦 !
那是 一支 B.EXE 就好,還是 A.EXE B.EXE 各一支
可以全都的動作,在一支程式中全部完成嗎 ? ?

===================引 用 P.D. 文 章===================
經過你的說明, 我曾經做過一支程式
把要執行的程式(A)放在這支程式(B)
然後到客戶那邊安裝(就是執行 B),
這時B程式就會把A解出來(利用TMemoryStream),
不僅如此, 我會在A的尾端加入當時存入時間做識別,
這有點像駭客(可能會遭部份防毒視為狀況, 但卡巴沒有問題)
而在A程式中會去檢查這個外加的時間註記與該檔的日期時間
是否match, 如果不match就認定是不合法, 這樣是否是你想要的?
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#11 引用回覆 回覆 發表時間:2011-09-03 00:42:17 IP:118.169.xxx.xxx 未訂閱
說是兩支也可以, 說一支也行, 因為是 B 包 A, 但是B不能發給客戶, 而是由我們親自到客戶那邊, 透過 B 來做出 A, 
而A才是我們真的要給客戶的, 但已被B包入變成B.EXE, 再透過 TMemoryStream解出來, 所以是B對A進行動手腳
的勾當(就是說, 你要對A做什麼樣的加密或加殼, 都是寫在B中, 但這有一個限制, 就是 A不能太大, 你不能說把一個
A.EXE可能是10多M的檔給包進來, 這可能會引發TMemoryStream解不開, 不過極限到那裡, 我也沒有測過, 一般
我做的多半是1M多的檔, 還是ok的)
===================引 用 ANDY8C 文 章===================
就是如此啦 !
那是 一支 B.EXE 就好,還是 A.EXE B.EXE 各一支
可以全都的動作,在一支程式中全部完成嗎 ? ?

===================引 用 P.D. 文 章===================
經過你的說明, 我曾經做過一支程式
把要執行的程式(A)放在這支程式(B)
然後到客戶那邊安裝(就是執行 B),
這時B程式就會把A解出來(利用TMemoryStream),
不僅如此, 我會在A的尾端加入當時存入時間做識別,
這有點像駭客(可能會遭部份防毒視為狀況, 但卡巴沒有問題)
而在A程式中會去檢查這個外加的時間註記與該檔的日期時間
是否match, 如果不match就認定是不合法, 這樣是否是你想要的?
編輯記錄
P.D. 重新編輯於 2011-09-02 10:44:32, 註解 無‧
系統時間:2024-03-29 21:54:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!