文:RQC
以前才接触一些别人写的远程控制类软件的时候,总感觉很神奇,尤其是那个可以自定义生成一个带密码的木马,现在知道是怎么搞的了!,比如在C#里 如下:
1.先把被控端(木马端)加载到程序资源文件里
2.从服务端文件把被控端分离出来
下来就是如何取到资源文件了,在C#中提供这样一个类:Resources,需要引入PrjServer.Properties 这个命名空间,我们可以根据他取得木马文件,返回结果是一个 byte 数组,有了数组,就知道大小等信息了,剩下的就简单了,利用IO流就可以解决了,所以说这个把这个木马生成出来只需要几行代码就可以解决:
以前感觉难了点,想通了也不过如此。不过这样也只是把原木马原封不动的生成出来,玩过一些盗号木马或者灰鸽子的朋友都知道,在生成的时候,你填入的邮箱和连接密码都会写入生成好的木马中去,如何又把生成器程序里的信息写入到木马程序中去呢?好,接下来看看我的写法:
运行程序:
点击按钮生成了 密码为 “123” 的木马程序 asd.exe
输入密码,确实是123没错。
假如密码输入错误:
流程分析:
在服务端,填入密码,然后点击生成,就会生成一个被控端文件(木马)。再打开被控端文件的时候,需要填入密码,这个密码就是我们在生成器端输入的那个密码。输入正确会提示密码验证成功,否则将提示密码错误。
先来我们如何把控制端的密码写入到木马端的中,而且要在指定的位置。
我在做客户端文件的时候,先把密码规定死,设置20个x
string pwd="xxxxxxxxxxxxxxxxxxxx";
用16进制编辑器(自己下载,或者到www.duote.com搜索16进制编辑器),找到这20个X在什么地方:
位置找到了,是 22F0,我们可以把我们要写的数据写到这个位置,这有20位,可是如果别人只填6位怎么办,剩下的14位咋搞?,没关系,我们可以用 0x00填充(0x00为16进制的 0)
来看看生成器核心代码:
下来看看木马端是如何接收这些数据的。
按理来说,木马端都写好了,我们只需要把输入的密码与pwd比较就可以了。但是做了好几次都失败了,明明打印出来的都一样,可就是提示密码错误。
找找原因。我打印了下pwd的length,发现还是20位,也就是说,我们虽然把剩下的x替换成了0x00,但是位置还在哪里占这呢。所以两个字符创根本不相等。
既然问题知道了,解决的方法也就很多了。我是先定义了一个变量(来存储生成的密码长度),把输入的密码转换成Unicode类型。然后在里面找,如果不等于0x00,就个这个变量加1。这样就可以计算出生成的密码长度,然后截取pwd字符段就OK了。来看看木马端核心代码:
呵呵,这样就做到了这个效果了,爽也,有时间就自己搞个远控玩玩!