首页
论坛
课程
招聘
[原创]商业dwm绘制取巧分析
2021-1-5 21:27 6447

[原创]商业dwm绘制取巧分析

2021-1-5 21:27
6447

一、PY得到样本And测试码

1.png

 

得到一个绘制的例子和一个易语言模块,首先把模块拖进某软件XXYY,于是得到了模块源码。

二、分析模块源码

观察下图

 

2.png

 

不难发现这里加载了一个dll到自身。然后把导出函数地址给全局变量。

 

重点:仔细观察第一个红框。他对一个资源文件进行了解密。所以我们只要在他解密后将他的dll文件取出来。那么只需要一行代码。
3.png

 

编译运行,这样我们就取到了dll

三、分析DLL

用工具查看dll的导出函数

 

4.png

 

将dll拖进od,跳转到InstallDWM函数。

 

5.png

 

看到这个我想丢进回收站!!!!

 

这条路走不通,呜呜呜,我太菜了。

 

思考一手。突然灵机一动。众所周知dwm绘制,那么绘制流程一定是在dwm里的。但是绘制的逻辑在刚才的绘制例子.e里看到了。所以嘿嘿,他们之间一定存在某种py交易。

 

6.png

 

但是里面全是vm,我又不想去分析他们怎么py的。所以我盲猜跨进程大概可能应该用了WriteProcessMemory.

四、动手干

我直接一个驱动起步,把NtWriteVirtualMemory给他hook了

1
2
3
4
5
6
7
8
9
10
NTSTATUS __stdcall MyWriteVirtualMemory(HANDLE ProcessHandle, PVOID BaseAddress, PVOID Buffer, SIZE_T NumberOfBytesToWrite, PSIZE_T NumberOfBytesWritten)
{
    MyNtWriteVirtualMemory a = Ori_NtWriteVirtualMemory;
    PEPROCESS eprocess = IoGetCurrentProcess();
 
 
 
    KdPrint(("[xxx]Name:%s   BaseAddress:%llX  Buffer:%llX  NumberOfBytesToWrite:%d  NumberOfBytesWritten:%d\n", (const char*)PsGetProcessImageFileName(eprocess), BaseAddress, Buffer, NumberOfBytesToWrite, NumberOfBytesWritten));
    return a(ProcessHandle, BaseAddress, Buffer, NumberOfBytesToWrite, NumberOfBytesWritten);
}

然后dbgview一开,驱动一加载,然后再绘制例子里填上Py来的测试码。

 

驱动加载前,必备shark,感谢飞总,让我这彩笔也能在win10上玩hook。

 

当开启绘制后,可以从上面的e语言例子看到,是在线程里不断绘制。

 

而我的dbgview也不断输出信息

 

7.png

 

被写的进程肯定就是dwm.exe了。从上面的信息可以观察出,主要就两个内容。一个是写好多好多东西,我猜测是绘制的内容。另一个地址是不会变的,所以我们可以用ce打开dwm.exe观察一下。

 

8.png

 

通过观察他的值在0 1 2三个值不停变动。所以我判断这是一个标志位,判断这个标志位做对应的操作(我猜的)。

 

所以只要找出访问他的地方就能得知他的绘制位置。

 

9.png

 

到了一个无模块的地址,这里就是绘制的位置了。然后我们再来看看他是怎么hook的。找到首地址,想办法返回到上一层。

 

10.png

 

通过红色箭头调用到无模块地址的。但是这个call会进入一个ntdll模块里的LdrpDispatchUserCallTarget函数里。我百度了一圈,不思其解。后来看了一眼汇编。搜嘎。他里面会jmp rax。所以他应该是改了rax。追一下,rax来源[rax+0x148],后面的操作我就不说了

 

11.png

 

从上图可以看到某个对象里的函数指针被改成了他的绘制地址,从而达到hook的目的。

 

PS:这个不算分析的分析,希望大家不要喷我,能力有限,不能硬怼vm,只能取巧了。

 

我是科锐110期学员,希望大家多多关照。


[培训] 优秀毕业生寄语:恭喜id:一颗金柚子获得阿里offer《安卓高级研修班》火热招生!!!

最后于 2021-1-5 21:28 被qqzxc编辑 ,原因:
收藏
点赞1
打赏
分享
最新回复 (29)
雪    币: 1195
活跃值: 活跃值 (2032)
能力值: ( LV6,RANK:158 )
在线值:
发帖
回帖
粉丝
L0x1c 活跃值 1 2021-1-5 21:46
2
0
龟哥无敌!呜呜呜!站楼
雪    币: 4495
活跃值: 活跃值 (486)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
如斯咩咩咩 活跃值 2021-1-5 21:49
3
0
好哥哥开始搞了
雪    币: 5848
活跃值: 活跃值 (1013)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
黑洛 活跃值 1 2021-1-5 23:49
4
1

dwm绘制本身不涉及驱动,驱动主要是为了注入dll/shellcode用的。

绘制用的dll/shellcode大致做了下面的操作:

  1. 定位SwapChain

  2. hook Present

dwm.exe是所有窗口的顶级窗口,除了无法使用窗口消息,其余的和一般的d3d进程没有大区别。

下面附部分代码:


以上代码是我之前写的dwm绘制的部分代码。由于不支持窗口消息,导致我还要再起一个进程去做映射,中间还要通讯,我就放弃了,换了其他方案。


