VC下. 关于扩展的DLL,导出虚函数的问题,大侠请进

WSHAOH04 2004-12-23 10:40:53
如题:
我写了一个Dll(扩展的),
然后在这里面实现了一个带有对话框资源的类,目的是想将其导出.
在这个类中,OverWrite了一个虚函数Create().

编译通过,
然后到一个应用程序中去测试,(.dll,.lib等准备工作都做好了)
具体的调用过程如下:
void CTest_ResourceMFCDll_CallDlg::OnTest()
{

CmcDlg *pTempDlg = new CmcDlg;//CmcDlg是导出的类
pTempDlg->Create();//是重载的虚函数
pTempDlg->ShowWindow(SW_SHOW);
}
然后能编译通过,不过执行时候总是出现如下错误:
无法定位程序输入点?Create@CmcDlg@@AEHXZ与动态连接库 .dll上.

清高手释疑.
...全文
138 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
WSHAOH04 2004-12-23
  • 打赏
  • 举报
回复
包含了,并且在Setting->Link中加载了.lib文件.
快乐鹦鹉 2004-12-23
  • 打赏
  • 举报
回复
看看你的动态库定义,还有测试工程中,lib文件包含没有
WSHAOH04 2004-12-23
  • 打赏
  • 举报
回复
不知道有什么好的办法解决,郁闷死了,
WSHAOH04 2004-12-23
  • 打赏
  • 举报
回复
没有,因为我得这个导出类的实现是继承的MFC的CDialog类,
danyueer 2004-12-23
  • 打赏
  • 举报
回复
你导出了这个类的基类没有?
【文章标题】: 绕过 Enigma Protector 2.xx 注册保护 【文章作者】: CodeGame 【作者邮箱】: CodeGame@Yeah.Net 【作者主页】: http://blog.csdn.net/codegame 【作者QQ号】: 441673604 【软件名称】: windows 计算器 【软件大小】: 669kb 【下载地址】: windows xp 系统自带 【加壳方式】: The Enigma Protector 2.20 正版 【保护方式】: The Enigma Protector 2.20 正版 【编写语言】: VC 【使用工具】: OllyDBG 【操作平台】: Windows XP sp3 【软件介绍】: 1+1=2 【作者声明】: 文笔菜的很请谅解,只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教! -------------------------------------------------------------------------------- 【详细过程】 参考了 http://unpack.cn/thread-59541-1-2.html 定位方式,迅速定位到了 Enigma 注册授权位置: 010F2CBF E8 CC76F3FF call calc_em.0102A390 010F2CC4 8B45 E8 mov eax,dword ptr ss:[ebp-0x18] 010F2CC7 E8 FC78F3FF call calc_em.0102A5C8 010F2CCC 50 push eax 010F2CCD E8 DE90FFFF call calc_em.010EBDB0 ; Check Registration Key Info 010F2CD2 85C0 test eax,eax ; Eax =1 Success! 010F2CD4 0F95C0 setne al 这里010EBDB0 这个CALL负责检测注册码是否正确,正确返回1 否则返回0,由于 Enigma有多线程内联补丁保护因此不能 直接硬写此处代码,所以我们采用了硬件断点HOOK来实现。 1:定位PatchAddress: 先看此块内存信息: 地址=01026000 大小=002F4000 (3096576.) 属主=calc_em 01000000 区段= 类型=Imag 01001002 访问=R 初始访问=RWE 这块内存实际是Enigma的内置DLL授权模块,此块DLL是被加密压缩过,因此也无法直接patch,通过对比加不同的程序 发现这块区域解压后的代码都不变: $+CCCBF > E8 CC76F3FF call calc_em.0102A390 $+CCCC4 > 8B45 E8 mov eax,dword ptr ss:[ebp-0x18] $+CCCC7 > E8 FC78F3FF call calc_em.0102A5C8 $+CCCCC > 50 push eax $+CCCCD > E8 DE90FFFF call calc_em.010EBDB0 ; Check Registration Key Info $+CCCD2 > 85C0 test eax,eax ; Eax =1 Success! $+CCCD4 > 0F95C0 setne al 因此PatchAddress = BaseAddress+PatchOffsetAddress,通过上面分析得到 Enigma Protector 2.20 的 PatchOffsetAddress = 0xCCCD2 ,不同版本的PatchOffsetAddress 有可能不一样,BaseAddress 的获取就更简单了, 直接搜索区段判断VirtualSize为0x002F4000的VirtualAddress+GetModuleHandle(0)即为BaseAddress,整理公式: PatchAddress = GetModuleHandle(0)+VirtualAddress+0xCCCD2 定完毕。 2.硬件Hook: 这里我们采用AddVectoredExceptionHandler向量化异常API来实现,具体细节请自己google,重点讲下Hook触发后的过程 由于我们Patch点为$+CCCD2 > 85C0 test eax,eax ,因此只需要模拟操作EFlags然后跳过此段指令即可: pException^.ContextRecord^.EFlags := $202; //TEST eax,eax pException^.ContextRecord^.Eax := 1; //TEST eax,eax PException^.ContextRecord^.Eip := PException^.ContextRecord^.Eip + 2; //Nex 3.整体封装: 这里我们采用是把硬件HOOK和处理的过程都封装成DLL 然后导出一个GoPatch的函数供目标程序调用,那么如何使目标程序 加载并执行我们的GoPatch函数呢,我想办法很多注入,远线程等等。。这里我采用了劫持EIP的方式使目标程序加载我们的 DLL并执行GoPatch函数。 到这里已经全部完成,执行GoPatch后任意输入或者不输入用户名、注册码都可以直接绕过Enigma 的注册保护直接执行。

15,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