2014年9月4日 星期四

製作 MSI 檔案 (make msi file from exe)

一般我們編譯完程式  在windows 底下常見的就是 exe安裝檔
透過exe安裝檔我們就可以執行安裝 為何要轉換成 MSI呢?

目前kaga 所遇到 需要轉換成 MSI檔的原因就是 配合AD server 派送安裝
由於AD server 只能使用MSI檔進行派送安裝
所以勢必得轉換過去

> MSI檔案是主要與Windows Installer File (Microsoft Corporation)相關的雜項檔案。

Step1 : 事前準備

> 環境
這邊Kaga 十分建議 使用VM 的環境來建構MSI檔
由於 在製作MSI檔 有點類似 比對安裝前安裝後 整個系統檔案的差異
所以越乾淨的環境 製作的速度比較快 也比較好處理

*kaga 使用的是 VM windows 7 32bit


> 工具
WinINSTALL-LE (好像也有 PRO 版本 但這版本 已經足夠應付我的工作)
備份檔


Step2 :  掃描環境變數
***建議使用 Administrator 執行 這攸關你MSI檔權限問題~




執行winINSTALL 程式
點選 Windows Installer Packages 後 左上方會出現一個放大鏡圖示 點選它
Run Discover 開始掃描未執行exe安裝檔前 的環境


在 Arguments 可以帶參數 kaga使用目前都直接空白
詳細的參數設定 可以參考文末的PDF 說明檔

首先要建立專案的名稱 可以幫你產生資料夾

這邊是要你指定 它所產生暫存檔案要存放在哪個空間 
一般就直接選擇C 就可以了


選擇 要掃描的空間,可以選多個
看你的exe安裝檔 安裝後檔案會需要存取於那些空間

接下來 會出現 各種系統檔案與資料夾的列表
主要讓你 可以篩選需要掃描的檔案是否移除或者增加
這邊kaga 就沒特別截圖了 通常都直接下一步

掃描ing.......
PS:掃描的速度跟你的選取使用空間有關 檔案越多掃得越久 
      所以環境越單純越好 切記!
最後會跳出這個視窗 問你是否直接執行 exe安裝檔
這只是方便你直接操作 如果按取消再去執行安裝 也可以的


Step3 : 安裝exe檔案  ... 就執行你的EXE檔麻
*** 如果你的程式會需要跑服務類型 建議可以在安裝後重新開機一次 再繼續下面的步驟
       這樣可以存取到比較正確的 執行權限

Step4 : 再次掃描環境變數
             再次打開 winInstall  一樣點擊 放大鏡圖示 Run Discover

第二次運行 discover ,會出現不一樣的選單 第一個就是
你已經掃描過一次要進行第二次的差異比對
如果你選了第二個 則會當成第一次 掃描



   

Step5 : 修改 第一次產生的MSI檔
              通常我們 第一次產生的MSI檔 不建議直接使用
              因為其中會包含不少 跟我們安裝不相關的內容 是需要經過調整的
              ex: 剛好在掃描後 才打開skype 就會連 skype 的暫存檔都被認為有變更而被帶進來MSI檔


                                     
這次點擊資料夾圖示 選擇你建立專案資料夾內的 MSI檔
建議勾選Copy Package Source Files
不小心玩壞了 還可以再來一次


此時就會產生一個新的 MSI 專案

點擊專案 會出現 一堆可以設定的東西
這邊kaga 只簡單介紹幾個有用到的設定
因為可以調整的地方真的很多>< 就要看各自需求了
右上角的ARP 也就是這個安裝檔 出現在 控制台/新增移除 裡面的圖示
當然你也可以不勾選 也就不會顯示了

這個地方的設定有點類似 我們有些安裝完後會問user 
安裝是for user 還是這台電腦都可以使用
下方的 Offer to reset .... 指的是是否要求使用者安裝後重開機!
其他檢查重點
1. Files >  這邊包含整個MSI檔 包含的路徑與檔案 以及 移除檔案也有
                需要仔細查看 避免不小心 安裝後改變了 原本電腦的東西
2. Registry >  這邊也要檢查是否 它裡面新增的註冊檔 跟你的程式有關
3. Service >  如果需要新增服務的 這邊可能也要設定

Step6 : 產生MSI檔

其實 新的MSI專案 在上面這些動作 並還沒有產生MSI檔
此時已經設定完後 需要產生MSI檔

在專案名稱案又建 Compress 跳出視窗後按確定 完成!
後續只要在 
C:\Program Files\Scalable\WinINSTALL\Packages\testProgram\
就會看到 正確的 MSI 檔囉!
---------------------------------------------------------------------
以上步驟 即可將你的 exe安裝檔 轉換成 msi 來使用
建議後續還是多個平台安裝看看
如果遇到程式無法產生檔案 或者讀取不到其中某幾個程式
建議 將一些呼叫的路徑檢查是否為"絕對路徑"
另外就是執行的權限在重新檢視一下


