首页
社区
课程
招聘
[原创]VC黑防日记(二):DLL隐藏和逆向(下)
发表于: 2020-1-11 18:57 10507

[原创]VC黑防日记(二):DLL隐藏和逆向(下)

2020-1-11 18:57
10507

【本文主题】:谈谈上次遗留的“干掉吾爱破解OD等工具的模块枚举检测”

【实验平台】:Win7 x64

【开发平台】:Win10 x64 + VS2017

【调试工具】:Ollydbg

【本文作者】:小迪xiaodi,一个非著名技术段子文章菜鸟写手

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.判断DLL句柄是否有效,有效就说明该DLL存在于进程中


2. 递减模块的引用计数,且判断是否为0


3. 调用模块的DllMain函数响应 DLL_PROCESS_DETACH消息


4.从进程空间撤销对DLL的内存映射


然后我们通过对第四个步骤的分析,采用HOOK  FreeLibrary 函数中的 ZwUnmapViewOfSection函数,实现了擦除DLL痕迹隐藏DLL的功能,但是出现了一丢丢的问题,那就是被某些“强大”的工具检测并枚举了出来,那么为什么会这样呢?今天我们进来分析分析~





--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

结语:


把一些新奇的想法用代码去做实验实现还是比较有意思的,技术有些粗陋,重要的是享受过程(其实就是我菜)




文章开头说到“远程调Call”几个字眼,那么下节实验的题目就来了~





经过几天的努力,我的毕业论文终于写的差不多了,老师说:

OK,那咱们继续回论坛吹水~

前段日子呢,写了个《VC黑防日记(一):DLL隐藏和逆向(上)》的水文,也得到论坛的带佬对我“能力”的认可:


那我们今天,继续来混一下字数,谈谈上次遗留的的问题——干掉吾爱破解OD这类工具对HOOK FreeLibrary方式隐藏DLL的检测

怎么干呢,很简单,就是让它没了:

注入进去DLL之后,拷贝DLL镜像到一块内存地址,然后卸载DLL后,再把内存镜像还原回原地址

这样子,只是简单的内存数据复制,而DLL的确被卸载了,拷贝后的DLL内存数据,只要计算下导出函数地址便可以调用,相当于远程调Call.


在此,也要感谢上次各位老哥推荐的灵活的方法思路,本文章并未进行复现,有机会可以一块儿写出来,在此表示感谢!




--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

0x01:回顾


我们上次是通过分析FreeLibrary函数的流程得知大概分为四个步骤:

1.判断DLL句柄是否有效,有效就说明该DLL存在于进程中


2. 递减模块的引用计数,且判断是否为0


3. 调用模块的DllMain函数响应 DLL_PROCESS_DETACH消息


4.从进程空间撤销对DLL的内存映射


然后我们通过对第四个步骤的分析,采用HOOK  FreeLibrary 函数中的 ZwUnmapViewOfSection函数,实现了擦除DLL痕迹隐藏DLL的功能,但是出现了一丢丢的问题,那就是被某些“强大”的工具检测并枚举了出来,那么为什么会这样呢?今天我们进来分析分析~





--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

0x02:分析


既然我们上次HOOK  ZwUnmapViewOfSection出现了小问题,能不能对 ZwUnmapViewOfSection做一些小手脚呢,暂时我的知识储备还不够,处理不了,但是我选择了其他的绕过方式,在讲这个方式之前,我们先了解一部分逆向的理论知识:

我们上次是通过分析FreeLibrary函数的流程得知大概分为四个步骤:


虚拟地址描述符:

大家都知道,在x86的平台上Windows操作系统为每个进程描述了一个完整的4G的地址空间,这4G空间由低位2G的用户地址空间和高位2G的系统地址空间构成。每个进程的用户地址空间是相互隔离的,不可见的。但是系统地址空间是各个进程间共享的,对于进程有不同的视图。用户的私有的数据代码还有加载的动态链接库(DLL)都存放在用户地址空间中。现在有个问题是,总要有个地方记录着这2G地址空间,到底那些被预留了,那些被提交了,那些被访问了吧。还有个问题就是,对于程序来讲,地址不是连续的,是分段的。代码段、数据段、堆、栈等等。可是进程的空间是连续的,从0x0000000到0x7FFFFFF。总要有个数据结构描述程序的各个段对应那段地址空间。这两个重要任务就交个了VAD,即虚拟地址描述符(Virtual Address Descriptor)。

VAD组织成了一个AVL自平衡二叉树(参考Mark Russinovich的《深入解析Windows操作系统》),这种组织方式完全是方便快速查找。树中的每一个节点代表了一段虚拟地址空间。所以程序的代码段,数据段,堆段都会各种占用一个或多个VAD节点,由一个MMVAD结构完整描述。
内核空间并不受VAD的管理。

