首页
社区
课程
招聘
[求助]驱动加VMP壳,加完标记后编译通不过,报unresolved external symbol
发表于: 2014-7-26 15:29 11602

[求助]驱动加VMP壳,加完标记后编译通不过,报unresolved external symbol

2014-7-26 15:29
11602
公司一个驱动项目需要用VMP来加密一些关键的地方。

用2600和7200版本的DDK都测试过,创建一个Driver工程,在里面添加了VMProtectDDK.h,
并把VMProtectDDK32.lib和VMProtectDDK32.sys也一同复制到了工程目录下,
甚至VC里设定的DDK的Inlucde的目录,库文件目录等等都复制了上述两个文件。

正常编译这个空的Driver工程,能编译过能装载。
但是一旦加入了       

VMProtectBegin(__FILE__);

就报

错误        1        error LNK2019: unresolved external symbol _VMProtectBegin@4 referenced in function "void __stdcall MyInit(void)" (?MyInit@@YGXXZ)        driver1.obj

甚至我用IDA看过了VMProtectDDK32.sys之后,自己写了一个类似的SYS,并导出所有VMProtectDDK32.sys导出的函数,最后
自己建了一个Win32 static library工程,生成对应lib,并修改了VMProtectDDK.h里面对lib的引用后,编译的时候依旧报同样的错误。

论坛上有人问过同样的问题...但是没有说到底解决了木有....
网上也搜了一大遍,完全木有相关的答案...

有没有成功用过vmp来加密驱动的前辈,求解救

******************************************************

谢谢alazif和sidyhe的热心回答~

问题解决啦,我来总结一下。

驱动加VMP报Unresolved extern symbol,就在sources文件里加一句
TARGETLIBS=VMProtectDDK32.lib
lib名改成对应位数系统的

顺带附上驱动生成map的方法:

sources里加入
LINKER_FLAGS =$(LINKER_FLAGS) -map -merge:PAGECONST=PAGE

我发现把-merge:PAGECONST=PAGE 去掉也能生成map,所以不知道这一句是不是多余的

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 7
活跃值: (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
在你的驱动sources文件里应该还有vmp提供的lib文件的设置吧。。瞎猜。。
2014-7-26 15:53
0
雪    币: 74
活跃值: (248)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
VS创建的项目?
是VS创建的话   项目->配置属性->链接器→输入->附加依赖项   在最后面加上VMProtectDDK32.lib
make文件应该也能显示指定依赖项  ....习惯vs+vddk好久不用make忘了你去网上找找....这一定是菊硬的阴谋←_←
2014-7-26 15:54
0
雪    币: 2161
活跃值: (750)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
对于sys工程,修改source文件
TARGETLIBS=xxx.lib

---
对于win32工程,添加一句预编译指令
#pragma comment(lib, "xxx.lib")

或者修改工程属性
2014-7-26 16:44
0
雪    币: 218
活跃值: (169)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
弱弱的问一句菊硬是啥意思

我用的是VS+DDK2600,是没有"项目->配置属性->链接器→输入"这个选项的
打开工程属性后只有"常规 调试 NMAKE"这三个子选项,
跟别的Win32工程属性页选项不一样,其实我也很纳闷为什么会这样,或许是我的DDK的问题?

VDDK也是编译驱动的?好使不,如果比DDK好使的话我也用

突然想起来VDDK是visual DDK么
2014-7-26 23:39
0
雪    币: 218
活跃值: (169)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=sidyhe;1303840]对于sys工程,修改source文件
TARGETLIBS=xxx.lib

---
对于win32工程,添加一句预编译指令
#pragma comment(lib, "xxx.lib")

或者修改工程属性[/QUOTE]

改工程属性看来是不行了,我楼上已经说过了,没有修改lib的那个选项...

不过你这个修改source的方法看起来很靠谱,上班之后试一试
2014-7-26 23:40
0
雪    币: 2161
活跃值: (750)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
7
还有另一种方法,也是我常用的,修改source生成map文件
用vmp打开sys,新建流程的时候就可以看见函数符号了
这种方法能够避免在编译时内联函数带来的“标签未闭合”问题
如果加密时出现警告,可以不处理,也可以查看汇编,在警告的那一句设置为“流程末端”来解决
2014-7-27 08:56
0
雪    币: 218
活跃值: (169)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
说说详细怎么修改source才能生成map吧~

我之前用过一个治标不治本的方法来解决我的问题,把要加密的函数导出,VMP就可以看到了...
不过问题也出来了,导出之后就可以看到函数名了

生成MAP会看到函数名吗?这个块我不是很了解,求指教哟
2014-7-27 13:56
0
雪    币: 74
活跃值: (248)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
菊硬嘛....Microsoft = !微软= 巨硬 ≈菊硬  so~

恩 是visual ddk
在创建项目的时候有个选项 默认使用ddk的编译器 这样是不能设置的   但可以选择使用vs的编译器 就可以设置属性了

这里可能有可以参考的...http://blog.csdn.net/liaocs2008/article/details/7989511
http://www.newsmth.net/nForum/#!article/WindowsDriverDev/18423
2014-7-27 16:19
0
雪    币: 218
活跃值: (169)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢alazif和sidyhe的热心回答~

问题解决啦,我来总结一下。

驱动加VMP报Unresolved extern symbol,就在sources文件里加一句
TARGETLIBS=VMProtectDDK32.lib
lib名改成对应位数系统的

顺带附上驱动生成map的方法:

sources里加入
LINKER_FLAGS =$(LINKER_FLAGS) -map -merge:PAGECONST=PAGE

我发现把-merge:PAGECONST=PAGE 去掉也能生成map,所以不知道这一句是不是多余的
2014-7-28 19:36
0
雪    币: 2161
活跃值: (750)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
11
我所说的第二个方法是修改source文件,就像你说的
LINKER_FLAGS=$(LINKER_FLAGS) -MAP

代码中不需要添加vmp的头文件和设置保护标记
就是正常的编译流程,仅仅是多了个map文件
然后用vmp加密sys,添加流程的时候vmp会去找map文件
如果有map,则会显示函数符号以及对应的地址
这样就可以针对某一个函数加密了
2014-7-28 20:37
0
游客
登录 | 注册 方可回帖
返回
//