winInstall 電子說明書 有包含 關於 dicover 的參數設定
https://cs.uwaterloo.ca/twiki/pub/CF/WindowsPackaging/GettingStartedWinstall.pdf




2014年8月28日 星期四

迷路的程式 Path with process~

最近被自己之前設計的程式搞瘋了
popen 在windows 底下似乎有點詭異

1. 採用相對路徑 .\test\sqlite3.exe
發現 當kaga把其他程式 一起打包成MSI檔 在其他環境 沒有辦法正確執行

2. 採用絕對路徑 C:\desktop\tests\qlite3.exe
好像可以了 結果....
當在其他環境 路徑中 出現空格... 就會fail

目前採用 雙引號 包起來
就正常哩~~~

在windows 底下 的路徑 還是盡量採用絕對路徑
也要注意到路徑可能的命名問題

由於這個程式 有的跑系統服務
有的跑在 user space
當彼此呼叫 有時候也滿多 麻煩的 > <

另外下一篇打算來
PO 一下製作MSI檔的流程吧~

See you next time~

2014年8月26日 星期二

HITCON 2014

這是 kaga 第一次參加 hitcon
以前常聽到 但覺得似乎離自己有點遠(不單單只是距離)

官網 : http://hitcon.org/2014/

打從工作後 開始對於資訊安全 hacker, 開始有了些了解與興趣
今天 剛好又是 hitcon 十周年
下定決心 給他衝個一次

聽說這票不好買 (有分商業場 跟 社群場 價差就... kaga 自費參加也只能選社群場 = =|||)
第一次買就乖乖守在電腦前搶票拉
門票搞定後 就是等待拉~

七月 一整個很忙碌
但不單純只是工作 忙著東奔西跑
出差去日本 回來 一個禮拜 又去日本玩 ><
說真的 出去玩 還真的比上班累阿 @@

特地請了兩天假 微出國去
同事都一直在猜我到底請假去哪玩
我感覺也很懶得解釋 就很簡單的說去參加活動研討會之類的
主題就....資訊安全 吧
我想應該也沒差太多吧 XD

第一天的早上 8:30~ 9:30 報到
坐捷運到 南港展覽館 原本都看好要搭什麼公車
後來有上FB 發現 原來有接駁車
不過很奇妙的是 這訊息當天早上才發的@@
有看有賺到~
直接載到會場一整個省時又省力阿


快九點進到會場 應該很OK才對
但其實並不然~
一走進會議廳 幾乎滿滿的 只好坐到超後面的 = =
再慢一點大概就坐地板了...
因此隔天 我硬是起了個大早 才搶到 前面兩排位置
test
很有質感的識別證!
Hitcon 2014 Start!



















 兩天的課程 真的有深有淺
 我記得第一天的第一堂 是個韓國team
 整場英文 我整個傻了...
 雖然大會有即時翻譯 但.....
 kaga的老兵arcs 不能聽阿 = = (後來研究了很久 原來下載    XiiaLive 就可以)
 只能看著投影片很努力地看他們在幹嘛~

 每個時段 會有三場不同的主題內容
 可以自由選擇
 但我幾乎都在R0

至於本次 kaga 所吸收到的重點
大概可以歸納這幾項吧
*android 手機 ADB繞過各種漏洞
*遠端桌面的後門
*APT 各種 fail
*破解悠遊卡新版與舊版難易度

其實這次去有不少 主題內容的真的不是那麼懂
但可以感覺到 如果有涉及相同領域的話 應該會收益滿多的

有人問kaga 都聽不懂 這樣幹嘛去 ?!
其實現場不只是聽聽演講而已
周邊也有不少活動 像是"算命攤"
雖然我去沒幾次 不過也滿多人會聚在那邊
不只是聊有關hacker議題
什麼雜七雜八都可以  可以認識很多人
也是滿特別的

在來就是會議廳主場內建聊天模式
會議廳裡會有兩個投影 一個是講師上課的簡報
另一個 就是 IRC 上大家聊天的內容
就這樣直白白的給他show在上面哩
可以在上面發現很多有趣的內容
可能是針對講師 或者 同時段其他廳的演講內容等等
也算是這個活動滿重要的一環喔!!!

打卡送冰淇淋~
這是點心~
 一整天的吃喝都幫你準備的很豐盛
早上有點心 下午也有點心
大概就中午的便當 要靠運氣看抽到什麼了
我兩次都沒拿到雞腿便當 這真的是Random
 > <!?


旁邊的工作人員 滿正的 > <!
桌遊觸控板遊戲







