VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 9765|回复: 19

[原创] 浅谈VB6的Native EXE编写

[复制链接]
发表于 2012-8-12 20:28:52 | 显示全部楼层 |阅读模式
本帖最后由 h907308901 于 2012-8-12 21:23 编辑

RT,开始研究写这么个东西了。首先,我所说的Native指的是PE结构中Subsystem域的值为Native,这个值只有驱动和子系统进程才能使用,直接双击是无法运行的。要想运行Native EXE,需要调用RtlCreateUserProcess(XP上面,VISTA及以后不清楚),不过我们不需要考虑这些,我们将会利用SMSS来执行这个程序。

SMSS是内核第一个创建的用户进程,他拥有许多特权,作为他的子进程,我们的程序可以继承许多特权,而且99.9%的杀软此时还未启动,因此这是一个制作病毒程序的好方法
SMSS启动时会执行HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\BootExecute下面列出的程序,我们只需要在其中添加一行,写上程序的名称,重新启动,在WINDOWS徽标消失后,我们的程序就会被执行了~

编写Native EXE要注意以下几点:
1.此时各子系统(除SMSS)尚未启动,一切功能只能调用NTDLL里面的API(Csr前缀的不能调用,因为CSRSS尚未启动,Ldr前缀的也最好不要用,此时加载其他DLL会非常不稳定)
2.链接时一定注意选择正确选项
最主要的是/SUBSYSTEM:NATIVE,必须有这个,另外注意导入表中除了NTDLL外什么DLL都不能有
3.确保程序不会出错,一旦引发了一个未处理异常,或者上面几点中设置不对,都会导致一个HardError,系统给你一个蓝屏

