2: 导出的函数
本章节将介绍每一个函数或变量是什么,还将告诉你怎么用它们。
2.1: sizeofExportedFunctions
它保存着结构体的长度,用它可以校验这个长度是否为你理想的长度。
2.2: ShowMessage
一个指向 CE 的 ShowMessage 函数的指针。这个函数将会在屏幕显示出仅仅带有文本和OK按钮。只有当被主线程调用时运行。
函数定义:
void showmessage(char* message);
message 指向一个以0结尾的字符串
无返回值
2.3: RegisterFunction
一个指向 CE 的 RegisterFunction 函数的指针。这个函数功能将注册一个当某一事件发生、在某些情况下还带来额外的菜单项目的回调函数。
函数定义:
int RegisterFunction(int pluginid, int functiontype, PVOID init);
pluginid 从 InitializePlugin 得到的插件ID
functiontype 你想注册的函数类型定义
init 保存一个依赖于函数类型的结构体的指针
函数类型:
0: 关于这个插件类型,右键单击地址列表时产生一个新的插件项目。
当用户点击这个菜单项目,如果某个地址被选中,你的回调程序将会得到一些关于这个选录的信息,会给你能力去改变这个地址,还有说明。
回调定义:
typedef BOOL (__stdcall *CEP_PLUGINTYPE0)(struct PLUGINTYPE0_RECORD *SelectedRecord);
如果你编辑了这个地址的说明将返回 TRUE
PLIGINTYPE0_RECORD 的定义:
struct PLUGINTYPE0_RECORD
{
char *interpretedaddress; //指向一个 255 字节长的字符串 (以 0 结尾)
ULONG address;//它是一个只读的代表性地址。如果你想改变它,请改变 interpretedaddress 。
BOOL ispointer; //只读
int countoffsets; //只读
ULONG *offsets; //陈列一些范围从0到偏移量-1的信息 (只读)
char *description; //指向一个 255 字节长的字符串
char valuetype; //0=byte, 1=word, 2=dword, 3=float, 4=double, 5=bit, 6=int64, 7=string
char size; //stringlength 或 bitlength;
};
必需初始化这个结构体指针,你才能通过:
struct PLUGINTYPE0_INIT
{
char* name; //用来描述用户菜单项目名字的以 0 结尾的字符串
CEP_PLUGINTYPE0 callbackroutine; //指向 0 类型插件的回调程序
};
1: 关于这个类型,在内存查看器窗口顶部创建新的插件菜单。
当用户点击这个菜单项目时,你的回调程序将会得到这个反汇编窗口地址的指针,这个地址是当前在反汇编被选中的那行,在底部会有这个地址的 16 进制查看。 你可以改变它指向任何你喜欢的地址。
回调函数:
typedef BOOL (__stdcall *CEP_PLUGINTYPE1)(ULONG *disassembleraddress, ULONG *selected_disassembler_address, ULONG *hexviewaddress);
如果你改变了任何一个指针,返回 TRUE,内存查看器还将会执行更新。
必需初始化这个结构体指针,你才能通过:
struct PLUGINTYPE1_INIT
{
char* name; //用来描述用户菜单项目名字的以 0 结尾的字符串
CEP_PLUGINTYPE1 callbackroutine; //指向 1 类型插件的回调程序
};
2: 关于这个插件类型,每当一个调试结果发生在默认的窗口调试器,你将会得到一个通告。你的回调程序将会在 DebugEvent结构体 的 WaitForDebugEvent 返回为 TRUE 之后调用
callback definition:
typedef int (__stdcall *CEP_PLUGINTYPE2)(LPDEBUG_EVENT DebugEvent);
如果你想让 CE 和其它插件也同样处理这个结果,返回 0
如果你不想任何东西去处理它,返回 1. 你将必需调用 ContinueDebugEvent
必需初始化这个结构体指针,你才能通过:
struct PLUGINTYPE2_INIT
{
CEP_PLUGINTYPE2 callbackroutine; //指向 2 类型插件的回调程序
};
3: 关于这个插件类型,当内存监视被使用,和它察觉到了一个进程被创建时,你会得到通告。你的回调程序会得到这个进程的ID,和 PEProcess 地址。
回调定义:
typedef void (__stdcall *CEP_PLUGINTYPE3)(ULONG processid, ULONG peprocess);
无返回值
必需初始化这个结构体指针,你才能通过:
struct PLUGINTYPE3_INIT
{
CEP_PLUGINTYPE3 callbackroutine; //指向 3 类型插件的回调程序
};
4: 关于这个插件类型,当一个或多个指针被用户的操作所改变时,你将会得到通告。(不包括其它插件改变指针) 如果你想挂上一个 api 的话,这是有利的情况。
回调定义:
typedef void (__stdcall *CEP_PLUGINTYPE4)(int reserved);
reserved: 包含变动的部分,不是有用的...
必需初始化这个结构体指针,你才能通过:
struct PLUGINTYPE4_INIT
{
CEP_PLUGINTYPE4 callbackroutine; //指向 4 类型插件的回调程序
};
结果:
成功时,它就会返回一个当卸载一个回调时你需要的函数 ID 。
如果由于一些问题导致失败,,那和么这个结果将会是 -1 。
2.4: UnregisterFunction
一个指向 CE 的 UnregisterFunction 的函数. 这个函数将移除一个先前注册过的回调函数
函数定义:
BOOL UnregisterFunction(int pluginid, int functionid);
pluginid: 从 InitializePlugin 中得到的插件 ID
functionid: RegisterFunction 的结果
如果这个函数被找到,并将它从插件中移除,那么返回 TRUE 。
2.5: OpenedProcessID
指向一个已成功打开进程的进程 ID 。
仅仅是进程 ID , 不如用 ID 和 HANDLE 指向同一个进程
2.6: OpenedProcessHandle
指向一个已成功打开进程的进程 句柄 。
这个句柄在许多函数中用到. 注意使它正确, 或者至少在用到它的函数中使它有效。
2.7: GetMainWindowHandle
一个指向 CE 的 UnregisterFunction 函数指针. 这个函数将移除一个先前注册过的回调函数
函数定义:
HANDLE GetMainWindowHandle();
返回一个主窗口的窗口句柄. 被一些基窗口操作. 更多的被高级窗口操作。如果你取得了主窗口的 TFORM 对象,推荐你在 Delphi 7 企业版中编写这个 Dll 。
2.8: AutoAssemble
指向 CE 的 AutoAssemble 函数。这个函数允许你给予一段自动汇编,它将会注入到当前选中的进程。
函数定义:
BOOL AutoAssemble(char *script);
script: 指向一个以 0 结尾的包含自动汇编脚本字符串缓冲。
如果汇编和注入成功,返回 TRUE
2.9: Assembler
指向 CE 的 Assembler 函数。这个函数会允许给予可以放入地址的单一的指令,它会返回你在缓冲中产生的字节,你指定的和它产生的字节。
函数定义:
BOOL Assembler(ULONG address, char* instruction, BYTE *output, int maxlength, int *returnedsize);
address: 地址说明应该被写入。 在有利的情况下 跳转、调用...
instruction: 指向包含你想汇编的汇编指命的字符串,以 0 结尾
output: 指向将要放入缓存的汇编字节
maxlength: 从汇编字节中接收的缓存的最大长度
returnedsize: 指向一个得到使用的字节数的整数
如果这个命令有效,并且有足够的空间那么返回 TRUE。不会返回为什么失败,所以推荐你至少给它 32 个字节空间。
2.10: Disassembler
指向 CE 的 Disassembler 函数. 这个函数允许你给它一个地址,并给你返回一个反汇编的输出。
函数定义:
BOOL Disassembler(ULONG address, char* output, int maxsize);
address: 你想要反汇编的指令的地址
output: 指向将要放入汇编语句的缓存
maxsize: 允许的语句的最大长度
如果有足够的内存去存贮这个语句,那么返回 TRUE
返回的字符串是像"地址 - 字节 - 指令"一样的组合
2.11: ChangeRegistersAtAddress
指向 CE 的 ChangeRegistersAtAddress 函数. 这个函数是在您想要指定和自己更换注册的地方设下断点。
函数定义:
BOOL ChangeRegistersAtAddress(ULONG address,struct REGISTERMODIFICATIONINFO *changereg);
address: 您想下断点的指令的地址
changereg: 指向一个你想保存所有变动的结构体
REGISTERMODIFICATIONINFO 结构体的定义:
struct REGISTERMODIFICATIONINFO
{
ULONG address; //断点地址
BOOL change_eax;
BOOL change_ebx;
BOOL change_ecx;
BOOL change_edx;
BOOL change_esi;
BOOL change_edi;
BOOL change_ebp;
BOOL change_esp;
BOOL change_eip;
BOOL change_cf;
BOOL change_pf;
BOOL change_af;
BOOL change_zf;
BOOL change_sf;
BOOL change_of;
ULONG new_eax;
ULONG new_ebx;
ULONG new_ecx;
ULONG new_edx;
ULONG new_esi;
ULONG new_edi;
ULONG new_ebp;
ULONG new_esp;
ULONG new_eip;
BOOL new_cf;
BOOL new_pf;
BOOL new_af;
BOOL new_zf;
BOOL new_sf;
BOOL new_of;
};
如果和计划的一样,那么返回 TRUE
2.12: InjectDLL
指向 CE 的 InjectDLL 函数。 这个函数会允许你使用 CE 的注入引擎去注入一个 dll 。
定义:
BOOL InjectDLL(char *dllname, char *functiontocall);
dllname: 注入 dll 的名字
functiontocall: 注入后调用的函数的名字。如果你不想要它,可以设空
如果注入成功,将返回 TRUE
2.13: FreezeMem
指向 CE 的 FreezeMem 函数。 这个函数将冻结这个选中地址的内存
函数定义:
int FreezeMem(ULONG address, int size);
address: 冻结的地址
size: 冻结地址的长度
返回一个你冻结程序的 ID ,随后你可以用它来解冻这个程序
警告: 如果这个进程变为冻结,仍然是活跃的。当一个进程被选中时,在这种情况下推荐去挂钩 OpenProcess 和监视变动还有解动
2.14: UnfreezeMem
指向 CE 的 UnfreezeMem 函数。 这个函数将停止一个早期冻结操作。
函数定义:
int UnfreezeMem(int freezeID);
freezeID: FreezeMem 指令的返回 ID
如果 ID 存在,并且解冻。那么返回 TRUE
2.15: FixMem
指向 CE 的 FixMem 函数。这个函数将在内存里扫描 C 自身的变化,并可能整理它们。
函数定义:
BOOL FixMem();
如果它没有崩溃,则返回 TRUE
2.16: ProcessList
指向 CE 的 ProcessList 函数. 它个函数将返回一个进程列表在你提供的缓存当中
函数定义:
BOOL ProcessList(char *listbuffer, int listsize);
listbuffer: 指向一个接收地址列表的缓存
listsize: 缓存长度
如果有足够的空间存放这个列表,则返回 TRUE
2.17: ReloadSettings
指向 CE 的 ReloadSettings 函数. 这个函数将为 CE 的刷新注册和申请设置
函数定义:
BOOL ReloadSettings();
返回 TRUE
2.18: GetAddressFromPointer
指向 CE 的 GetAddressFromPointer 函数. 这个函数将 基址+偏移量转换为最终地址
函数定义:
DWORD GetAddressFromPointer(ULONG baseaddress, int offsetcount, int* offsets);
返回指针指向的地址. 如果部分指针路径是难以辨认的,返回结果为0