目 录
摘 要 I
Abstract II
1.绪论 1
1.1课题背景 1
1.2系统开发的目的和意义 2
1.3国内外概况 3
1.4研究主要内容 3
2.windows文件监控管理系统相关技术介绍 4
2.1 API 4
2.2 API HOOK 5
2.3 Java 5
2.4 DLL 6
2.4 Windows系统的Socket编程 6
2.4.1使用WinSock API 6
2.4.2 使用数据报套接字 7
2.4.3 使用流式套接字 7
2.5windows的消息系统 9
2.5.1 消息的种类 9
2.5.2 MFC中的消息处理 9
2.5.3 用ClassWizard进行消息处理 10
2.5.4 创建消息映射 11
3.windows文件监控管理系统总体分析 13
3.1系统的可行性研究 13
3.2系统需求分析 14
3.3系统数据流图 14
4.windows文件监控管理系统总体设计 15
4.1功能模块分析 15
4.2显示模块 17
4.3注射模块 17
4.4 APIHOOK模块 19
4.5选项模块 20
4.6文件读写监控模块 20
4.7文件加密 22
5.windows文件监控管理系统运行及测试结果 24
5.1 测试方法 24
5.2 测试环境 24
5 3 系统运行实例 24
5.3.1 连续获得被监控端机器屏幕变化功能 25
5.3.2 实现被监控端硬盘文件 25
结 论 26
参考文献 27
致 谢 28
1.4研究主要内容
本软件就是基于此而设计开发的,能实现以下的基本的功能:
1),查看被监控端的文件目录清单;
2),查看被监控端的文件内容;
3),拷贝被监控端的文件到监控端;
4),强迫被监控端重新启动或关机;
5),修改被监控端的系统配置文件;
6),执行任何可执行命令,打开应用程序;
7),锁住(解锁)被监控端的,键盘和鼠标;
8),监控被监控端的,在本地操作被监控端windows文件;
9),隐藏共享被监控端的硬盘;
10),同时可以做到被控端的服务器自动运行及隐藏等功能;
2.windows文件监控管理系统相关技术介绍
本程序作为一个工具软件,出于学习研究一些热门技术,以及利用这些技术能到达一个什么效果。用到Java开发语言,用到API,API HOOK,API拦截,DLL挂接等,这些技术在很多杀毒软件等中运用的很多。
2.1 API
(1)API定义
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组编程的能力,而又无需访问源码,或理解内部工作机制的细节。API函数包含在Windows系统目录下的动态链接库文件中。
(2)Windows API
Windows API是一套用来控制Windows的各个部件的外观和行为的一套预先定义的Windows函数。用户的每个动作都会引发一个或几个函数的运行以告诉Windows发生了什么。
更易理解地说:Windows 这个多作业系统除了协调应用程序的执行、分配内存、管理系统资源之外,它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程式达到开启视窗、描绘图形、使用周边设备等目的,由于这些函数服务的对象是应用程序, 所以便称之为Application Programming Interface,简称API 函数。凡是在 Windows 工作环境底下执行的应用程式,都可以调用Windows API。
(3)API 分为四种类型
远程过程调用(RPC):通过作用在共享数据缓存器上的过程(或任务),实现程序间的通信。
标准查询语言(SQL):是标准的访问数据的查询语言,通过通用数据库实现应用程序间的数据共享。
文件传输:文件传输通过发送格式化文件实现应用程序间数据共享。
信息交付:指松耦合或紧耦合应用程序间的小型格式化信息,通过程序间的直接通信实现数据共享。
2.2 API HOOK
在Windows系统下编程,应该会接触到API函数的使用,常用的API函数大概有2000个左右。随着控件,stl等高效编程技术的出现,API的使用概率在普通的用户程序上就变得越来越小了。当诸如控件这些现成的手段不能实现的功能时,我们还需要借助API。最初有些人对某些API函数的功能不太满意,就产生了如何修改这些API,使之更好的服务于程序的想法,这样API HOOK就自然而然的出现了。
通过API HOOK,改变一个系统API的原有功能。基本的方法就是通过HOOK“接触”到需要修改的API函数入口点,改变它的地址指向新的自定义的函数。API HOOK并不属于MSDN上介绍的13类HOOK中的任何一种。所以说,API HOOK并不是什么特别不同的HOOK,它也需要通过基本的HOOK提高自己的权限,跨越不同进程间访问的限制,达到修改API函数地址的目的。对于自身进程空间下使用到的API函数地址的修改,是不需要用到API HOOK技术就可以实现的。
2.3 Java
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。
Java看起来设计得很像C++,但是为了使语言小和容易熟悉,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的。例如,Java不支持go to语句,代之以提供break和continue语句以及异常处理。Java还剔除了C++的操作符过载(overload)和多继承特征,并且不使用主文件,免去了预处理程序。因为Java没有结构,数组和串都是对象,所以不需要指针。Java能够自动处理对象的引用和间接引用,实现自动的无用单元收集,使用户不必为存储管理问题烦恼,能更多的时间和精力花在研发上。
import org.eclipse.swt.internal.Callback;
import org.eclipse.swt.internal.win32.OS;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
/*
*/
/**
* @author cnfree
*/
public class JavaHook {
static final int WH_MOUSE = 7; //mouse hook constant
static final int WH_MOUSE_LL = 14; //mouse hook constant
static final int WM_LBUTTONDOWN = 0x201;
static final int WM_RBUTTONDOWN = 0x204;
static final int WM_MBUTTONDOWN = 0x207;
static int hMouseHook = 0; //Declare mouse hook handle as int.
public static void main(String[] args) {
JavaHook hook = new JavaHook();
Display display = new Display();
Shell shell = new Shell(display);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
public JavaHook() {
Callback callback = new Callback(JavaHook.class,
"MouseHookProc", 3);
int address = callback.getAddress();
int threadId = OS.GetCurrentThreadId();
OS.SetWindowsHookEx(WH_MOUSE, address, 0,threadId);//线程钩子,只能在Shell内部使用。
//下面系统钩子,不起作用,不知道为什么。相同的代码在.net下没有问题。
//OS.SetWindowsHookEx(WH_MOUSE_LL, address, 0,0);
//以下采用自己调用Win32API的系统钩子,仍然不起作用。
/*
TCHAR lpLibFileName = new TCHAR(0, "user32.dll", true);
int hInst = OS.LoadLibrary(lpLibFileName);
if (hInst != 0) {
String name = "SetWindowsHookExA";
byte[] lpProcName = new byte[name.length()];
for (int i = 0; i < lpProcName.length; i++) {
lpProcName[i] = (byte) name.charAtLight Bulb;
}
int setWindowsHookExA = OS.GetProcAddress(hInst, lpProcName);
if (setWindowsHookExA != 0) {
final int hHook = OS.CallWindowProc(setWindowsHookExA, WH_MOUSE_LL, address, 0,
0);
}
OS.FreeLibrary(hInst);
}
*/
}
static int MouseHookProc(int nCode, int wParam, int lParam) {
if ((nCode >= 0)) {
switch (wParam) {
case WM_LBUTTONDOWN:
System.err.println("MouseButtons.Left");
break;
case WM_RBUTTONDOWN:
System.err.println("MouseButtons.Right");
break;
case WM_MBUTTONDOWN:
System.err.println("MouseButtons.Middle");
break;
}
}
return OS.CallNextHookEx(hMouseHook, nCode, wParam, lParam);
}
}