根据用户配置生成EXE 南京 阿珊境界 (此文在<黑客防线>2006年第6期上发表,标题为<自做木马服务端>)广外幽灵、冰河等软件都有一个实用的功能,根据用户配置生成相应的EXE文件(如设置IP、端口等)。这种EXE被称为木马服务端。它是用什么原理生成的呢?用WinHEX等软件打开这类EXE,会发现用户配置都存放在EXE的尾部。服务端EXE在运行时只要读取自身尾部的数据就可以了。那么服务端EXE本身从何而来呢?当然是预先编译好的,放在主体软件的资源中,需要时进行释放就可以了。 好,知道了原理现在就动手做一个小程序试试。首先要做的是服务端模板,让其运行后读取自身尾部的数据。 打开VB6,新建一个工程t.vbp。因为定位指针到文件末尾需要知道编译后的模板文件t.exe的大小,而写代码时t.exe又尚未生成,所以在代码中可以先用未定义常量FILE_SIZE来代指文件大小,最后编译成t.exe后再将文件大小定义给FILE_SIZE。代码如下: Const FILE_SIZE = 20480 '这是编译后文件模板的大小 Private Sub Form_Load() Dim bAppend As Byte, lNum As Long Dim i As Long, sInfo As String Open App.Path & "/" & App.EXEName & ".exe" For Binary Access Read As #1 Seek #1, FILE_SIZE + 1 '将读取指针定位到文件末 '读出超出模板大小的字节部分并显示 For lNum = 1 To FileLen(App.Path & "/" & App.EXEName & ".exe") - FILE_SIZE Get #1, , bAppend sInfo = sInfo + Chr(bAppend) Next lNum Close #1 MsgBox sInfo End Sub 下面再来做主体文件,让用户在其中进行配置服务端。另外新建一个工程config.vbp,添加服务端模板文件t.exe为CUSTOM类资源,资源号为101。如果您的VB没有资源编辑器,请从“外接程序/外接程序管理器”中进行添加,以后就可以从工具菜单下运行资源编辑器了。 界面上设置一个标签,一个文本框和一个按钮,如图所示。 我们要做到的是,用户配置后点击按钮,程序释放t.exe并将配置信息追加到t.exe的末尾。本工程的代码如下: Const FILE_SIZE = 20480 '这是101号资源中的服务端文件1.exe的大小 Private Sub Command1_Click() Dim bInfo As Byte Dim bFile() As Byte Dim iInfoLen As Integer Dim i As Integer, lFile As Long iInfoLen = Len(txtInfo.Text) If txtInfo.Text = "" Then MsgBox "请配置弹出消息!", vbCritical Exit Sub End If '引入文件对话框部件,并命名为cdLocation cdLocation.Filter = "可执行文件(*.exe)|*.exe" cdLocation.ShowSave If cdLocation.FileName = "" Then Exit Sub On Error GoTo myErr: bFile = LoadResData(101, "CUSTOM") '读出101号资源 Open cdLocation.FileName For Binary Access Write As #1 For lFile = 0 To FILE_SIZE - 1 Put #1, , bFile(lFile) Next lFile For i = 1 To iInfoLen '读出配置信息并追加 bInfo = Asc(Mid(txtInfo.Text, i, 1)) Put #1, , bInfo Next i Close #1 Exit Sub myErr: Reset '如果有文件未关闭,则关闭之 MsgBox Err.Description & " 配置信息请用半角字符." 选择菜单“文件/生成config.exe”,执行编译后的config.exe,在配置框中输入“hello!”,点击“生成EXE”按钮,选择保存位置及文件名,假设为ok.exe。执行ok.exe,效果如下图所示。 配置信息不支持中文等全角字符,这个问题涉及到汉字为双字节字符,要判断取出的字节的ASCII码是否小于128。如果是,则说明其是字母,直接Chr()后输出;如果不是,则说明其是双字节汉字中的一个字节,则继续读取下一 文中两个工程在VB6+WIN2000中调试通过。 在本文搁笔发表之后,我把文章贴到博客和论坛里,网友帅哥阳伞给出了汉字配置信息的解决方案,现在我把它整理到下面: T.EXE代码 Const FILE_SIZE = 20480 '这是编译后文件模板的大小 Private Sub Form_Load() Dim bAppend As Byte, lNum As Long Dim i As Long, sInfo As String Dim s(1) As String Open App.Path & "/" & App.EXEName & ".exe" For Binary Access Read As #1 Seek #1, FILE_SIZE + 1 '将读取指针定位到文件末 '读出超出模板大小的字节部分并显示 For lNum = 1 To FileLen(App.Path & "/" & App.EXEName & ".exe") - FILE_SIZE Get #1, , bAppend 'MsgBox bAppend If bAppend < 128 Then '判断是否是英文字符 sInfo = sInfo + Chr(bAppend) Else '如果不是则继续获取下一个字节 If s(0) = "" Then 'MsgBox "1" & Hex((bAppend)) & "1" s(0) = CStr(Hex((bAppend))) ElseIf s(1) = "" Then 'MsgBox "2" & Hex((bAppend)) & "2" s(1) = CStr(Hex((bAppend))) End If If s(0) <> "" And s(1) <> "" Then sInfo = sInfo + Chr(Val("&H" & s(0) & s(1))) '将中文汉字输出 'MsgBox "3" & Chr(Val("&H" & s(0) & s(1))) & "3" s(0) = "" s(1) = "" End If End If Next lNum Close #1 MsgBox sInfo End Sub *********************************************************************** config.exe程序代码 Const FILE_SIZE = 20480 '这是101号资源中的服务端文件1.exe的大小 Private Sub Command1_Click() Dim bInfo As Byte Dim bFile() As Byte Dim iInfoLen As Integer Dim i As Integer, lFile As Long iInfoLen = Len(txtInfo.Text) If txtInfo.Text = "" Then MsgBox "请配置弹出消息!", vbCritical Exit Sub End If '引入文件对话框部件,并命名为cdLocation cdLocation.Filter = "可执行文件(*.exe)|*.exe" cdLocation.ShowSave If cdLocation.FileName = "" Then Exit Sub On Error GoTo myErr: bFile = LoadResData(101, "CUSTOM") '读出101号资源 Open cdLocation.FileName For Binary Access Write As #1 For lFile = 0 To FILE_SIZE - 1 Put #1, , bFile(lFile) Next lFile For i = 1 To iInfoLen '读出配置信息并追加 str1 = Mid(txtInfo.Text, i, 1) If Asc(str1) >= 0 Then '非中文 bInfo = Asc(str1) Put #1, , bInfo Else '中文 bInfo = HiByte(Asc(str1)) '先高位 Put #1, , bInfo bInfo = LowByte(Asc(str1)) '再低位 Put #1, , bInfo End If Next i Close #1 Exit Sub myErr: Reset '如果有文件未关闭,则关闭之 MsgBox Err.Description End Sub '获取高位 Public Function HiByte(a As Integer) Dim b As Integer b = a And &HFF00 b = b / 256 If b < 0 Then b = b + 256 HiByte = b End Function '获取低位 Public Function LowByte(a As Integer) Dim b As Integer b = a And &HFF LowByte = b End Function 如有不明白或不赞同的地方,欢迎加入我们的vb讨论群:12960265 |