[心得] C++/CLR 使用IntPtr、呼叫Windows API教学(崩溃、忏悔)

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

Links booklink

Contact Us: admin [ a t ] ucptt.com