读书人

一种在流入进程中使用WTL创建无焦点不

发布时间: 2012-09-12 09:21:30 作者: rapoo

一种在注入进程中使用WTL创建无焦点不在任务栏出现“吸附”窗口的方法和思路

最近一直在做沙箱项目,在项目快接近结尾的时候,我想给在我们沙箱中运行的程序界面打上一个标记——标识其在我们沙箱中运行的。我大致想法是:在被注入程序的顶层窗口上方显示一个“标题性”窗口,顶层窗口外框外显示一个“异形”的空心窗口。这些窗口如影子般随着其被“吸附”窗口移动而移动,大小变化而变化。(转载请指明出处)以记事本为被注入程序为例:一种在流入进程中使用WTL创建无焦点不在任务栏出现“吸附”窗口的方法和思路

我用的注入和HooKApi方案是采用微软的detour库。关于如何HookApi的方法,可以参看我之前的《一种注册表沙箱的思路、实现——Hook Nt函数》。注入的方案,我采用的Detour库的DetourCreateProcessWithDll函数,该函数的W版原型是

void CWTLOutSideWindow::DoPaint( HDC dc ){    CRect rc;    GetClientRect(&rc);    CMemoryDC MemDc( dc, rc );    HRGN RgnInside = CreateRectRgn( rc.left + WIDTHHEIGHTADD, rc.top + WIDTHHEIGHTADD,        rc.right - WIDTHHEIGHTADD, rc.bottom - WIDTHHEIGHTADD );        HRGN RgnOut = CreateRectRgn( rc.left, rc.top, rc.right, rc.bottom );    CombineRgn( RgnOut, RgnOut, RgnInside, RGN_DIFF );    MemDc.FillRgn( RgnOut, m_brush );    SetWindowRgn( RgnOut, TRUE ); // 设置异形窗口        DeleteObject( RgnInside );    DeleteObject( RgnOut );}
这样整个工程OK。以下是源码工程。

源码工程












读书人网 >编程

热点推荐