[转载]TRW2000插件开发介绍
文章翻译:RuFeng插件是TRW2000的功能扩展。它,TRW2000的内核和其实插件一起为使用者提供各类功能。插件是被TRW2000内核动态连接的,这就意味着它并非是一个内部组件,是可以代替的。
插件很灵活,它可以很简单地开发来实现各种希望的功能。例如写一个显示的驱动程式。换言之,你可以开发特别的调试器而不须要开发驱动程式,反汇编程式,正汇编程式,屏幕界面。。。
对于Cracker来说,这方面的意义就更大了。
-------------------------------------------------
现在来开始着手开发你自己的插件吧!
-------------------------------------------------
如果你要着手开发插件,你必须有以下的开发工具。你要有:
Visual C++(建议采用6.0)
Win98DDK开发包
如你没有这个开发包,不要紧,你可以免费从以下网址下载得到:
[url]http://www.microsoft.com/ddk[/url]
注意:
你要在安装后对I386MK.INC文件进行修改(它位于<98DDK的安装目录下的INC目录里>):
1.找STDFLAGS= /c /Zel /Zp8 /Gy ...,
改/Zp8为/Zp1。
2.找{i386\}.asm{$(_OBJ_DIR)\i386\}.obj:
$(386_ASSEMBLER) -Fo$(MAKEDIR)\$@ $<
删除前面的{i386\}变为:
.asm{$(_OBJ_DIR)\i386\}.obj:
$(386_ASSEMBLER) -Fo$(MAKEDIR)\$@ $<
然后,在Windows的开始菜单里单击"Check"或"Free"环境的图标,这样,我们就可以进行编译程式了。
-------------------------------------------------
编译参考:
-------------------------------------------------
插件的扩展名为.SYS,它实际上是一个WDM驱动程式。
在编译之前,你的代码存放目录下还必须有另外的两个文件:
MAKEFILE和SOURCES(没有扩展名)文件。
MAKEFILE文件如以下所列:
###########################################################
#
# Microsoft Confidential
# Copyright (C) Microsoft Corporation 1995
# All Rights Reserved.
#
# MAKEFILE for WDM device driver kit
#
###########################################################
#
# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
# file to this component. This file merely indirects to the real make file
# that is shared by all the driver components of the Windows NT DDK
#
!INCLUDE $(NTMAKEENV)\makefile.def
SOURCES is following as below :
SOURCES文件如以下所列:
TARGETNAME=xxxx
TARGETTYPE=DRIVER
DRIVERTYPE=WDM
TARGETPATH=.
BLDCRT=1
INCLUDES=$(BASEDIR)\inc
SOURCES=xxxx.CPP( xxxx_2.CPP, xxxx_3.CPP... )
I386_SOURCES=xxxx.ASM( xxxx_2.ASM, xxxx_3.ASM... )
( xxxx 就是你插件的名称 )
如果你已经生成了这些文件,你可以在命令等输入"BUILD"来建立你的
WDM文件了(插件)。
如果你选择"Checked Environment",它会在<SOURCES目录\I386\Checked>下建立一个带有Debug信息的WDM。如果人选择"Free Environment",它会在
<SOURCES目录\I386\Free>下建立一个发行版本的WDM。
编译过程会被记录到BUILD.LOG,错误信息会被记录到BUILD.ERR和警告信息会被记录到BUILD.WRN,它们都位于源程序的同一目前。
你可以运行"BUILD"工具(Win98DDK自带)去编译和连接插件。
但这里有一些奇怪的问题:
BUILD会编译你的CPP文件和创建一个..\I386的目前,但它不会创建 ..\I386\Checked和..\I386\Free两个目录,它会显示一些错误信息和连接失败。最简单的解决方法就是:手动帮它创建这两上目录。
并且,如果你创建一个发行版的WDM,注意:它一样带有调试信息。解决的方法,你一定要这样做:
DUMPBIN /HEADERS xxxx.sys |MORE
记录下OPTIONAL HEADER VALUES的map-base地址,通常都是0x10000。
使用命令" REBASE -B 0x10000 -X .\Symbol xxxx.sys "去删除那调试信息。如果你想得到更多的信息,访问一下相关的网站和新闻组吧。
Art Baker: The Windows NT Device Driver Book: A Guide for
Programmers, 1997, published by Prentics Hall, INC.
当然,最简单直接的方法是复制/粘贴每个例子自带的MK.BAT,SOURCES和MAKEFILE来作为建立你的插件基础。
-------------------------------------------------
插件开发指南
-------------------------------------------------
让我们来开始第一个插件吧。每一个插件都必须定义以下的格式:
//这个文件的扩展名必须是.CPP。
extern "C" {
#include <wdm.h>
}
//它定义WDM。
#include "..\INCLUCE\PLUGS.H"
//它定义数据类型和函数类型。
extern "C" NTSTATUS
DriverEntry(IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath);
VOID
Plugs_Unload(IN PDRIVER_OBJECT DriverObject);
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
DriverObject->DriverUnload = Plug-ins_Unload;
return ntStatus;
}
VOID
Plug-ins_Unload(IN PDRIVER_OBJECT DriverObject)
{
}
//这是WDM的格式,每一个插件都会有这样的代码。
/************ 插件的初始化和退出部分 **************/
PLUGS_API* api = 0;
//这里是TRW2000的API指针。插件呼叫TRW2000的API时,一定要采用下面的方式:
// TRW2000_api->Get_TRW2000_Version ( ) ;
EXC EXPORT BOOL Plugs_Init ( PLUGS_API* plugsapi )
{
TRW2000_api = api;
//添加你的代码。
return TRUE;
//如果返回FALSE,这个插件就不会被加载。
}
EXC EXPORT BOOL Plugs_Exit ( )
{
//增加你的代码。
return TRUE;
//必须返回TRUE。
}
好的,如果你还有疑问,就去看一看插件的例子程式吧!
页:
[1]