由于使用VB6进行开发,因此还要多注意:
4. 不要使用一切内部函数(包括VarPtr和StrPtr,不过我们有替代品,见http://www.vbgood.com/forum.php?mod=viewthread&tid=106814,下面会详细叙述),不要使用VB的字符串操作,不要使用动态数组,不要使用对象,不要使用Declare(必须用TLB来调用API),等等会调用MSVBVM60的功能
5.生成了EXE后要记得从导入表中删除MSVBVM60

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

好,下面开始编写我们的Native EXE
1.准备我们的TLB
我所用的TLB是用IDL编写的,见源码tlb\NATIVELIB.IDL,哈哈,所有调用到的API都在里面,VarPtr和StrPtr的替代函数也在里面,分别是VarPtr2和StrPtr2,和http://www.vbgood.com/forum.php?mod=viewthread&tid=106814一样,都是调用RtlConvertUlongToLargeInteger,但那个是NTOSKRNL.EXE里面的,我这个是NTDLL.DLL里面的
编译TLB请运行build.bat,不过请确定电脑上已经安装了VC6完整版

2.编写代码
按照上面的注意事项即可,以下是部分代码:

  1. Function NativeMain() As Long '入口函数,命名没有限制,但必须与链接时/ENTRY选项一致
  2.     Dim ExitStatus As Long
  3.     NtQueryInformationProcess -1, ProcessBasicInformation, PBI, Len(PBI), 0 '取得进程基本信息,如不需要可以删掉
  4.     MainHeap = RtlCreateHeap(0, 0, 0, &H1000, 0, 0) '创建一个堆存放数据
  5.     ExitStatus = BootExecMain '执行真正的代码,并取得返回值
  6.     RtlDestroyHeap MainHeap '销毁堆
  7.     NtTerminateProcess -1, ExitStatus '退出
  8. End Function

  9. Function BootExecMain() As Long
  10.     Dim u As UNICODE_STRING
  11.     RtlAdjustPrivilege SE_TCB_PRIVILEGE, 1, 0, 0 '取得NtDisplayString所需权限
  12.     RtlInitUnicodeString u, StrPtr2("BOOTEXEC")
  13.     NtDisplayStringCRLF u
  14.     RtlInitUnicodeString u, StrPtr2("PID:") '输出自己的PID
  15.     NtDisplayString VarPtr2(u)
  16.     LongToHexString PBI.UniqueProcessId, u
  17.     NtDisplayStringCRLF u
  18.     FreeString u
  19.     RtlInitUnicodeString u, StrPtr2("SMSS PID:") '输出父进程(SMSS)的PID
  20.     NtDisplayString VarPtr2(u)
  21.     LongToHexString PBI.InheritedFromUniqueProcessId, u
  22.     NtDisplayStringCRLF u
  23.     FreeString u
  24.     Sleep 5000 '睡眠5秒
  25. End Function

  26. Sub NtDisplayCRLF() '输出换行符
  27.     Dim u As UNICODE_STRING
  28.     RtlInitUnicodeString u, StrPtr2(vbCrLf)
  29.     NtDisplayString VarPtr2(u)
  30. End Sub

  31. Sub NtDisplayStringCRLF(u As UNICODE_STRING) '带换行的输出
  32.     NtDisplayString VarPtr2(u)
  33.     NtDisplayCRLF
  34. End Sub

  35. Sub AllocString(ByVal SpaceNeeded As Long, u As UNICODE_STRING) '从堆中分配字符串
  36.     u.Buffer = RtlAllocateHeap(MainHeap, 0, SpaceNeeded * 2 + 2)
  37.     u.MaximumLength = SpaceNeeded * 2 + 2
  38.     u.Length = SpaceNeeded * 2
  39. End Sub

  40. Sub FreeString(u As UNICODE_STRING) '释放分配的字符串
  41.     RtlFreeHeap MainHeap, 0, u.Buffer
  42. End Sub

  43. Sub LongToHexString(ByVal l As Long, u As UNICODE_STRING) '一个将数值转换为16进制字符串的东西
  44.     AllocString 8, u
  45.     RtlIntegerToUnicodeString l, 16, u
  46. End Sub

  47. Sub Sleep(ByVal DelayInterval As Long) '睡眠函数,我从KERNEL32.DLL中逆向得到他费了一番周折
  48.     Dim l As LARGE_INTEGER
  49.     l.LowPart = -(DelayInterval * 2710)
  50.     l.HighPart = -1
  51.     NtDelayExecution 0, l
  52. End Sub
复制代码
这是一个可以显示自己PID和SMSS PID的程序,功能不多,但可以看到其复杂程度!!!

3.编译&链接
先用VB编一个可以显示窗体的程序(用“标准EXE”的空工程就可以),编译为LINK.EXE,替换掉VB6的LINK.EXE
现在开始编译我们的程序!
生成EXE,看到生成OBJ文件后弹出了一个窗体,成功断下!立即双击源码中的LINK.BAT,EXE链接出来了!把窗体关掉,这一步就完成了
注:源码中的LINK.EXE是5.X版的汇编链接器
注2:如果不用WINDBG调试的话记得把源码中的IS_RELEASE改为False

4.最后的处理
现在,我们的程序还不能直接拿给SMSS运行,否则你看到的将是一张蓝脸 我们还要把MSVBVM60从导入表中踢出去
打开神器LordPE,把EXE扔进去,点击“目录”,查看导入表,把MSVBVM60删掉。不过先别高兴太早,在“目录”窗口中,
寻找一个叫BoundImport的东西(中文版LordPE叫什么导入,我忘记了),打开,居然还有MSVBVM60的影子?!右键,删不掉,
直接在“目录”窗口把这个东西的RVA和长度zero掉就OK了

5.测试
把EXE复制到SYSTEM32下,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\BootExecute中添加一行,写上EXE的名称,重新启动,看到效果了把?
如果有可能,最好在虚拟机下面运行,再加上WINDBG内核调试

PS:源码下的SDK文件夹是WRK里面一些Native API的声明,有兴趣的看看哈

本文到此就结束了,有不足之处请回帖指出,希望大家多多研究,发掘出更多的功能
源码:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

点评

没必要……搞个签名就过杀软了……  发表于 2012-8-28 18:05
@eaaca1234,不清楚,莫非你要用这个写病毒?:D  发表于 2012-8-26 16:18
这个注册表位置杀软监测吗?  发表于 2012-8-26 12:49
那个要操作驱动,\Device\KeyBoardClass*  发表于 2012-8-13 12:09
有没有API接受用户输入,就像chkdsk那样?  发表于 2012-8-12 23:12

评分

参与人数 1威望 +8 金钱 +20 人气 +5 收起 理由
eaaca1234 + 8 + 20 + 5 膜拜……

查看全部评分

本帖被以下淘专辑推荐:

头像被屏蔽
发表于 2012-8-14 13:54:23 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

发表于 2012-8-14 19:09:43 | 显示全部楼层
好像很牛逼的样子,收藏,有空再拜读。
回复 支持 反对

使用道具 举报

发表于 2012-8-17 19:07:03 | 显示全部楼层
恭喜楼主,你即将穿越了~~~
回复 支持 反对

使用道具 举报

发表于 2012-8-22 18:38:23 | 显示全部楼层
不开心。阅读权限太高。要平易近人呐。

点评

如果是真心求教的我一般会发到邮箱  发表于 2012-8-22 19:09
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2012-8-23 15:22:59 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

发表于 2012-8-24 00:58:47 | 显示全部楼层
这个程序可以常驻么O.O

点评

不可以,因为SMSS会在该程序上无限等待,常驻的话就不能继续启动,除非调用RtlCreateUserProcess创建一个新进程  发表于 2012-8-24 13:13
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2012-8-24 13:01:55 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-24 13:15:28 | 显示全部楼层
小孩不乖 发表于 2012-8-24 13:01
这个可不可以在启动时弹出一个对话框?

不行,这个时候系统还处在“文字模式”(TextMode),GUI的核心WIN32K.SYS尚未加载,如果调用了USER32.DLL或者GDI32.DLL系统就会给你一张蓝屏

点评

这个时候要有界面必须要加载一个驱动…… 还不如搞个boot级驱动方便……  发表于 2012-8-27 12:12
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2012-8-24 13:36:48 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-6-30 17:40

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表