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

如何限制 EXE 程式,只能被其它程式叫用

答題得分者是:change.jian
小蚊子
中階會員


發表:55
回覆:267
積分:94
註冊:2002-06-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-06-20 14:55:12 IP:220.132.xxx.xxx 訂閱
 
請問一下
有一 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-06-20 15:18:12 IP:211.23.xxx.xxx 訂閱
不曉得這樣行不行:
規定要呼叫 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-06-20 15:56:39 IP:220.132.xxx.xxx 訂閱

版主:
謝謝您,此法的確可行
- - - - - - - - --------------------------------
若 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

編輯記錄
小蚊子 重新編輯於 2008-06-20 16:00:24, 註解 無‧
小蚊子 重新編輯於 2008-06-20 16:01:18, 註解 無‧
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-06-20 18:08:49 IP:220.141.xxx.xxx 訂閱
aaaa.exe //呼叫
bbbb.exe //被呼叫

bbbb.exe 平時改名為 bbbb.dat
aaaa.exe要呼叫前將它改回bbbb.exe
反正目錄下檔案很多,不說,誰知它是什麼。
------
努力會更接近成功
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-06-21 12:38:33 IP:61.66.xxx.xxx 訂閱
是否考慮寫成DLL 或 BPL勒?!
------
======================
昏睡~
不昏睡~
不由昏睡~
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-06-22 08:55:10 IP:140.131.xxx.xxx 訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-06-22 09:28:06 IP:210.66.xxx.xxx 訂閱
感謝大家的回覆及建議:

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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-06-22 13:19:44 IP:203.73.xxx.xxx 訂閱
我認為是有辦法可以取得呼叫者的,像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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-06-22 14:43:31 IP:140.131.xxx.xxx 訂閱
小蚊子,提供我的想法給你參考:

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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-06-22 17:30:31 IP:220.132.xxx.xxx 訂閱
感謝 change.jian , coffee 前輩的建議 及 資訊
之前就是有客戶說,願意每安裝一個工作站,再付一次的費用
實際上有點難,且客戶的環境無法去現場監督,它要將軟體 copy 去
哪些廠區,無法控管,所以只好與系統商協調,"相信' 系統商的誠信了
我的做法是很消極的保護方式,早期也用過cpu-id,hd-id,key_pro,使用次數,使用期間..... ,
但出問題後,您也是要處理,......所增加的額外成本,會讓休息的時間減少,未必划算

軟體完全不保護後,反而維護變少..... 但銀子也可能變少了

自己的客戶或公司自己用的軟體,大概就不會考慮這些
但是配合其它系統商的案子,誠信與控管是要面對的問題

change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-06-23 11:58:50 IP:211.23.xxx.xxx 訂閱
嗯,看來這個問題已進入哲學層次了,需要大師來回答了~~~

===================引 用 小蚊子 文 章===================
軟體完全不保護後,反而維護變少..... 但銀子也可能變少了



自己的客戶或公司自己用的軟體,大概就不會考慮這些

但是配合其它系統商的案子,誠信與控管是要面對的問題
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-06-23 13:13:34 IP:210.208.xxx.xxx 訂閱
不好意思,插個話。
可以在執行你寫的程式的時候,一開始先列出目前作業系統所有的 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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2008-06-23 14:29:31 IP:220.141.xxx.xxx 訂閱
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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2008-06-23 14:31:29 IP:220.130.xxx.xxx 訂閱
之前我也想過類似的例子,如果B有更新都可以給你一份的話,
那取得執行中的BBBB.exe來算MD5應該也是個不錯的辦法,只不過就變成得隨B更新就跟著更新。
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
編輯記錄
Coffee 重新編輯於 2008-06-23 14:32:31, 註解 無‧
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#15 引用回覆 回覆 發表時間:2008-06-23 17:06:37 IP:61.222.xxx.xxx 訂閱
每個 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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2008-06-23 17:36:08 IP:122.118.xxx.xxx 未訂閱
簡單一點的做法是寫一支"有期限"的程式.
在那個期限一到.就不能跑.
讓原版使用者可以來找你"服務"一下.
讓盜版的.麻煩一下.

妳知道為什麼會有一堆的什麼電池的什麼包裝.寄回去抽獎的動作嗎?
因為他們要知道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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2008-06-27 16:32:24 IP:59.127.xxx.xxx 未訂閱
插一下話,如change.jian版主說的第三點
除了exe名稱外,若加上檔案大小的判斷呢?
===================引 用 change.jian 文 章===================
3.至於 TProcessEntry32.ParentProcessID,初看我也是認為也許可行,但進一步思考,發現你必需要把這個 ParentProcessID 再轉成對應的 process name ,也就是執行檔名,那麼我如果要呼叫你,只需要把我的 exe 名稱換成 B 系統的 Exe 名稱就好,所以似乎也不是那麼可行;
00156
高階會員


發表:45
回覆:195
積分:112
註冊:2002-06-01

發送簡訊給我
#18 引用回覆 回覆 發表時間:2008-06-28 09:01:59 IP:118.166.xxx.xxx 訂閱
有沒有考慮,呼叫AAAA.EXE的程式在系統寫入一個Registry Key,AAAA.EXE執行時先確認Key,再將它刪除?
Key的值不必固定,例如可以利用系統日期去運算等等。
同樣的方式,或者也可以透過網路來做,將Key的存取改到網路上的特定網站...

以上方法供您參考看看。
harpist
資深會員


發表:3
回覆:251
積分:430
註冊:2002-10-03

發送簡訊給我
#19 引用回覆 回覆 發表時間:2008-06-30 10:37:08 IP:59.120.xxx.xxx 訂閱
建議可使用 Inter-Process Communication 