另外周邊還有 自拍大頭貼 各種裝扮 會產生一組QRcode 讓你下載
(後來機台下面貼了一張 請不要踹IP 這種場合真的是什麼都能玩阿XD)
以及桌遊的 觸控板遊戲 kaga 下去玩所以也不是很了解玩法
應該就有點像遊戲王血量歸0的輸~ 只是變化比較簡單一點~




本次大會另一個賣點 就是創新的桌遊!!! MIT的喔
遊戲的玩法結構 其實有點像七大奇蹟 搶資源分數類型!
BGG: http://www.boardgamegeek.com/boardgame/163963/league-hackers
可能之後一般市面上也會舖貨吧


第二天的ENDING~
看到台上滿滿的工作人員 原來這個活動背後
還是要有這麼多人協助與參與的~
大家辛苦了~ 

也期待明年的 HITCON 2015



2014年2月27日 星期四

目標

很久沒寫文章了
很像我離開這個圈子似的...

說實在的  最近 確實有一點這樣的感覺~

總覺得自己 一直在追求著什麼
原本只是霧霧的一團

現在慢慢散開後 一整個霧裡看花
迷茫了起來

公司裡每個人 來來去去
工作 需要負擔的 總一直來

我這個人 不怕忙不怕累

最怕就是 看不到岸
走在霧裡的感覺

讓我最近 失去了不少動力
只好在工作之餘 找找其他方向

所以 跑去買了本 unity3D的書 回來摸摸~
自己在家玩了一下 確實輕鬆 愉快很多~ 哈

最近一樣在 一堆封包中 打滾

有空 再把最近 封包的解析 重組 等等心得 再整理一下好了~

2013年10月29日 星期二

multi thread in libev

Libev 是一個事件的library(event loop library)
透過loop與monitor的方式來做事件的處理
觸發不同的事件來執行不同的 callback
Libev 官方網站

這算是我工作上第一個遇到的新工具~
一開始看官方文件 還是霧煞煞~
不過 實際去RUN個幾次 你就會懂他的 邏輯與方式了~

這次要回頭處理 原本的ev 事件程式
想測試看看用 multi thread 來提升 處理效能

使用libev 如果希望工頭(主程序)隨時身邊都有工人(thread)待命,一有事情就派工人處理
但要讓工人處於待命狀態,而且又要聽命於工頭
其中 ev_async 是很重要的一個"秘書",可以幫忙與其他工人溝通


ev_async async_watcher;
ev_loop thread_loop;
ev_io main_event;
EV_P;

int main()
{
  loop = ev_default_loop(0);
  thread_loop= ev_loop_new(0);
  pthread_t thread;
  ev_async_init(async_watcher, async_cb);
  ev_async_start(thread_loop ,async_watcher);
  pthread_create(&thread, NULL, pthread_function, NULL);
  ev_io_init(&main_event, cb_main_callback, fd, EV_READ);
  ev_run(EV_A_ 0);
}

void *pthread_function(void *ptr)
{
  ev_run(thread_loop, 0);
  pthread_exit(0);
  return NULL;
}

void cb_main_callback(EV_P_ ev_io *w, int revents)
{
   if(ev_async_pending(&mthread[thread_count].async_watcher) == 0)
   {
     async_watcher.data = (void *)"Test Multi Thread";
     ev_async_send(thread_loop , &async_watcher);
   }
}

void async_cb(EV_P_ ev_async *w, int revents)
{
  char * msg;
  msg = (char *)w->data
  printf("%s\n",msg);
 
}


擷取程式中 部分程式碼說明一下 ev_async的 運作流程
首先主程序 在執行 ev_run(EV_A_ 0); 之前
註冊了一個 async_watcher 並指定 callback async_cb()
並啟 ev_async_start(thread_loop ,async_watcher);
在pthread_create() 的時候讓 thread_loop 運作 此時因為
有註冊async_watcher  所以不會 thread_loop  直接結束掉

再來重點在於 主程序 進到 cb_main_callback() 中
ev_async_pending() 這個動作 要跟 ev_async_send()
一起講會比較清楚
在ev_async_send()在 thread_loop 做個標記 此時會可以讓loop
去進到async_cb() 而此時會把 ev_async_send()所做的標記重置
而 ev_async_pending() 到底有啥作用呢
有人可能從字面上覺得 是在看是否呈現等待狀態
但實際的運作是
當已經被ev_async_send()標記 但loop並未觸發,則會回傳非0的值
所以我們必須判斷 ev_async_pending()等於0
才能再進行一次 ev_async_send()

