【VC++开源代码栏目提醒】:网学会员为广大网友收集整理了,gh0st 源码免杀 详解 - 互联网,希望对大家有所帮助!
gh0st 源码免杀 详解 gh0st 源码免杀 详解 2010年12月13日 远控软件gh0st3.6
开源了
开源意味着我们可以在此基础上进行二次开发同时也意味着杀软可以较容易的查杀该款远控木马既然要利用我们就做好源码基础上的木马免杀工作。
序 gh0st远控
软件采用驱动级RESSDT过主动svchost参数启动替换系统服务的方式
工作的工作方式较为先进美中不足的部分是没有进行驱动级或用户级隐藏当然这部分可以添加进去。
编码利用了
VC的编程环境。
一、环境配置 编译环境一定要配置好DDKSDKVC6DDK用来编译sys文件的SDKVC6是用来编译工程的配置部分比较简单网上有很多资料这里不再详述有兴趣的朋友也可以查看DDK和SDK的相关帮助。
二、特征码定位简述 杀毒软件查杀木马的原理基本是根据特征查杀的被查杀的部分我们称之为特征码所以我们可以利用特征码定位工具MyCLL定位出病毒的特征码位置定位工具原理是将被扫描木马分块利用分段填充的方式匹配杀软的特征值找到杀软查杀病毒的位置。
定位出特征码如何反向找到源码中的对应位置呢请看下面分析 三、二进制文件与源码定位之map文件利用 map文件是二进制和源码之间对应的一个映射文件。
我们假设根据第三步我们定位出了病毒的特征码 病毒名称 特征码位置 内存地址 svchost.dll 000038AA_00000002 100044AA svchost.dll 00005F98_00000002 第一步设置
VC编译环境生成Map文件。
在
VC 中点击菜单“Project - Settings”选项页或按下 AltF7选择 C/C 选项卡并在最下面的 Project Options 里面输入/Zd 然后要点击 Link 选项卡选中“Generate mapfile”复选框并在最下面的 Project Options 里面输入/mapinfo:lines表示生成 MAP 文件时加入行信息。
设置完成。
第二步编译
VC工程设置活动工程编译即可这个不用说明。
这个步骤完成后在release或debug目录多了一个.map文件比如svchost.map。
第三步打开map文件用UE或文本编辑器打开都行形式如下 begin Timestamp is 488fcef2 Wed Jul 30 10:16:18 2008 Preferred load address is 10000000 -------------------------------------------------- -------------------------1----为方便说明wrw添加 Start Length Name Class 0001:00000000 00010a50H .text CODE 0001:00010a50 00000485H .textx CODE 0002:00000000 000004c8H .idata DATA ...... 0003:00000010 00000004H .CRTXIZ DATA 0003:00000020 00001a50H .data DATA 0003:00001a70 00000688H .bss DATA 0004:00000000 000000a8H .rsrc DATA 0004:000000b0 00000cf0H .rsrc DATA -------------------------------------------------- --------------------------2---为方便说明wrw添加 Address Publics by Value RvaBase Lib:Object 0001:00000000 0CAudioQAEXZ 10001000 f Audio.obj 0001:000000d0 _GCAudioUAEPAXIZ 100010d0 f i Audio.obj 0001:000000d0 _ECAudioUAEPAXIZ 100010d0 f i Audio.obj 0001:000000f0 1CAudioUAEXZ 100010f0 f Audio.obj 0001:000001e0 getRecordBufferCAudioQAEPAEPAKZ 100011e0 f Audio.obj 0001:00000240 playBufferCAudioQAE_NPAEKZ 10001240 f Audio.obj 0001:000002c0 InitializeWaveInCAudioAAE_NXZ 100012c0 f Audio.obj ...... 0001:00003310 SendTokenCFileManagerAAEHEZ 10004310 f FileManager.obj 0001:00003320 UploadToRemoteCFileManagerAAE_NPAEZ 10004320 f FileManager.obj 0001:00003440 FixedUploadListCFileManagerAAE_NPBDZ 10004440 f FileManager.obj 0001:00003670 StopTransferCFileManagerAAEXXZ 10004670 f FileManager.obj 0001:00003730 CreateLocalRecvFileCFileManagerAAEXPAEZ 10004730 f FileManager.obj ...... -------------------------------------------------- --------------------------3---为方便说明wrw添加 Line numbers for .ReleaseFileManager.objE:vtmpgh0st3srcServer svchostcommonFileManager.cpp segment .text 17 0001:00002630 20 0001:0000267f 21 0001:00002698 24 0001:000026d0 25 0001:000026f8 26 0001:0000273c 29 0001:000027d0 33 0001:000027ee 77 0001:000027f8 36 0001:000027fb 37 0001:00002803 77 0001:0000280d ...... 532 0001:0000340f 534 0001:00003414 537 0001:00003428 540 0001:00003440 546 0001:0000345d 547 0001:00003487 548 0001:00003490 549 0001:00003492 551 0001:0000349e 552 0001:000034b8 553 0001:000034cb 554 0001:000034d4 558 0001:000034de 560 0001:000034e9 563 0001:000034ee 564 0001:00003506 ...... end 我们看下定位svchost.dll 的第一个特征码内存地址为100044AA在第2块中我们可以找到RVABASE与之很接近的是 0001:00003440 FixedUploadListCFileManagerAAE_NPBDZ 10004440 f FileManager.obj 这样我们可以定位到FileManager.cpp中的FixedUploadList函数是不是范围缩小了 下面我们再缩小
代码行 利用这个公式特征码行偏移 特征码地址Crash Address 基地址ImageBase Address 0x1000 看起来好像很难其实很简单我们将100044AA去掉内存基址10000000再减1000因为PE很多从1000开始可以得到
代码偏移地址为34AA。
到第3块中找对应的
代码行。
偏移地址34AA在551 0001:0000349e 552 0001:000034b8 中间也就是551行和552行中间我们到源程序中查找第551行 wsprintflpszFilter ss. lpPathName lpszSlash 这样就定位出源
代码了要怎么修改就怎么修改它就可以了。
四、实战免杀 A、卡巴免杀 首次编译后先做卡巴的免杀。
卡巴杀sys文件和dll当然也就杀包装它们的install.exe最后卡巴还杀生成的sever我这里说杀生成好的server不是和前面的特征码重叠的地方而是杀配置信息。
第一步、sys免杀 sys重新编译后增加了输入表的函数同时系统不同造成很多地方不同于原特征顺利通过卡巴、金山、小红伞等杀软。
第二步、svchost.dll免杀 特征码定位MultiByteToWideChar和gh0st update两个位置。
这里是通过第3步map文件得出的。
卡巴怕加花指令这个函数MultiByteToWideChar的调用上可以在这个函数前面随便加几句无效语句就可以通过卡巴杀软。
字符串调用gh0st update 这个是用于更新用的如果不要在线更新直接把这个语句所在
代码块删除嘿嘿其实
搜索工程替换这个字符串为其他的字符串就可以了_这个方法同时可以过金山杀软。
第三步、server免杀 卡巴定位在最后的配置信息采取跳转显然是不行的采用加花的办法在写入AAAAAA配置信息之前随便写些东西就可以做server免杀。
卡巴免杀完成 B、Avast免杀 最新的avast杀软再查杀1下杀install.exe和svchost.dll也就是杀生成的文件和其中的资源文件接着做它的源码免杀。
定位在特征字符串d/d/d和“SYSTEMCurrentControlSetServicess”两个地方。
解决方案 1、svchost.dll的特征码定位在键盘记录KeyboardManager.cpp文件中的SaveInfochar lpBuffer函数。
特征字符串d/d/d也就是我们看到键盘记录的日期修改之修改的方法很多将其改为d/d/d d:d:d 编译即可通过avast杀软。
2、install的特征码定位在“SYSTEMCurrentControlSetServicess”对应文件是install.cpp里的InstallService函数修改大小写编译即可通过免杀。
五、添加垃圾
代码的小方法 垃圾
代码要移动特征码所在的位置不要跑到堆栈中了这样的
代码没有用。
可以采取添加for循环做计数简单统计采用局部变量不改变后面的逻辑为宜。
添加输出表的方法 有杀输出表的可以在生成的svchost.dll上添加空函数但是每次编译都要修改1次资源其实我们在源码上添加如下语句 extern C __declspecdllexport bool JustTempFun//声明 ???? extern C __declspecdllexport bool JustTempFun //实现 return false 编译后输出表就被改变了有的杀软就可做到
代码免杀。
六、gh0st自动生成6to4ex.dll的修改 看到好多站友提问自动生成6to4ex.dll的问题有热心站友也提出了自己的见解我感觉有些人提出的解决
方案不完全正确有可能造成刚入手人误解我根据自己的理解说明1下。
gh0st服务端是通svchost -netsvcs启动的所以程序要利用netsvcs 服务服务端也就是根据netsvcs生成的故不能说服务端生成是随机的相对于大多数
系统来讲基本是固定的下面看分析。
查看install.cpp里面的InstallService方法首先遍历HKEY_LOCAL_MACHINESOFTWARE MicrosoftWindows NTCurrentVersionSvchost中的服务项查找到一个服务后
程序采取替换服务的方法将原服务删除然后生成对应服务项 ex.dll的文件替换原服务6to4服务一般排在第一位6to4服务是一种自动构造隧道的方式作用在于只需要一个全球惟一的IPv4地址便可使得整个站点获得IPv6 的连接这个服务对一般人来讲基本闲置所以我们的程序就把6to4服务给替换掉同时在windowssystem32目录下生成 6to4ex.dll以后启动就是6to4ex了如果把这个服务跳过去就依次向下生成Ias、Iprip等服务啦如果netsvcs项没有可以替换的服务则程序将自己添加1个服务名称就是由 AddsvchostService方法产生的netsvcs_0xd。
这样说不知道关心服务名称的明白了不 这个不能说是技术
问题但是小技巧问题可以从这里产生我不知道其他人的360是怎么过的但是我觉得可以提示1下的是如果是360默认系统安全的服务它肯定不会报不安全替换闲置的系统安全的服务则通过360的效果要好的多.