雪    币: 1044
活跃值: 活跃值 (534)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
鸭子咯咯哒 活跃值 2021-1-6 08:05
5
0
楼主这些东西可以在哪儿学到
雪    币: 601
活跃值: 活跃值 (986)
能力值: ( LV3,RANK:32 )
在线值:
发帖
回帖
粉丝
qqzxc 活跃值 2021-1-6 08:47
6
0
黑洛 dwm绘制本身不涉及驱动,驱动主要是为了注入dll/shellcode用的。绘制用的dll/shellcode大致做了下面的操作:定位SwapChainhook Presentdwm.exe是所有窗口 ...
tql。呜呜呜,带带我
雪    币: 601
活跃值: 活跃值 (986)
能力值: ( LV3,RANK:32 )
在线值:
发帖
回帖
粉丝
qqzxc 活跃值 2021-1-6 08:47
7
0
鸭子咯咯哒 楼主这些东西可以在哪儿学到
看楼上,舔大佬
雪    币: 350
活跃值: 活跃值 (68)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mllaopang 活跃值 2021-1-6 08:55
8
0
感谢分享,,,,,
雪    币: 735
活跃值: 活跃值 (1302)
能力值: ( LV6,RANK:84 )
在线值:
发帖
回帖
粉丝
还我六千雪币 活跃值 2021-1-6 10:59
9
0
龟哥无敌
雪    币: 226
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
冷风in 活跃值 2021-1-6 11:00
10
0
想舔个下载地址,研究
雪    币: 601
活跃值: 活跃值 (986)
能力值: ( LV3,RANK:32 )
在线值:
发帖
回帖
粉丝
qqzxc 活跃值 2021-1-6 11:11
11
0
冷风in 想舔个下载地址,研究

https://share.weiyun.com/M0r50dr3

雪    币: 226
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
冷风in 活跃值 2021-1-6 11:54
12
0
谢谢
雪    币: 0
活跃值: 活跃值 (196)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
哎哟哥哥^ 活跃值 2021-1-6 13:23
13
0
不知道有没有开源项目
雪    币: 285
活跃值: 活跃值 (488)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
杰克王 活跃值 2021-1-7 00:30
14
0
龟哥无敌!呜呜呜!站楼
雪    币: 5848
活跃值: 活跃值 (1013)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
黑洛 活跃值 1 2021-1-7 02:42
15
0
qqzxc tql。呜呜呜,带带我
我不是大佬,只是dwm我刚好弄过而已
雪    币: 6606
活跃值: 活跃值 (423)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tomtory 活跃值 2021-1-7 09:22
16
0
图好像挂了
雪    币: 601
活跃值: 活跃值 (986)
能力值: ( LV3,RANK:32 )
在线值:
发帖
回帖
粉丝
qqzxc 活跃值 2021-1-7 09:28
17
0
tomtory 图好像挂了
奥,我清了下缓存,打开也看不到图片,多刷新几下就出来了
雪    币: 182
活跃值: 活跃值 (151)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
aresmar 活跃值 2021-1-7 09:54
18
0
有没有交流裙
雪    币: 915
活跃值: 活跃值 (1270)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
丿一叶知秋 活跃值 2021-1-7 10:06
19
0
貌似是 低版本的VM。 高版本都是 Push  和 Jmp 做入口特征???
雪    币: 601
活跃值: 活跃值 (986)
能力值: ( LV3,RANK:32 )
在线值:
发帖
回帖
粉丝
qqzxc 活跃值 2021-1-7 11:16
20
0
丿一叶知秋 貌似是 低版本的VM。 高版本都是 Push 和 Jmp 做入口特征???
大佬说是vmp3.x
雪    币: 1257
活跃值: 活跃值 (2198)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lhxdiao 活跃值 2021-1-8 19:45
21
0
这种东西表示可以随手做一个出来,但是楼主分析vmp是真的强。另看完讨论,提示一下那个驱动其实跟主要逻辑分离的,用处是绕过一些钩子实现内存注入。
雪    币: 107
活跃值: 活跃值 (105)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yangya 活跃值 2021-1-8 21:33
22
0
LdrpDispatchUserCallTarget是开了CFG
雪    币: 298
活跃值: 活跃值 (443)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
章鱼C 活跃值 2021-1-11 05:44
23
0

类似的方式很久以前就有了 https://www.unknowncheats.me/forum/general-programming-and-reversing/377179-using-dwm-realize-drawing-engine.html
dwm绘制其实没什么特殊的 无非是不需要创建窗口 只要能加载驱动 连进程都不需要了 给谁绘制都是自己说了算 关键是如何拒绝dwm融合或者说绕过dwm融合 这才是最难的地方 我最近挖了半个月 从r3一路快挖到硬件层也没挖出来什么东西

最后于 2021-1-11 05:47 被章鱼C编辑 ,原因:
雪    币: 219
活跃值: 活跃值 (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cralsen 活跃值 2021-1-12 14:52
24
0
章鱼C 类似的方式很久以前就有了 https://www.unknowncheats.me/forum/general-programming-and-reversing/377179-us ...
拒绝dwm融合啥意思?
雪    币: 408
活跃值: 活跃值 (294)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdjytony 活跃值 2021-1-13 02:45
25
0
阿龟上道了
游客
登录 | 注册 方可回帖
返回