作者TobyH4cker (Toby (我要当好人))
看板C_and_CPP
标题Re: [公告] 关於疑似非C/C++相关文章之处理
时间Tue Jul 19 04:32:26 2016
↖水☆晶▲显㊣灵↗
速抄下球里发出的那个光。
传原原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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1468873954.A.47B.html
1F:→ TobyH4cker: 後记应该写对不起版工大大我错惹↘ 07/19 04:33
2F:推 wtchen: 我就是想避免这种"搞了半天原来是C#"的事件发生 07/19 04:39
3F:→ wtchen: 浪费板友时间才新增限制,毕竟发问者自己也有责任 07/19 04:40
4F:→ wtchen: 去协助协助者厘清问题 07/19 04:40
5F:→ TobyH4cker: 之前有篇文也是C#发到这,是不是也是他呀?删了找不到 07/19 04:40
6F:→ wtchen: 是阿,所以我当时有点火 07/19 04:43
7F:→ TobyH4cker: 如果我还记得是他的话就...不会弄错了 07/19 04:46
8F:推 wtchen: 总之辛苦了,还多花时间帮忙看 07/19 04:51
9F:推 Sidney0503: 推一下XDDDDDD 07/19 07:24
10F:推 Sidney0503: 今天在cpp版看到cs的程式码怎麽办? 07/19 08:00
11F:→ Sidney0503: 文章关起来 假的!! 07/19 08:00
12F:→ Sidney0503: 我眼睛业障重阿 07/19 08:01
13F:→ Sidney0503: 开启二进位档 反组译成组合语言 看记忆体内容 07/19 08:04
14F:→ Sidney0503: 那才是真的 07/19 08:04
15F:→ TobyH4cker: 然後再转成C pseudo code 因为是假的 07/19 11:56
16F:推 damody: 超有趣 感谢分析 07/19 21:05
17F:推 james732: 推业障重的分析 07/19 23:09
18F:推 s25g5d4: 看到这 ID 想到我都用大大的教学把枫谷安装档 torrent 07/20 00:03
19F:→ s25g5d4: 拉出来 (worship) 07/20 00:03
20F:→ s25g5d4: 可是有没有不用开程式就能捞 torrent 的方法 QAQ 07/20 00:03
21F:→ TobyH4cker: 那可能需要逆向分析它的代理下载器了,可是这样就会 07/20 05:06
22F:→ TobyH4cker: 违反条约,另一个方法是写一个程式直接读记忆体来替代 07/20 05:07
23F:→ TobyH4cker: 手动操作,但一样还是得开下载器,总之都是热血啊啊 07/20 05:07
24F:推 s25g5d4: 这个时间回文是还没睡还是刚起床 OuO 07/20 05:15
25F:→ TobyH4cker: 晚安 07/20 05:39