给小孩写了个电脑使用时间管理软件,为了防止被关闭,弄了个DLL注入来保护主程序,精易模块里的限制仅32位程序可用,只能自己重新写,为此借鉴了精易模块的同类功能代码,再结合其它C++源码总算弄好了一个用起来比较顺手的,32位和64位测试通过。
只是注入DLL时,32位主程序调用只能注入32位DLL到32位的目标进程中,代码不变,64位同样如此,但是交叉的话就会失败,我测试时只是改变编译程序位数就测试成功了,代码不用改变。
卸载DLL我借用了一点精易模块代码,用于查找DLL所在内存地址,这样卸载就没问题了,但是如果注入的DLL存在循环线程,一定要等待该线程完全关闭才能卸载,否则容易造成被注入的程序崩溃。
例如我是循环判断主进程是否存在,每3秒判断一次,在主进程中卸载已被注入的DLL时,执行了卸载后,等待3秒主程序才能结束自己,如果不等待这3秒,被注入的进程较大概率会崩溃,原因大概是主进程不在了,返回的代码找不到原调用它的代码内存,出现崩溃,大概是这意思。
让DLL自我卸载时也是一样,需要让有循环等待的线程退出后才能执行自我卸载。
卸载的崩溃问题我也是实践了不少时间才总结的大概。
下面时源码,切勿用于不好的地方,有需要的拿去,主要给新手学习,大佬随便跳过。