编写DLL的问题

笑面佛_正版 2002-08-02 10:16:37
我在编写一DLL动态链接库时,编写是用的是非MFC的动态链接库,并不是静态的链接库,但是在写其中的函数时发现调用DLL中的函数不能向其中传入参数,只用(*lpfn)(void),只有一传参数就说此函数不可以传入参数,但在我写的DLL中的函数是有参数,这是为什么.

还有就是如何让我的程序只要是其中的一两个函数比如在函数sum()执行过程中不允许暂停,不可以调用调试模式,锁定其使用的内存地址,就是说要在这个函数执行过程中就象是在DOS的单进程中执行一样,不允许别的程序干预,读写文件如何完全控制,不可以调用MFC的函数,只能用API函数,因为我在写在DLL文件中,它没有MFC支持.
...全文
56 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
笑面佛_正版 2002-08-04
  • 打赏
  • 举报
回复
http://www.csdn.net/expert/topic/923/923401.xml?temp=.1628382
笑面佛_正版 2002-08-04
  • 打赏
  • 举报
回复
我的加密算法就在这,是DOS下的,现在只是改写.
xyz119 2002-08-04
  • 打赏
  • 举报
回复
你提高程序运行级别是没法逃避调试工具的。我还是先说说一般的破解者是怎么做的吧:首先你的程序是用来加密文件的,肯定会用到文件操作的API,常用的调试工具如SOFTICE具有拦截API的功能,就在某个文件操作API上下断点。运行你的程序,当程序执行到加密文件时就会被中断,再分析此时断点上下的代码(当然这是反汇编的代码),因为一般人会把加密算法写在这附近(相信你也是一样)。找到加密算法后加以分析再进行破解。我建议你把加密代码和同文件操作的代码分开,这样可增加一些破解难度。

我上面只是举个例子,可下断点的地方还很多比如MessageBox等等。想写出不被破解的程序是不容易的,继续努力吧!
郑再鹏 2002-08-04
  • 打赏
  • 举报
回复
有意思!哈哈。
笑面佛_正版 2002-08-04
  • 打赏
  • 举报
回复
其实我是用来加密文件,但加密就一定要在电脑上运行,内存中就一定会有密码变量,当然你也可以在加密完以后清掉,但在加密的过程中被强行中断也包括暂停或者用一个好几百M的文件让你慢慢运行,他再用另一程序来盗取密码,这样的话加密就没有用了,所以我还得提高我程序运行的级别,再独占打开的文件.在VC中是否要和DOS下一样来打开文件,其实我加密的算法是写好了的,用C写的字符界面,现在做的只是改版,发现有这么多的问题难以解决.
xyz119 2002-08-04
  • 打赏
  • 举报
回复
我曾经为公司写过程序加密部分,也研究过加密方法。以上是我的一点心得,见笑了。程序加密不必过重于考虑加密算法,现在已经有很多成熟的算法随便拿一个来用就可以了。关键还是一句话:了解你的对手,知己知彼,百战百胜!
xyz119 2002-08-04
  • 打赏
  • 举报
回复
to lanzhengpeng2(兰征鹏) :

呵呵!
你不了解软件破解,在程序中加密和加密一篇文章是不一样的,如果加密一篇文章加密算法本身的加密强度是很重要的,你用一些比较成熟的加密算法如DES要想破解恐怕只有用群举。但再程序中不是这样,由于加密和解密过程都在程序中,我可以修改你的二进制代码跳过加密算法。或找到密匙加以破解
lanzhengpeng2 2002-08-04
  • 打赏
  • 举报
回复
我想要的是我的加解密过程不被别的应用程序干涉,就好象是在DOS的单任务一样,还不允许用DOS那样的DEBUG来调试.
也是不可能的。连ring0级别的系统程序都可以被随意调试,何况你一个普通的应用程序!
lanzhengpeng2 2002-08-04
  • 打赏
  • 举报
回复
加密是不能靠把加密的程序隐藏以来或算法隐藏起来的。没有任何作用。
靠的是加密算法本身的加密强度
xyz119 2002-08-04
  • 打赏
  • 举报
回复
你应该先了解一下破解者是怎么做的,再针对破解方法设计加密方法,这样才有效。
xyz119 2002-08-04
  • 打赏
  • 举报
回复
我不是说加密算法没有用,但在程序中单靠加密算法是没有用的,如果被破解者找到加密算法的所在,根本无须理会加密算法,加一个跳转指令跳过即可。这就是通常所说的“爆破”。所以关键考虑怎样不让破解者找到加密的位置。
笑面佛_正版 2002-08-04
  • 打赏
  • 举报
回复
一个真正可以实用的加密码程序是在源代码公布的情况下也有很强的生命力,若在隐藏源代码,那估计用
char ch;
ch='a';
ch=ch+3;
就够了,但这样的加密码程序是没有用的,我想要的是我的加解密过程不被别的应用程序干涉,就好象是在DOS的单任务一样,还不允许用DOS那样的DEBUG来调试.
xyz119 2002-08-04
  • 打赏
  • 举报
回复
想要不让别的程序访问到这个函数估计不太可能,如果要写加密程序关键要程序的加密代码隐藏起来,不要让破解者轻易找到。建议你学点破解软件方法,有帮于你写加密程序。
webber84 2002-08-04
  • 打赏
  • 举报
回复
嘿嘿,这个就比较难办了,不懂。
笑面佛_正版 2002-08-04
  • 打赏
  • 举报
回复
谢谢各位了,再帮我看看如何在调用DLL中的函数时不会被别的程序访问到这个函数中的内存,我说的是用任何强行中断,调试等非法手段,因我写的是加密程序,在加密解中不允许密码被窃取.
jhhxxdj 2002-08-03
  • 打赏
  • 举报
回复
你试试下面的语句
static HINSTANCE hDLL;
typedef BOOL (CALLBACK *inshook)();
inshook instkbhook;
if(hDLL=LoadLibrary((LPCTSTR)"you.dll"))
{
instkbhook=(inshook)GetProcAddre(hDLL, "function");
instkbhook();
}
once168 2002-08-03
  • 打赏
  • 举报
回复
webber84(糕鱼昏)说的很清楚了!
你用一个int (__stdcall *)(void)指针去指向int (__stdcall *)(char*);那当然报错啊!------在C中是没有这个问题的,但C++已将参数作为函数名称的一部分了(即可实现函数重载)

typedef void DLL_FUNC(char*);
HMODULE hDll=LoadLirary("your.dll");
DLL_FUNC *pFun=(DLL_FUNC *)GetProcAddress(hDll,"function");
pFun("It is OK!");

笑面佛_正版 2002-08-03
  • 打赏
  • 举报
回复
这样呀,那要如何转换
我编译的错误就是这样的:
error C2197: 'int (__stdcall *)(void)' : too many actual parameters
Error executing cl.exe.
webber84 2002-08-03
  • 打赏
  • 举报
回复
默认情况下GetProcAddress返回的函数指针是void (*)(void)型的,就是一个返回值为void,参数为void的函数指针。你要做转换才能调用你自己的函数。
笑面佛_正版 2002-08-03
  • 打赏
  • 举报
回复
会这样吗,我觉得那个函数可以调用,并不是不能调用,只是一加上参数,如一串字符串就出错,说这个函数申明时是调用不能传参数的 void 型,但我申请时可是有参数的.
加载更多回复(8)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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