看板 C_and_CPP 關於我們 聯絡資訊
↖水☆晶▲顯㊣靈↗ 速抄下球裡發出的那個光。 傳原原Po在批踢踢之C_and_CPP版發問此問題:「 為什麼用findwindow找combobox的handler都找不到,可是button卻可以?? 」 並於遭到質疑後附上了程式碼片段:「 IntPtr mWin = FindWindow("ThunderRT6FormDC", "POSDLLDemo"); IntPtr mFrame = FindWindowEx(mWin, IntPtr.Zero, "ThunderRT6Frame", "Port Config"); currChild = FindWindowEx(mFrame, prevChild, "ThunderRT6ComboBox", "COM1"); 」 神旨傳令快,如有抄錯請見諒。 讓我們重現一下歷史,請看: 首先他說是用C++寫的,好,再來他用到了今天令眾生起蒸液的IntPtr, 也就是說這是一個用到.net Framework,或者說得更精確,是C++/CLI的程式。 如何在Visual Studio上建立一個C++/CLI的專案呢? 首先開啟Visual Studio,按下「New Project」,語言選擇「Visual C++」, 接著從「CLR」建立一個「CLR Console Application」。 http://i.imgur.com/6oPxs8E.png
出來了!傑尼……不對,出來了!程式碼。 http://i.imgur.com/ZREqNEz.png
我們發現原PO使用的攻擊技能是Windows API, Windows的API都是以C-style導出函數, 並出沒在Windows上各種系統DLL, 比如今天的「FindWindow」以及「FindWindowEx」都是在「user32.dll」中, 怎麼知道神奇寶貝的詳細資料?看圖鑑就對了! Windows開發人員必備的圖鑑就是「MSDN」,讓我們來看看: FindowWindow在 https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms633499(v=vs.85).aspx 縮:http://bit.ly/FindWindow FindWindowEx在 https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms633500(v=vs.85).aspx 縮:http://bit.ly/FindWindowEx 我們將網頁往下滑找到「Requirements」的表格, 就可以看到這裡有說明此API位在哪個DLL,要引用哪個header,支援的系統版本等。 好,查完了圖鑑,就可以開始收服了! 首先在.net中想要呼叫外部DLL的函數,必須用到一項技術叫「Platform invoke」, 有時也會看到「P/Invoke」這樣的寫法, 雖然C++/CLR可以直接#include <Windows.h>來呼叫Windows API, 但是這樣就無法在不用轉型的狀況下重現IntPtr了。 要呼叫Unmanaged DLL提供的函數,必需定義他的名稱、參數,以及DLL, 但首先必須 using namespace System::Runtime::InteropServices; [DllImport ("user32")] IntPtr FindWindow(String ^, String ^); [DllImport ("user32")] IntPtr FindWindowEx(IntPtr, IntPtr, String ^, String ^); 我已省略參數名稱,如不確定還是可以上MSDN查詢。 接著就可以把程式貼上去看看會發生什麼事了。 https://i.imgur.com/k3P3670.png
看到了嗎?可是,瑞凡,你…… 什麼!?「IntPtr.Zero」,這不是C#嗎? 好的,辛苦了這麼久,原來是C#啊,我還以為是C++……除非是用打的筆誤。 完。 後記: 如果是C++的話,應該打「IntPtr::Zero」才對。 附上完整程式碼:https://i.imgur.com/IHnATV4.png
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.8.94.89 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1468873954.A.47B.html
TobyH4cker: 後記應該寫對不起版工大大我錯惹↘ 07/19 04:33
wtchen: 我就是想避免這種"搞了半天原來是C#"的事件發生 07/19 04:39
wtchen: 浪費板友時間才新增限制,畢竟發問者自己也有責任 07/19 04:40
wtchen: 去協助協助者釐清問題 07/19 04:40
TobyH4cker: 之前有篇文也是C#發到這,是不是也是他呀?刪了找不到 07/19 04:40
wtchen: 是阿,所以我當時有點火 07/19 04:43
TobyH4cker: 如果我還記得是他的話就...不會弄錯了 07/19 04:46
wtchen: 總之辛苦了,還多花時間幫忙看 07/19 04:51
Sidney0503: 推一下XDDDDDD 07/19 07:24
Sidney0503: 今天在cpp版看到cs的程式碼怎麼辦? 07/19 08:00
Sidney0503: 文章關起來 假的!! 07/19 08:00
Sidney0503: 我眼睛業障重阿 07/19 08:01
Sidney0503: 開啟二進位檔 反組譯成組合語言 看記憶體內容 07/19 08:04
Sidney0503: 那才是真的 07/19 08:04
TobyH4cker: 然後再轉成C pseudo code 因為是假的 07/19 11:56
damody: 超有趣 感謝分析 07/19 21:05
james732: 推業障重的分析 07/19 23:09
s25g5d4: 看到這 ID 想到我都用大大的教學把楓谷安裝檔 torrent 07/20 00:03
s25g5d4: 拉出來 (worship) 07/20 00:03
s25g5d4: 可是有沒有不用開程式就能撈 torrent 的方法 QAQ 07/20 00:03
TobyH4cker: 那可能需要逆向分析它的代理下載器了,可是這樣就會 07/20 05:06
TobyH4cker: 違反條約,另一個方法是寫一個程式直接讀記憶體來替代 07/20 05:07
TobyH4cker: 手動操作,但一樣還是得開下載器,總之都是熱血啊啊 07/20 05:07
s25g5d4: 這個時間回文是還沒睡還是剛起床 OuO 07/20 05:15
TobyH4cker: 晚安 07/20 05:39