通常在使用會遇到一個問題 就是 我需要帶資料或變數改怎麼處理
可能比較常看到 是使用 全域的變數 使用 lock 的方式
而其實 ev 事件 的monitor的struct 都會有一些變數可以使用
可以很方便在不同的callback傳遞

struct ev_async {
sig_atomic_t volatile sent;
int active;
int pending;
int priority;
void* data;
void (*cb)(struct ev_loop *loop, struct ev_async *w, int revents);
};

更多範例 可以在搜尋關鍵字 "libev thread" , "ev_async"
下面連結是 網路上的範例 自己有稍微修改測試了一下~
example ev_thread.c

參考連結

http://www.codeday.net/?p=68 (libev 一些struct 結構)
http://stackoverflow.com/questions/14621261/using-libev-with-multiple-threads

2013年9月12日 星期四

Apache allow,deny rule

這幾天 有個新功能 用到了  apache 相關的設定
<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  192.168.16.100
    Allow from 192.168.16.0/24
</Location>
設置網段後 又想獨立設定網段中某一個IP
也就是說 小範圍的設定 會優先於大範圍的
ex: 我想在 192.168.16.0/24 網段中 全部通過 但 只想其中某個 16.100 阻擋
此時該怎麼設定呢
上面這個設定 是可以達到這目的

一開始沒弄懂 他實際的條件與規則
想破頭都想不出該怎麼辦

後來才看到 上面這樣的寫法
但通常 我們會用 deny from all
他怎麼沒有擋 這樣好像怪怪的

後來又翻到下面這個表~~~
其中 Order Allow,Deny > 意指先比 允許的 在比 拒絕的
但他看的是最後比到的為主喔~
Match      | Allow,Deny result   | Deny,Allow result
-------------------------------------------------------
Allow only | Allowed             | Allowed
Deny only  | Denied              | Denied
No match   | Default: Denied     | Default: Allowed
Match both | Final match: Denied | Final match: Allowed
才恍然大悟阿~~~

預設是全部deny
狀況1 :   ip-deny,subnet-allow
>> 就等同第一個圖的方式

狀況2:  ip-allow,subnet-allow
<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Allow from 192.168.16.100
</Location>
突然想到
其實 只要把加入的ip 去比對 目前允許的subnet 如果在其中才額外加deny就可以了

不過 沒有很詳細研究
因為不是我擅長的領域阿 ~ 只是碰到插個花
請多多指教囉~



2013年9月6日 星期五

認真比偷懶更糟糕

最近都沒寫程式的文章
因為......

  一堆客服問題 瘋狂地打斷寫程式的興致啊 ><!

慢慢的會有越來越多 程式之外的事情需要我去了解 處理
也沒有排斥 但會影響到寫程式的效率 也是真的~~

長越大 越來越發現 自己好像不太能一心二用
或許因為這樣 對單一事物的專注力十分的強
不是不能被打擾 而是你打擾不了我 ㄎㄎ

==== 跳一下  進入主題 ===

說道職場文化 我想就台灣目前的工作環境來說
似乎 都還是悲觀居多~

就像我今天也分享了一篇文章 (才不是夢幻工作!Facebook遭踢爆16件慘案)
自己覺得 不管你在多厲害多大間的甚至是 夢幻工作等等
多少 一定還是有 你看不慣的文化 或者 令人詬病的人事物

最近莫名的有點感觸
當上頭覺得 有人不夠認真 對公司貢獻的太少時
第一時間 我們總是會想說 有嗎?! 我很認真應該不是 說我吧...

但其實 最認真的你 對公司或對你自己來說 是更糟糕的情況

蛤 為啥?!!!

當一個公司大到一個規模 管理者可能已經沒有辦法 對屬下一個一個去監督
每天仔細地審視你做什麼
只能看成效 甚至可能用主觀的意識來評分你的表現

如果 我因為偷懶 被發現 表現不好
很簡單 就不要偷懶 認真一點 發揮100% 搞定!

對公司來說 要讓妳走也很好下決定 因為你偷懶麻!!!
再來就用一些獎逞制度 來強迫你認真點  搞定!

=*=

當你已經很認真 那真的糟糕了
也許 是你的能力 已經不符合 這間公司的要求 Over

對公司來說 不管你做什麼改變 這個人就只能這樣了
默默鼻子 想想 根本投資錯人了 Over

當然還有很多因素 不一定是能力的問題
但在職場上的一些經驗讓我感覺

反而最難處理的 卻是 大家都很好 很認真 很盡責
卻沒辦法 達到 要求時

到底是 哪個層級的問題?!
管理制度上 產生的問題嗎?
公司規模 跟要求程度的問題嗎?
真的用香蕉請到猴子了嗎?!

很複雜 ... 很難搞 = =|||

總結

盡我所能 多跟自己計較  而不是別人
重點~ 學習才是王道!!!