各位知不知道有没有如下的技术方案,一个DLL中的函数在被一个EXE或DLL调用时,怎么才能记录下来是那个程序在调用它,参数是如何传递的。如果哪位高手知道具体的内容,请回复,十分感谢。
解决方案 »
- 问一个Delphi关于Flash的问题
- 哪位老兄有Rxlib2.75 for delphi 7?我下载的安装时候是乱码,没用!
- fastreport问题:如何在程序中直接打开带密码的fr报表。
- 请问如何判断SQLSERVER中表中图片字段是否为空?
- 管理系统中用户认证这一块有什么方法保证同一用户同一时间唯一使用????
- 请问如何禁止我的DCOM程序在客户端连接后自动启动啊?
- 在终端上无法设置大字体 DELPHI能保证自己用大字体运行吗?
- 会编写类的朋友请进
- 怎样给grid中某个格子画边框?
- DELPHI初学者的问题,关于ADO的!
- stringgird可以编辑么
- CSDN的搜索居然不支持模糊查找,靠
{
case (ul_reason_for_call)
{
//DLL被映射
case DLL_PROCESS_ATTACH:
//Dll线程启动
case DLL_THREAD_ATTACH:
//Dll线程销毁
case DLL_THREAD_DETACH:
//Dll被卸载
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}其中:hModule表示Dll模块的实例句柄;
在程序中我们通过调用GetModuleHandle(NULL)获得的句柄是调用者的句柄。
可以通过调用者的句柄再去判断调用者的应用程序。以上使用C语言,对应Delphi中使用
initialization
finaliaztion
end.
(1)DLLMain在delphi中好像一般情况下只有一个参数rl_reason_for_call,名称一般叫dwReason。好像没有hModule参数。
(2)delphi在调用DllMain时,一般通过工程文件中写DllMain(DLL_PROCESS_ATTACH);方式实现,如果此时在DllMain中增加参数hModule后,这个值如何传递呢。
(3)DLLMain中参数hModule的含义好像是自己的句柄,而不是调用窗口的句柄。
如果要对起进行记录的话,可以在dll初始化的时候对其进行相关的记录。
2 在delphi的SysInit单元中有HInstance变量.他就是hModule,等于GetModuleHandle(nil)注意:application对象中没有hModule的描述
有以下API可以提供帮助
GetCurrentProcess 获取当前进程Handle
GetCurrentProcessID 获取当前进程的进程ID
GetCommandLine 获取启动当前进程时命令行, 其中包括进程的文件名称
以上均为Windows API函数
分成两个部分。
第一:如何获取调用程序下一条指令地址。
在dll中导出过程,一进来的[esp]肯定就调用模块下一条地址值,但delphi过程封装时又处理了esp的值我写了这样的处理,供楼住参考。
假设在dll中我有一导出过程 procedure ShowModuleName;stdcall;
var
CallAddress:PDWORD;
begin
asm
pushad;
push [esp+38h] //这里就是调用着下条指令的地址了。我是通过cpuview看esp栈算出来的。
pop CallAddress
popad;
end ;
end;
在delphi下有一个 EnumerateLoadedModules,可以使用他..我的代码如下
定义回调。我的声明如下参数为ModuleName,模块名,ModuleBase模块句柄,ModuleSize大小,
function EnumLoadedModulesfarProc(ModuleName: PChar;ModuleBase: DWord;ModuleSize: DWord;UserContext: Pointer): LongBool; stdcall;使用EnumerateLoadedModules列举模块。CallAddress为我们上面获取的值
EnumerateLoadedModules(GetCurrentProcess,@EnumLoadedModulesProc,nil);余下的事情就是判断地址值是否在某个模块下了,代码就略了!
Application.ExeName
GetCommandLine不知道如何确定是静态连接还是动态连接
现在还没有试出来。
顶。
delphi中
GetModuleFileName(HInstance,lp, 100);
就可得到自己dll的路径,其中HInstance为当前dll的Hmoudle