1.單純點可由呼叫端 CreateMutex 、CreateSemaphore,由被呼叫端(AAAA.EXE)檢查。
2.使用 Message Queue 也是一種方式。
3.要做的周詳一點就用 Pipe、Shared Memory 。
------
~§~迷時師渡,悟了自渡~§~
小蚊子
中階會員


發表:55
回覆:267
積分:94
註冊:2002-06-08

發送簡訊給我
#20 引用回覆 回覆 發表時間:2008-06-30 11:52:13 IP:210.66.xxx.xxx 訂閱
寫日期期限的方式,我也有做過
方法
1. 寫死在程式中
2. 寫在 REG 中

問題是真的付錢的客戶不能用時,原因
換電腦,或是日期往前調.....等,真的系統不能用了
都還是要您去處理,所以我說的服務成本變重,就是這原因

另ㄧ個問題,您當初要賣軟體給客戶時,會直說軟體有日期保護,所以以後要處理或續約
.... 客戶會買嗎 ?? 客戶也擔心您會不見了

===================引 用 暗黑破壞神 文 章===================
簡單一點的做法是寫一支"有期限"的程式.
在那個期限一到.就不能跑.
讓原版使用者可以來找你"服務"一下.
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#21 引用回覆 回覆 發表時間:2008-06-30 13:53:31 IP:61.222.xxx.xxx 訂閱
要防止 B or C 用道德勸說是無用的。
因此透過 KeyPro 或綁硬體是普遍的作法。

如果 自己有架設網站是比較靠得住,當程式啟動時將本機的部分訊息傳送至網站。
達到監視的目的,並可設計當網站回傳是"非法授權"時,顯示該訊息並不予執行。
如果程式可能會常常重複執行,僅在開機第一次執行時檢查。
成功後 寫入 Atom 或 FileMapping 中以做標記,待下次執行時略過。

當然這不可能杜絕百分之百,有 70、80 就要偷笑。
總之總比什麼都沒做來的好!
參考
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#22 引用回覆 回覆 發表時間:2008-06-30 14:00:01 IP:122.118.xxx.xxx 未訂閱
呵.客戶不能用的原因很多.又不會只是你的程式到期.^^
付費的客戶自己沒把東西看好,換電腦等等問題.那就出個車馬費,讓您去他們公司哈拉泡個茶,不好嗎?
===================引 用 小蚊子 文 章===================
寫日期期限的方式,我也有做過
方法
1. 寫死在程式中
2. 寫在 REG 中

問題是真的付錢的客戶不能用時,原因
換電腦,或是日期往前調.....等,真的系統不能用了
都還是要您去處理,所以我說的服務成本變重,就是這原因

另ㄧ個問題,您當初要賣軟體給客戶時,會直說軟體有日期保護,所以以後要處理或續約
.... 客戶會買嗎 ?? 客戶也擔心您會不見了

===================引 用 暗黑破壞神 文 章===================
簡單一點的做法是寫一支"有期限"的程式.
在那個期限一到.就不能跑.
讓原版使用者可以來找你"服務"一下.
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#23 引用回覆 回覆 發表時間:2008-06-30 14:02:21 IP:122.118.xxx.xxx 未訂閱
自己架站?
他們內部自己搞個認證主機.IP.DNS跟你完全一樣.玩封包層的動作.
你就被破了.還破得更輕鬆.^^

===================引 用 RootKit 文 章===================
要防止 B or C 用道德勸說是無用的。
因此透過 KeyPro 或綁硬體是普遍的作法。

如果 自己有架設網站是比較靠得住,當程式啟動時將本機的部分訊息傳送至網站。
達到監視的目的,並可設計當網站回傳是"非法授權"時,顯示該訊息並不予執行。
如果程式可能會常常重複執行,僅在開機第一次執行時檢查。
成功後 寫入 Atom 或 FileMapping 中以做標記,待下次執行時略過。

當然這不可能杜絕百分之百,有 70、80 就要偷笑。
總之總比什麼都沒做來的好!
參考
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#24 引用回覆 回覆 發表時間:2008-06-30 17:44:51 IP:61.222.xxx.xxx 訂閱
是。沒錯的。但這樣做有意義嗎!只為了一個小屁程式。
另外輕鬆嗎?不見得吧。要攔截封包又要模擬。客觀一點吧!

當然可透過加密及日期有效檢查,需強迫在一定秒數內的有效檢查。
造成每次封包都不同。而且作法簡單。

不過還是可以破的, KeyPro 可破(我破過)、綁硬體也可以破。通通都可以破。
我們這樣做的原因,只不過增加破解者一些迷糊陣而已。不要被輕易的複製使用。

(自己架站)主要用途在於追蹤程式。除了這些外還可以提供 檢查更新、錯誤回報等正面用途。
考慮以上的原因在於不需要強迫 B 怎麼去規範呼叫。

最後強調一點,總比什麼都沒做來的好!

===================引 用 暗黑破壞神 文 章===================
自己架站?
他們內部自己搞個認證主機.IP.DNS跟你完全一樣.玩封包層的動作.
你就被破了.還破得更輕鬆.^^

===================引 用 RootKit 文 章===================
要防止 B or C 用道德勸說是無用的。
因此透過 KeyPro 或綁硬體是普遍的作法。

如果 自己有架設網站是比較靠得住,當程式啟動時將本機的部分訊息傳送至網站。
達到監視的目的,並可設計當網站回傳是"非法授權"時,顯示該訊息並不予執行。
如果程式可能會常常重複執行,僅在開機第一次執行時檢查。
成功後 寫入 Atom 或 FileMapping 中以做標記,待下次執行時略過。

當然這不可能杜絕百分之百,有 70、80 就要偷笑。
總之總比什麼都沒做來的好!
參考
系統時間:2024-04-25 14:23:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!