window xp sp1 的kernel.dll没有encodepointer 和decodepointer,vs2010编译出来的exe和dll都带了encodepointer,decodepointer的,vs2010的自己的mfc的动态库(eg. mfc100.dll等)里在调用kernel.dll时也使用了这两个函数
要摆脱encodepointer 和decodepointer
法1
xp升级到sp2及以上
法2
退回到vs2008及以前
法3
还是使用vs2010,选择所有工程和库选择“静态链接mfc”,这样摆脱掉mfc100.dll等库,但是如果是个dll或exe的工程,他自身还要调kernel.dll的encodepointer 和decodepointer,使用如下代码摆脱调他们
.model flat
.data
__imp__EncodePointer@4 dd dummy4
__imp__DecodePointer@4 dd dummy4
__imp__InterlockedPopEntrySList@4 dd dummy4
__imp__InterlockedPushEntrySList@8 dd dummy8
EXTERNDEF __imp__EncodePointer@4 : DWORD
EXTERNDEF __imp__DecodePointer@4 : DWORD
EXTERNDEF __imp__InterlockedPopEntrySList@4 : DWORD
EXTERNDEF __imp__InterlockedPushEntrySList@8 : DWORD
.code
dummy4 proc
mov eax, [esp+4]
ret 4
dummy4 endp
dummy8 proc
mov eax, [esp+4]
ret 8
dummy8 endp
end
将如上文本保存为crack.asm,有可能还有修改targetver.h里的版本号,但是我没有遇到,在vs的命令环境下ml -c crack.asm编译出来,当做库加入到你的工程,中这用就不会到kernel.dll中去找encodepointer 和decodepointer了,这里是一个编译好的目标文件,32位的,把它添加到你的工程中就可以了。
使用静态链接mfc易报库冲突的错,特别是libcmt.lib和msvrt.lib,这时可以选择忽略一个看看,一般不好使
,实在在不行就设置为“仅限多次定义的符号 (/FORCE:MULTIPLE)”,这样就把冲突当做警告了