如何限制 EXE 程式,只能被其它程式叫用 |
答題得分者是:change.jian
|
小蚊子
中階會員 發表:55 回覆:267 積分:94 註冊:2002-06-08 發送簡訊給我 |
請問一下 有一 DELPHI 寫的程式,已經編譯成執行檔 AAAA.EXE 這 AAAA.EXE 程式是要給其他應用程式呼叫用 例如 : ShellExecute(Application.Handle,'open' ,PChar('C:\TOOLS\AAAA.exe'),nil,nil,SW_SHOW); 但 若將 AAAA.EXE , 拉捷徑 到桌面,它也有可能被單獨執行 ------------------------------------------------------------------- 我希望 AAAA.EXE 只能給應用程式呼叫使用, 一般的 CLICK 它,無法被執行 拉捷徑 到桌面,它也無法被執行 AAAA 程式內部,該如何判斷是應用程式的外部呼叫呢 ?? 謝謝您 |
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
不曉得這樣行不行:
規定要呼叫 AAAA.EXE 的程式,後面要帶一個參數以資識別(例如某個 GUID 碼),AAAA.EXE 裡檢查如果沒有這個參數就結束 呼叫時就是加這個參數 ShellExecute(Application.Handle,'open' ,PChar('C:\TOOLS\AAAA.exe'),pchar('{xxxx-xxxx-xxxxxxxx-xxxxxxxx}'),nil,SW_SHOW); ===================引 用 小蚊子 文 章=================== 請問一下 有一 DELPHI 寫的程式,已經編譯成執行檔 AAAA.EXE 這 AAAA.EXE 程式是要給其他應用程式呼叫用 例如 : ShellExecute(Application.Handle,'open' ,PChar('C:\TOOLS\AAAA.exe'),nil,nil,SW_SHOW); 但 若將 AAAA.EXE , 拉捷徑 到桌面,它也有可能被單獨執行 ------------------------------------------------------------------- 我希望 AAAA.EXE 只能給應用程式呼叫使用, 一般的 CLICK 它,無法被執行 拉捷徑 到桌面,它也無法被執行 AAAA 程式內部,該如何判斷是應用程式的外部呼叫呢 ?? 謝謝您 |
小蚊子
中階會員 發表:55 回覆:267 積分:94 註冊:2002-06-08 發送簡訊給我 |
版主: 謝謝您,此法的確可行 - - - - - - - - -------------------------------- 若 USER 也於 捷徑的內容上,輸入相同的參數,是否 AAAA.EXE 也是會被執行 ?? 我的另一個想法,就是若可以知道 AAAA.EXE 被誰叫用,是否就可以區分是程式叫用或捷徑叫用的問題?? 可惜這一段程式我不會寫 我的意思如下: 例如 : BBBB.EXE 去叫用 AAAA.EXE 11-22-33-44 AAAA.EXE 內部可以知道 insP0 := ParamStr(0) ''; // AAAA.EXE 第1個參數值 insP1 := ParamStr(1) ''; //11-22-33-44 第2個參數值 是否有另一個指令 可以知道是 BBBB.EXE 來叫用 AAAA.EXE ??? ........ whocallme() ==> BBBB.EXE |
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
|
ko
資深會員 發表:28 回覆:785 積分:444 註冊:2002-08-14 發送簡訊給我 |
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
1.關於一個 exe 裡要知道是誰把他叫起來的,據我所知,作業系統裡似乎沒有這種資訊(也許有那位大大可以提供一下),我的做法,都是用傳入一個特殊的參數(例如一個 guid 值)來識別,通常這特殊的參數不大會被知道(但不表示一定不會被知道)
2.如果你是 dll ,那麼隱密性就會比較高一點,但也不是那麼百分之百,行家仍然可以透過 DLL 裡的 pe 表去得知這個 dll 提供了那些參數給外部呼叫 3.不曉得您的原始需求是什麼,會令程式有這樣的布局? ===================引 用 小蚊子 文 章=================== 版主: 謝謝您,此法的確可行 - - - - - - - - -------------------------------- 若 USER 也於 捷徑的內容上,輸入相同的參數,是否 AAAA.EXE 也是會被執行 ?? 我的另一個想法,就是若可以知道 AAAA.EXE 被誰叫用,是否就可以區分是程式叫用或捷徑叫用的問題?? 可惜這一段程式我不會寫 我的意思如下: 例如 : BBBB.EXE 去叫用 AAAA.EXE 11-22-33-44 AAAA.EXE 內部可以知道 insP0 := ParamStr(0) ''; // AAAA.EXE 第1個參數值 insP1 := ParamStr(1) ''; //11-22-33-44 第2個參數值 是否有另一個指令 可以知道是 BBBB.EXE 來叫用 AAAA.EXE ??? ........ whocallme() ==> BBBB.EXE |
小蚊子
中階會員 發表:55 回覆:267 積分:94 註冊:2002-06-08 發送簡訊給我 |
感謝大家的回覆及建議:
change.jian 前輩 您提到重點了 其實是幫一位 朋友B 寫一支小程式AAAA.EXE , 朋友B 是將 AAAA.EXE 及 B自己 的系統,整套賣給工廠C B 有自己的應用系統,我的小程式AAAA.EXE 僅負責周邊設備列印條碼的工作 所以 B系統 要呼叫 AAAA.EXE, AAAA.EXE 才會動作開始動作,平時放在桌面上也不可以單獨被執行 因為我沒有掛 KEY_PRO(尿袋) 保護,所以很難控管程式流向, B 及 C 憑道德勸說 所以才和 B 談好呼叫方式 , 我擔心的是 C 會盜用的問題及不小心流到市面上 因為開發很辛苦,目前程式已經將客戶的資料寫入程式碼中, 萬一在市面上發現此程式,我大概知道是哪一位配合的客戶流出的 程式售價不高(數千元而已), 希望能增加一點收入,所以才會想ㄧ些互相約束/保護的方式 謝謝您 ===================引 用 change.jian 文 章=================== 3.不曉得您的原始需求是什麼,會令程式有這樣的布局? |
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
我認為是有辦法可以取得呼叫者的,像Process Explorer就可以列出系統的Process Tree(見下圖),
只是要用哪個API可能得想想。 ==Updated== 把這個Code抓下來看了一下(http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=43101) 看一下TProcessEntry32這個struct實際上是有包含th32ParentProcessID這個property,應該就是你要的了吧(?)
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
編輯記錄
Coffee 重新編輯於 2008-06-22 13:39:25, 註解 無‧
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
小蚊子,提供我的想法給你參考:
1.如果只是這樣的問題,加上如果你的程式費用不高,那麼只要讓 user 去破解你的程式的費用比買你的程式費用高,其實應該就差不多了.(簡單說,就是破不如去買) 2.如果是傳參數的話,確實是比較容易被發現,但也不是那麼容易. 這裡可以提供你一個進階的做法,就是 B 系統呼叫你的 AAAA.exe 時,傳入一個參數,這個參數其實是 mapping file 的檔名(所以這個參數可以不必固定,每次都不一樣,讓要破的人去猜),然後 B 系統再在 mapping file 裡寫入實際要給你確認的值(這個值或許可以是傳入參數的雜湊運算結果等....隨便);像這樣透過在記憶體裡交換資料,除非知道你的做法,不然要破其實就是不容易了;當然,若真碰上高手,其實仍然是有辦法破的! 3.至於 TProcessEntry32.ParentProcessID,初看我也是認為也許可行,但進一步思考,發現你必需要把這個 ParentProcessID 再轉成對應的 process name ,也就是執行檔名,那麼我如果要呼叫你,只需要把我的 exe 名稱換成 B 系統的 Exe 名稱就好,所以似乎也不是那麼可行; |
小蚊子
中階會員 發表:55 回覆:267 積分:94 註冊:2002-06-08 發送簡訊給我 |
感謝 change.jian , coffee 前輩的建議 及 資訊
之前就是有客戶說,願意每安裝一個工作站,再付一次的費用 實際上有點難,且客戶的環境無法去現場監督,它要將軟體 copy 去 哪些廠區,無法控管,所以只好與系統商協調,"相信' 系統商的誠信了 我的做法是很消極的保護方式,早期也用過cpu-id,hd-id,key_pro,使用次數,使用期間..... , 但出問題後,您也是要處理,......所增加的額外成本,會讓休息的時間減少,未必划算 軟體完全不保護後,反而維護變少..... 但銀子也可能變少了 自己的客戶或公司自己用的軟體,大概就不會考慮這些 但是配合其它系統商的案子,誠信與控管是要面對的問題 |
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
不好意思,插個話。
可以在執行你寫的程式的時候,一開始先列出目前作業系統所有的 Process,再取得 Parent Process ID,然後再比對這個 Parent Process 是否為你允許呼叫的程式 以上的作法,需要用到一些 Win32 API,請你參考以下這篇範例(BCB),再自行修改 http://delphi.ktop.com.tw/board.php?cid=168&fid=914&tid=52970 http://delphi.ktop.com.tw/loadfile.php?TOPICID=16578371&CC=370769
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
編輯記錄
RaynorPao 重新編輯於 2008-06-23 14:54:30, 註解 無‧
|
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
RaynorPao的例子我進不去(無權進入)。
不好意思,我偷偷將妳的問題改成了CallerRight() {呼叫者是對的} 例子在下面。 利用FindWindow將其他form物件下所有的資料取出來 http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=30409 我假設妳的AAAA.EXE執行時,BBBB.EXE仍然最小化或執行中 然後妳只要抓取BBBB.EXE內某個(多個更好)WINDOWS標準元件內的CAPTION或TEXT值是對的,你的AAAA.EXE才繼續執行,否則就關閉了,每次BBBB.EXE改程式後,請B再給你一份,依你的喜好取你要的元件內值(這部份B也不知道),除了防C,可以防B也把你出賣。 我原來的想法是用Sendmessage要AAAA.EXE去問BBBB.EXE但我不知B(妳的合作對像)值不值得信任了,因為前提在於協定,那她一定知道了;前面的方法一定要BBBB.EXE是執行中,做假的BBBB.EXE就不一定有用了。
------
努力會更接近成功
編輯記錄
pceyes 重新編輯於 2008-06-23 14:31:07, 註解 無‧
|
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
|
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
每個 Process 都有它的Parent ID 由此得知誰執行了你。
因此誰去呼叫誰,通常都有跡可尋。 除非 A呼叫 B -> B呼叫C 把 B關掉就找不到 A function GetProcessParentID(PHandle: DWORD):DWORD; var Info : TProcessBasicInformation; begin Result := 0; if PHandle=0 then Exit; ZeroMemory(@info,SizeOf(info)); if NtQueryInformationProcess(PHandle, ProcessBasicInformation, @Info, sizeOf(Info), nil) = 0 then Result := Info.ParentPID; end; |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
簡單一點的做法是寫一支"有期限"的程式.
在那個期限一到.就不能跑. 讓原版使用者可以來找你"服務"一下. 讓盜版的.麻煩一下. 妳知道為什麼會有一堆的什麼電池的什麼包裝.寄回去抽獎的動作嗎? 因為他們要知道1.公司貨.2.水貨.3.假貨的巿佔率. 辦一次抽獎就都知道了. 多合算呀.^^ ===================引 用 RootKit 文 章=================== 每個 Process 都有它的Parent ID 由此得知誰執行了你。 因此誰去呼叫誰,通常都有跡可尋。 除非 A呼叫 B -> B呼叫C 把 B關掉就找不到 A function GetProcessParentID(PHandle: DWORD):DWORD; var Info : TProcessBasicInformation; begin Result := 0; if PHandle=0 then Exit; ZeroMemory(@info,SizeOf(info)); if NtQueryInformationProcess(PHandle, ProcessBasicInformation, @Info, sizeOf(Info), nil) = 0 then Result := Info.ParentPID; end; |
anyone
中階會員 發表:1 回覆:63 積分:52 註冊:2007-02-12 發送簡訊給我 |
插一下話,如change.jian版主說的第三點
除了exe名稱外,若加上檔案大小的判斷呢? ===================引 用 change.jian 文 章=================== 3.至於 TProcessEntry32.ParentProcessID,初看我也是認為也許可行,但進一步思考,發現你必需要把這個 ParentProcessID 再轉成對應的 process name ,也就是執行檔名,那麼我如果要呼叫你,只需要把我的 exe 名稱換成 B 系統的 Exe 名稱就好,所以似乎也不是那麼可行; |
00156
高階會員 發表:45 回覆:195 積分:112 註冊:2002-06-01 發送簡訊給我 |
|
harpist
資深會員 發表:3 回覆:251 積分:430 註冊:2002-10-03 發送簡訊給我 |
|
小蚊子
中階會員 發表:55 回覆:267 積分:94 註冊:2002-06-08 發送簡訊給我 |
寫日期期限的方式,我也有做過
方法 1. 寫死在程式中 2. 寫在 REG 中 問題是真的付錢的客戶不能用時,原因 換電腦,或是日期往前調.....等,真的系統不能用了 都還是要您去處理,所以我說的服務成本變重,就是這原因 另ㄧ個問題,您當初要賣軟體給客戶時,會直說軟體有日期保護,所以以後要處理或續約 .... 客戶會買嗎 ?? 客戶也擔心您會不見了 ===================引 用 暗黑破壞神 文 章=================== 簡單一點的做法是寫一支"有期限"的程式. 在那個期限一到.就不能跑. 讓原版使用者可以來找你"服務"一下. |
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
|
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
呵.客戶不能用的原因很多.又不會只是你的程式到期.^^
付費的客戶自己沒把東西看好,換電腦等等問題.那就出個車馬費,讓您去他們公司哈拉泡個茶,不好嗎? ===================引 用 小蚊子 文 章=================== 寫日期期限的方式,我也有做過 方法 1. 寫死在程式中 2. 寫在 REG 中 問題是真的付錢的客戶不能用時,原因 換電腦,或是日期往前調.....等,真的系統不能用了 都還是要您去處理,所以我說的服務成本變重,就是這原因 另ㄧ個問題,您當初要賣軟體給客戶時,會直說軟體有日期保護,所以以後要處理或續約 .... 客戶會買嗎 ?? 客戶也擔心您會不見了 ===================引 用 暗黑破壞神 文 章=================== 簡單一點的做法是寫一支"有期限"的程式. 在那個期限一到.就不能跑. 讓原版使用者可以來找你"服務"一下. |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
自己架站?
他們內部自己搞個認證主機.IP.DNS跟你完全一樣.玩封包層的動作. 你就被破了.還破得更輕鬆.^^ ===================引 用 RootKit 文 章=================== 要防止 B or C 用道德勸說是無用的。 因此透過 KeyPro 或綁硬體是普遍的作法。 如果 自己有架設網站是比較靠得住,當程式啟動時將本機的部分訊息傳送至網站。 達到監視的目的,並可設計當網站回傳是"非法授權"時,顯示該訊息並不予執行。 如果程式可能會常常重複執行,僅在開機第一次執行時檢查。 成功後 寫入 Atom 或 FileMapping 中以做標記,待下次執行時略過。 當然這不可能杜絕百分之百,有 70、80 就要偷笑。 總之總比什麼都沒做來的好! 參考 |
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
是。沒錯的。但這樣做有意義嗎!只為了一個小屁程式。
另外輕鬆嗎?不見得吧。要攔截封包又要模擬。客觀一點吧! 當然可透過加密及日期有效檢查,需強迫在一定秒數內的有效檢查。 造成每次封包都不同。而且作法簡單。 不過還是可以破的, KeyPro 可破(我破過)、綁硬體也可以破。通通都可以破。 我們這樣做的原因,只不過增加破解者一些迷糊陣而已。不要被輕易的複製使用。 (自己架站)主要用途在於追蹤程式。除了這些外還可以提供 檢查更新、錯誤回報等正面用途。 考慮以上的原因在於不需要強迫 B 怎麼去規範呼叫。 最後強調一點,總比什麼都沒做來的好! ===================引 用 暗黑破壞神 文 章=================== 自己架站? 他們內部自己搞個認證主機.IP.DNS跟你完全一樣.玩封包層的動作. 你就被破了.還破得更輕鬆.^^ ===================引 用 RootKit 文 章=================== 要防止 B or C 用道德勸說是無用的。 因此透過 KeyPro 或綁硬體是普遍的作法。 如果 自己有架設網站是比較靠得住,當程式啟動時將本機的部分訊息傳送至網站。 達到監視的目的,並可設計當網站回傳是"非法授權"時,顯示該訊息並不予執行。 如果程式可能會常常重複執行,僅在開機第一次執行時檢查。 成功後 寫入 Atom 或 FileMapping 中以做標記,待下次執行時略過。 當然這不可能杜絕百分之百,有 70、80 就要偷笑。 總之總比什麼都沒做來的好! 參考 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |