关闭

根据用户配置生成EXE

1650人阅读 评论(0) 收藏 举报

                             根据用户配置生成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没有资源编辑器,请从“外接程序/外接程序管理器”中进行添加,以后就可以从工具菜单下运行资源编辑器了。
界面上设置一个标签,一个文本框和一个按钮,如图所示。

 http://www.asanscape.com/configimg/config.jpg
我们要做到的是,用户配置后点击按钮,程序释放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,效果如下图所示。
 http://www.asanscape.com/configimg/t.jpg

  配置信息不支持中文等全角字符,这个问题涉及到汉字为双字节字符,要判断取出的字节的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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:166609次
    • 积分:1643
    • 等级:
    • 排名:千里之外
    • 原创:45篇
    • 转载:4篇
    • 译文:0篇
    • 评论:53条
    最新评论