危险漫步博客
新鲜的“黑客思维”就是从全新的角度看待黑客技术,从更高的层面去思考;专注于黑客精神及技术交流分享的独立博客。
文章2306 浏览20580905

DIY自己的粘滞键后门+替换程序

最近在“复习”一些知识的时候,看到了危险漫步的一篇逆向工程打造粘滞键后门的文章,感觉通过net命令添加用户不太安全(一闪而过的黑窗口容易被人发现),同时看过一篇“有后门DIY看windows登陆缺陷”,偶用批处理写了一个sethc.exe的替换程序(这更加的不安全),考虑到互联网上目前还有大量的win服务器,于是准备打造一个自己的粘滞键后门,后门程序用汇编编写(主要考虑汇编写的程序比较小,方便以后扩展其它功能),对于粘滞键后门来说,它只是相当于一个“炮弹”,关键问题是如何将它发射出去——替换系统中正常的sethc.exe,所以还要编写一个专门用于关闭WFP(文件保护机制)的替换程序。废话不多说,接下来开始DIY之旅。

一、伪造对话框

正常的sethc.exe需要按6次shift键才可以呼出,它实际上有静态文本、三个按钮和一个对话框组成,对话框调用DialogBoxParam()建立即可,该函数需要一个对话框的资源模本文件,下面是具体的资源文件代码:

需要注意“设置”按钮,S下面有个下划线,资源文件中通过字符“S”前面加“&”符号实现。如果对资源文件的编写规则不太了解,可以使用可视化资源编辑器来完成。

二、字符串加密处理

出于免杀与数据保护的目的,对程序中所用到的字符串全部进行xor异或加密,首先通过一起打包的xor.exe对字符串进行加密,这里以添加asmnop$密码abc123!@#abc为例,在使用xor.exe时注意进行异或的基数在0-255之间,这里与9异或为例,在cmd中执行:xor asmnop$9。如果异或后没有0字符或者异或后的数值都大于0x20(可打印ASCII)程序会作出相应的提示,如果看不到的提示,则在定义字符串时需要注意0字符和不可打印字符。

有了加密的数据,程序在运行时就需要解密,先定义一个解码字符串的函数:

DecodeString是函数名,uses ebx esi edi ebp是让编译器在编译时生成类似于push ebx、push esi的入栈指令(为了保护运行环境),该函数有三个参数szAddr,是一个DWORD类型的变量,表示加密字符串的起始地址,szLen也是一个DWORD类型的变量,表示加密字符串的长度,vValue是刚才进行异或加密时的基数,是一个BYTE类型的变量。

程序首先用CLD将DF标志位清0,以让后面的esi地址每次执行lodsb指令时递增(地址增加),然后用esi保存字符串的地址,用ecx保存字符串的长度,接下来是一个循环,当ECX为0时循环结束。需要注意mov byte ptr ds:[esi-l],al,因为每次执行lodsb指令后,esi都会自动+1,在xor解码后,需要将解密后的数据保存到原来的存储空间中,所以需要再将esi-1。

三、“设置”按钮的处理

“设置”键是粘滞键中一个比较特殊的按钮。因为在登陆Wuidows之前(CTL+ALT+DEL输入用户名和密码之前)它是不可用的,当登陆Windows之后它是可用的。所以在编写资源时,默认将其设置为WS_DISABLED(不可用)。首先我们需要让程序在显示对话框时判断是登陆前还是登陆后,方法很简单,通过判断当前进程中是否有外壳进程——“explorer.exe”。

在显示对话框时,对话框过程函数会先处理WM_INITDIALOG消息,以初始化对话框,因此判断的代码应该写在该消息分支下。

首先通过CreateToolhelp32Snapshot()函数得到当前进程快照句柄,然后通过Process32First()和Process32Next()枚举系统进程,如果发现explorer.exe进程名,则表示已登陆进系统,即通过EnableWindow()将“设置”按钮设置为“可用”状态。

当用户单击“设置”按钮时,实际上是运行的“控制面板”中的“辅助功能选项”,它对应于access.cpl,在“开始”——“运行”中输入access.cpl可以直接打开它,当“辅助功能选项”运行后,你会发现“任务管理器”中多出来一个rund1132.exe的进程,即access.cpl是有rund1132.exe执行的,具体的命令格式为:“rundlB2.exe she1132.dll,Control_RunDLL access.cpl”。

当用户按下“设置”按钮时,会发送WM_COMMAND消息,该消息的低16即为命令ID,只要判断为ID_YES(资源文件中定义为设置按钮)则运行access.cpl即可。代码如下:

运行access.cpl通过调用ShellExecuteEx()实现,该函数只有一个参数,它指向一个SHELLEXECUTEINFO的结构,该结构中的lpVerb成员指向要进行的操作,这里要“运行程序”所以是”open”,lpFile是要执行的程序,即C:\windows\system32\rund1132.dll,通过ExpandEnvironmentStrings()导出环境变量的方式得到其具体路径,IpParaments指向了程序运行的参数,即shell32.dll,Control_RunDLL access.cpl。

到这里,粘滞键后门算上有了“皮囊”,接下来就是注册热键,添加用户了,给其加上“魂魄”。

四、注册热键添加用户

首先在WM_INITDIALG消息分支下注册一个热键ALT+F1,当在程序中使用该热键时,实际上发送的是WM_HOTKEY消息,所以在该消息分支下添加上增加管理埙用户的代码,添加用户靠的是netap132.dll中的NetUserAdd()和NetLocalGroupAddMembers(),在做测试的时候,发现有些杀软会定位这两个函数并提示为“sethc.backdoor”,为了防止被杀,这里使用动态加载的方法,即先用LoadLibrary()加载netapi32.dll,然后通过GetProcAddress()得到函数地址,这样在PE文件的导入表中就不会发现这两个函数了,同时GetProcAddress()的第二个参数是函数的名字,所以还需要将NetUserAdd和NetLocalGroupAddMembers这两个函数的函数进行异或加密保存。

到这里“轻型”粘滞键后门就算打造完成了,编译运行后与Win下的粘滞键对比。放到肉鸡上ALT+F1测试是否能添加用户。接下来就是编写一个替换程序,用于替换系统中正常的粘滞键程序。

五、编写替换程序

编程中突破WFP保护机制的方法比较多,这里使用了sfc_os.dll中5号函数来关闭WFP文件保护机制。具体的代码如下,下面程序中使用的字符串与上面打造后门程序时使用的方法相同——与一个基数进行异或加密,加密的字符串主要是sethc.exe和sfc_os.dll。本例中与基数123进行异或。sfc_os.dll中的5号函数的原型如下:

程序很简单,通过LoadLibrary()动态加载sfc_os.dll,然后得到5号函数的地址,通过它将系统目录中的sethc.exe的文件保护关闭,接下来通过GetCurrentDirectory()得到当前程序的目录,最后将当前目录中的sethc.exe复制到系统目录,需要注意使用该程序时,保证粘滞键后门在同一目录下,且名字为sethc.exe。

到这里,我们的粘滞键后门终于完工了。好了,文章就到这里。

相关推荐