返回列表 发帖

[转帖]编程限制老婆玩电脑

    老婆就要考研了,但还是每天对着电脑玩耍个不停,作为学计算机的我怎么能任由这种现象继续呢?所以我决定编一个程序限制她每天玩电脑的时间。在编写这个程序的过程中用到了一些后门常用的技巧,所以写出来与大家分享一下,希望高手们看了别见笑。
程序作用:限制老婆每天使用时间为1个小时,并且有效监控如更改日期之类试图作弊的操作。要开机自启动,还有最重要一点,对我的账户不能加以限制(CS被打断可是很不爽滴)
那就开始编吧,首先考虑实现自动启动功能,本能反应自然是使用系统服务,系统服务就是Windows开机之后自动运行的一系列程序,无论任何用户,是否在安全模式下都会运行,其实编写系统服务,只需要熟练使用如下函数就行了:
StartServiceCtrlDispatcher( DispatchTable)
这个函数是在服务程序Main函数中调用的,想要实现一个系统服务,在最简单的情况下,main函数只需要寥寥几行就能搞定,例如:
int APIENTRY _tWinMain(HINSTANCE Instance, HINSTANCE PrevInstance, LPTSTR pCmdLine,int CmdShow)
{
hInstance=Instance;
hPrevInstance=PrevInstance;
lpCmdLine= pCmdLine;
nCmdShow=CmdShow;
SERVICE_TABLE_ENTRY DispatchTable[] =
{
{ "df", (LPSERVICE_MAIN_FUNCTIONA)MyServiceStart },
{ NULL, NULL }
};
if (!StartServiceCtrlDispatcher( DispatchTable))
{
SvcDebugOut(" [MY_SERVICE] StartServiceCtrlDispatcher error = %d\n", GetLastError());
}
return 0;
}
为什么呢?因为服务进程是系统启动的,系统会等待该进程调用StartServiceCtrlDispatcher( DispatchTable)函数,然后就会自动启动在DispatchTable中注册的服务内容了,这里讲一下DispatchTable,它是一个以SERVICE_TABLE_ENTRY为元素的数组,每个元素包括两项:服务名和服务主函数,最后以{NULL, NULL}表示该表格的结束,Windows会在调用StartServiceCtrlDispatcher( DispatchTable)函数后一次启动每个表项中对应的服务主函数,直到碰到{NULL, NULL}为止。
void MyServiceStart (DWORD argc, LPTSTR *argv)
这个函数是服务进行主要工作的地方,它就是上文提到的服务主函数。服务的所有工作都应该在这个函数中完成,下面是我写的函数:
SERVICE_STATUS MyServiceStatus;
SERVICE_STATUS_HANDLE MyServiceStatusHandle;这是两个全局变量
void MyServiceStart (DWORD argc, LPTSTR *argv)
{
DWORD status;
MyServiceStatusHandle = RegisterServiceCtrlHandler( "df",
(LPHANDLER_FUNCTION)MyServiceCtrlHandler);
这个函数注册该服务的控制函数,这个函数也就是与服务相关的第三个重要函数,它的作用
将在下文具体说明。
if (MyServiceStatusHandle == (SERVICE_STATUS_HANDLE)0) //判断注册是否成功
{
SvcDebugOut("RegisterServiceCtrlHandler failed %d\n", GetLastError());
return;
}
MyServiceStatus.dwServiceType = SERVICE_WIN32;
MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
MyServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;
MyServiceStatus.dwWin32ExitCode = 0;
MyServiceStatus.dwServiceSpecificExitCode = 0;
MyServiceStatus.dwCheckPoint = 0;
MyServiceStatus.dwWaitHint = 0; // 这之前进行一些对该服务状态的设置工作
// 完成初始化工作
if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus))//设置该服务的状态为RUNNING
{
status = GetLastError();
SvcDebugOut(" [MY_SERVICE] SetServiceStatus error %ld\n",status);
}
do_in_main(hInstance,hPrevInstance,lpCmdLine, nCmdShow); //这个函数负责从事服务的主要工作--定时关机
MyServiceStatus.dwWin32ExitCode = 0;
MyServiceStatus.dwCurrentState = SERVICE_STOPPED;
MyServiceStatus.dwCheckPoint = 0;
MyServiceStatus.dwWaitHint = 0;
if (!SetServiceStatus (MyServiceStatusHandle,&MyServiceStatus)) //在退出上函数后,服务的主要工作已经完成
//将服务状态设置为STOPED
{
status = GetLastError();
SvcDebugOut(" [MY_SERVICE] SetServiceStatus error %ld\n",status);
}
return; //退出MyServiceStart函数,该服务结束
}
我们可以这样理解Windows服务开启的过程:Windows开启服务程序,等待服务程序调用StartServiceCtrlDispatcher()函数,并按照该函数参数中描述的启动相关服务函数,并定时检测服务状态(由SetServiceStatus()设置, 在一定时间内如果服务状态还未变成SERVICE_RUNNING,则视为服务启动失败,同样,在服务程序退出后,必须把该服务状态设置为SERVICE_STOPPED,否则也会谈出异常提示对话框的。
最后让我们来介绍第三个,也就是最后一个与服务相关的重要函数
VOID MyServiceCtrlHandler (DWORD Opcode):
这个函数在MyServiceStart中通过RegisterServiceCtrlHandler()注册,它的主要功能就是针对服务的停止,暂停,恢复等事件提供相应的事件处理操作,本文所编写的服务比较简单,故没有太多的处理操作,进行最基本的服务状态更改即可。
VOID MyServiceCtrlHandler (DWORD Opcode)
{
DWORD status;
switch(Opcode)
{
case SERVICE_CONTROL_PAUSE:
//服务暂停
MyServiceStatus.dwCurrentState = SERVICE_PAUSED;
break;
case SERVICE_CONTROL_CONTINUE:
// 暂停的服务恢复
MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
break;
case SERVICE_CONTROL_STOP:
// 服务停止
MyServiceStatus.dwWin32ExitCode = 0;
MyServiceStatus.dwCurrentState = SERVICE_STOPPED;
MyServiceStatus.dwCheckPoint = 0;
MyServiceStatus.dwWaitHint = 0;
if (!SetServiceStatus (MyServiceStatusHandle,&MyServiceStatus))
{
status = GetLastError();
SvcDebugOut(" [MY_SERVICE] SetServiceStatus error %ld\n",status);
}
return;
case SERVICE_CONTROL_INTERROGATE:
// 发送当前状态失败
break;
default:
SvcDebugOut(" [MY_SERVICE] Unrecognized opcode %ld\n", Opcode);
}
// 设置当前服务状态
if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus))
{
status = GetLastError();
SvcDebugOut(" [MY_SERVICE] SetServiceStatus error %ld\n",status);
}
return;
}
//还有最后,把本程序注册为系统服务的方法:
SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);//打开服务管理器
if (schSCManager!=0)
{
SC_HANDLE schService = CreateService
(
schSCManager,
"df",//服务名
"df",//显示的服务名
SERVICE_ALL_ACCESS,//服务类型
SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
SERVICE_AUTO_START,//启动方式
SERVICE_ERROR_NORMAL,//错误处理方式
Path,//服务函数的路径
NULL,
NULL,
NULL,
NULL,
NULL
);
if (schService!=0)//注册成功
{
CloseServiceHandle(schService);
this->MessageBox("Success!");
}
CloseServiceHandle(schSCManager);//关闭服务控制句柄
}
关于服务的部分介绍完了,下面开始介绍另外两个技术那难点:自动关机和获得用户名:
以前在Windews98时代,可以很轻松的使用“rundll32.exe user.exe exitwindows ”来完成关机,但是在XP下这样做是无效的,我是使用如下代码完成关机工作的:
TOKEN_PRIVILEGES TkPriv2;
unsigned long ulLen;
handle = GetCurrentProcess();//获得当前进程句柄
OpenProcessToken(handle,40,&handle);
memset(&Luid,0x00,sizeof(Luid));
LookupPrivilegeValue(pszSysName,pszName,&Luid);
memset(&TkPriv,0x00,sizeof(TkPriv));
TkPriv.PrivilegeCount = 1;
TkPriv.Privileges[0].Luid = Luid;
TkPriv.Privileges[0].Attributes = 2;
memset(&TkPriv2,0x00,sizeof(TkPriv2));
AdjustTokenPrivileges(handle,FALSE,&TkPriv,16,&TkPriv2,&ulLen);
//调整当前进程权限
ExitWindowsEx (EWX_POWEROFF,0);//关机
至于获得当前用户名,也许你会觉得没有什么技术含量,不就是GetCurrentUser()么?一开始我也是这么想的,但是后来发现,因为该进程是系统服务开启的,所以返回的用户名为“SYSTEM”,这可怎么办呢,难道让我也一起忍受这限制时间的痛苦?经过在MSDN上千辛万苦的查找,终于找到了一个解决办法,还是来看代码吧。
char Name[10]="";//保存返回的用户名
char *LogName = NULL;//参数,注意,调用的时候传递的是一个二级指针
DWORD Size = 0;
if (WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE,
WTS_CURRENT_SESSION,WTSUserName,&LogName,&Size))
{
strcpy(Name,LogName);
this->MessageBox(strName);
WTSFreeMemory(LogName);//释放LogName所指的空间
}
最后,Name中返回的就是当前登录的用户名。如果还未登录,返回值为空字符串。
剩下的就是编写服务函数了:读取系统时间,读写注册表,提醒,关机。没什么可写的了。
文章写完了,本来高高兴兴的,谁知那个小妮子告诉我,她已经在进程管理其中找到相关进程了,现在开机先结束该进程,每天照玩不误!!岂有此理,还治不了她了?!

[转帖]编程限制老婆玩电脑

.........

TOP

[转帖]编程限制老婆玩电脑


文章写完了,本来高高兴兴的,谁知那个小妮子告诉我,她已经在进程管理其中找到相关进程了,现在开机先结束该进程,每天照玩不误!!岂有此理,还治不了她了?!
哎,,,
注入进程。
实在不行,
写驱动,进内核。。。

TOP

[转帖]编程限制老婆玩电脑

从任务管理器中删除自身进程实在是太容易了。目前我已经掌握两种方法。
一种是在网上学的,另一种是原创。

TOP

[转帖]编程限制老婆玩电脑

...
楼上大牛淫!!!!

TOP

[转帖]编程限制老婆玩电脑

厉害啊,把老婆管得很严啊,哈哈!

TOP

返回列表 回复 发帖