https://baike.baidu.com/item/%E8%99%9A%E6%8B%9F%E5%9C%B0%E5%9D%80%E6%8F%8F%E8%BF%B0%E7%AC%A6/295257?fr=aladdin

大家都知道,在x86的平台上Windows操作系统为每个进程描述了一个完整的4G的地址空间,这4G空间由低位2G的用户地址空间和高位2G的系统地址空间构成。每个进程的用户地址空间是相互隔离的,不可见的。但是系统地址空间是各个进程间共享的,对于进程有不同的视图。用户的私有的数据代码还有加载的动态链接库(DLL)都存放在用户地址空间中。现在有个问题是,总要有个地方记录着这2G地址空间,到底那些被预留了,那些被提交了,那些被访问了吧。还有个问题就是,对于程序来讲,地址不是连续的,是分段的。代码段、数据段、堆、栈等等。可是进程的空间是连续的,从0x0000000到0x7FFFFFF。总要有个数据结构描述程序的各个段对应那段地址空间。这两个重要任务就交个了VAD,即虚拟地址描述符(Virtual Address Descriptor)。

VAD组织成了一个AVL自平衡二叉树(参考Mark Russinovich的《深入解析Windows操作系统》),这种组织方式完全是方便快速查找。树中的每一个节点代表了一段虚拟地址空间。所以程序的代码段,数据段,堆段都会各种占用一个或多个VAD节点,由一个MMVAD结构完整描述。
内核空间并不受VAD的管理。

https://baike.baidu.com/item/%E8%99%9A%E6%8B%9F%E5%9C%B0%E5%9D%80%E6%8F%8F%E8%BF%B0%E7%AC%A6/295257?fr=aladdin

分析一下:

1.有个玩意儿叫做“虚拟地址描述符”,存放了DLL的内存空间使用情况数据结构。

2.如果正常调用 ZwUnmapViewOfSection,内存地址所对应的“VAD”就会从树中摘除。

3.我们上次hook了 ZwUnmapViewOfSection,刚好使得被注入的DLL的 “内存空间数据结构”无法从整体的“二叉树”结构中消除。

结论:

1.如果不HOOK ZwUnmapViewOfSection ,就假戏真做,DLL就真的被卸载了。

2.如果HOOK了  ZwUnmapViewOfSection,就很难受,虚拟地址描述符清除不掉,还是过不了吾爱破解OD的检测。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-1-11 18:59 被小迪xiaodi编辑 ,原因:
收藏
免费 4
支持
分享
最新回复 (23)
雪    币: 174
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
大佬大佬,我这小白,从前面文章看过来的,表示看懵逼了。
2020-1-11 19:26
0
雪    币: 9044
活跃值: (6260)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
gh0st源碼早就有這個了。。。猜一猜這個源碼是那個時代的。
最后于 2020-1-11 22:31 被mudebug编辑 ,原因:
2020-1-11 22:28
0
雪    币: 9934
活跃值: (2554)
能力值: ( LV6,RANK:87 )
在线值:
发帖
回帖
粉丝
4
内存加载,还是直接开空间写进来修表吧,虽然麻烦了点就是了
2020-1-11 22:33
0
雪    币: 914
活跃值: (2468)
能力值: ( LV5,RANK:68 )
在线值:
发帖
回帖
粉丝
5
小迪xiaodi,一个名不见经传的歪瓜作者
2020-1-12 09:09
0
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
6
网易云课堂卖CS1.6和植物大战僵尸外挂教程,一份300的大佬的能力,还需要我来肯定吗?肯定不需要我肯定,大家都知道你多优秀。
2020-1-12 09:33
1
雪    币: 9626
活跃值: (1838)
能力值: ( LV5,RANK:73 )
在线值:
发帖
回帖
粉丝
7
//保存数组
BYTE code[] = { 0 };
DWORD lp_copy = (DWORD)lpaddress;
DWORD lp_start = addr_start;
 
for (int i = 0; i < dwSizeOfImage; i++, lp_start++, lp_copy++) {
    ReadProcessMemory(hProcess, (LPCVOID)lp_start, code, 1, NULL);
    WriteProcessMemory(hProcess, (LPVOID)lp_copy, code, 1, NULL);
}
printf("原地址 = 0x%x 拷贝地址 = 0x%x\n", addr_start, lpaddress);
MessageBox(NULL, "拷贝完成!", "Cap", MB_OK);

为什么要这么写呢?直接Write不香吗?
退一步想,可能是为了转Shellcode方便?亦或是你担心一次性全部Write失败会拷贝不全?

那问题来了,单字节拷贝为什么不写成这样:
for (int i = 0; i < dwSizeOfImage; i++, lp_start++, lp_copy++) {
    WriteProcessMemory(hProcess, (LPVOID)lp_copy, (LPCVOID)lp_start, 1, NULL);
}


Read貌似完全不需要的说。


最后于 2020-1-12 11:39 被Sprite雪碧编辑 ,原因:
2020-1-12 11:38
0
雪    币: 5836
活跃值: (1918)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
Sprite雪碧 //保存数组 BYTE&nbsp;code[]&nbsp;=&nbsp;{&nbsp;0&nbsp;}; DWORD&nbsp;lp_copy&am ...
这个是之前为了printf每个数据写的,没有删除
2020-1-12 14:42
0
雪    币: 2065
活跃值: (500)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
9
歪瓜带手子的实力 我等都望尘莫及 顺带一提这种手段十年前就有人开源了哦
2020-1-12 14:44
0
雪    币: 5836
活跃值: (1918)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
10
Sprite雪碧 //保存数组 BYTE&nbsp;code[]&nbsp;=&nbsp;{&nbsp;0&nbsp;}; DWORD&nbsp;lp_copy&am ...
Get到了,雪碧大佬
2020-1-12 14:44
0
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
11
小迪xiaodi Get到了,雪碧大佬
你收费网易云卖CS1.6外挂教程的时候,教你的“徒弟”们错误的代码,我帮你指正以后,直接开喷踢人,现在性格改了不少嗷。
2020-1-12 14:54
1
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
12
既然你这么关注我说的话,咱就可以说道说道,毕竟老相识了,听说卖CS1.6外挂教程赚了几十万,说明你还是比较有能力的,应该快和某郁有一比了,弟弟我属实比不了。
2020-1-12 14:57
1
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
13
既然喜欢截图我说的话,就请多截一点,你也喜欢截,我也喜欢说。
2020-1-12 15:02
1
雪    币: 2065
活跃值: (500)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
14
小迪带佬啊,你别光回复雪碧带佬啊
2020-1-12 15:07
0
雪    币: 2065
活跃值: (500)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
15
回我们其他人几句也是极好的嘛
2020-1-12 15:08
0
雪    币: 5836
活跃值: (1918)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
16
刘铠文 你收费网易云卖CS1.6外挂教程的时候,教你的“徒弟”们错误的代码,我帮你指正以后,直接开喷踢人,现在性格改了不少嗷。
您好,喷人这种事情鄙人记不清了,当时出现的什么矛盾已经无从考究,移出群聊是否是您触犯群规了呢?退一步海阔天空,愿您谅解。
2020-1-12 15:50
0
雪    币: 5836
活跃值: (1918)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
17
LuciferAda 歪瓜带手子的实力 我等都望尘莫及 顺带一提这种手段十年前就有人开源了哦
是的,最近打算将一些基础性的资料,以日记和分享形式发表帖子,如果我的日记中有错误,感谢勘误
2020-1-12 15:51
0
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
18
小迪xiaodi 您好,喷人这种事情鄙人记不清了,当时出现的什么矛盾已经无从考究,移出群聊是否是您触犯群规了呢?退一步海阔天空,愿您谅解。
随你开心,如果纠正你的代码等于触犯群规,那我也不反驳,毕竟那是你的群,规矩也是你定的,踢了很正常。
2020-1-12 17:35
0
雪    币: 5836
活跃值: (1918)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
19
刘铠文 随你开心,如果纠正你的代码等于触犯群规,那我也不反驳,毕竟那是你的群,规矩也是你定的,踢了很正常。
如果今后仁兄帮助纠正代码,将不胜感激
2020-1-12 17:47
0
雪    币: 3680
活跃值: (3086)
能力值: ( LV8,RANK:147 )
在线值:
发帖
回帖
粉丝
20
每次看你的帖子真累,既要不断保存表情包,还要收藏代码。
2020-1-13 22:32
0
雪    币: 276
活跃值: (167)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
有个商业CAD就是这样把关键dll载入到内存里面去的
最后于 2020-2-27 18:33 被xj无敌编辑 ,原因:
2020-2-27 18:32
0
雪    币: 5317
活跃值: (3323)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
22
mudebug gh0st源碼早就有這個了。。。猜一猜這個源碼是那個時代的。
能给我源码链接么。。。。大佬
2020-3-4 17:39
0
雪    币: 5317
活跃值: (3323)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
23
苏啊树 能给我源码链接么。。。。大佬
还有那个源码解决了这个楼主的问题了么
2020-3-4 17:40
0
雪    币: 0
活跃值: (311)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
487这个错误,你会发现在win10一直报错,win7反而没问题。
2020-4-13 03:15
0
游客
登录 | 注册 方可回帖
返回
//