VSVScode debugg下为什么多此一举jmp函数地址

最近学习驱动开发在写绕过inline hook的玳码时,有个问题困扰了我一天最后发现原来是在内嵌汇编时,没有使用_declspec(naked)导致的看来是偶的基础知识掌握的不牢固啊(得补一下了,磨刀不误砍柴功),在此给记录一下给自己一个警示。

对于jmp类型的hook 如果自己的过程没有使用_declspec(naked),那么系统会自动给添加一些额外的代码控制堆栈平衡,但是这些额外的代码会破坏被hook函数的堆栈

对于call类型的hook,如果使用_declspec(naked)修饰的话要注意自己恢复堆栈平衡。

_declspec(naked)修饰可以生成一個“裸”函数 使用后C编译器将生成不含函数框架的纯汇编代码,裸函数中什么都没有所以也不能使用局部变量,只能全部用内嵌汇编實现

就是告诉编译器,在编译的时候不要优化代码,通俗的说就是

1使用 naked 关键字必须自己构建 EBP 指针 (如果用到了的话);

2,必须自己使用 RET 或 RET n 指令返回 (除非你不返回);

_delcspec(naked)用在驱动编写C语言内嵌汇编完成一些特定功能。

}

最近学习驱动开发在写绕过inline hook的玳码时,有个问题困扰了我一天最后发现原来是在内嵌汇编时,没有使用_declspec(naked)导致的看来是偶的基础知识掌握的不牢固啊(得补一下了,磨刀不误砍柴功),在此给记录一下给自己一个警示。

对于jmp类型的hook 如果自己的过程没有使用_declspec(naked),那么系统会自动给添加一些额外的代码控制堆栈平衡,但是这些额外的代码会破坏被hook函数的堆栈

对于call类型的hook,如果使用_declspec(naked)修饰的话要注意自己恢复堆栈平衡。

_declspec(naked)修饰可以生成一個“裸”函数 使用后C编译器将生成不含函数框架的纯汇编代码,裸函数中什么都没有所以也不能使用局部变量,只能全部用内嵌汇编實现

就是告诉编译器,在编译的时候不要优化代码,通俗的说就是

1使用 naked 关键字必须自己构建 EBP 指针 (如果用到了的话);

2,必须自己使用 RET 或 RET n 指令返回 (除非你不返回);

_delcspec(naked)用在驱动编写C语言内嵌汇编完成一些特定功能。

}

上述 代码(没有设置 


    代码看到这裏错误的原因基本也就出来了。“高”的GBK编码是“b8 df”调用isspace函数是逐个字节判断,但是isspace和_chvalidator接受的参数都是int这样就会产生一个char到int的转型,在vc下char默认是"signed char",这样char“b8”转型到int后会变成一个负数,然后在assert的时候又强制转型为unsigned,它又变成了一个非常巨大的正数自然assert就失败了。

    为什么在gcc下没有错误gcc下的isspace函数实现我倒没看,不过我的gcc中的char默认就是“unsighed char”所以即使isspace的实现跟上面的一样,也不会产生问题


    问题找箌了,剩下的就看怎么解决了

    首先用用一个最简单的方法,既然问题发生在转型上只要把char的默认类型改为unsigned char就可以了,vc也提供了这个选項但这有几个问题,一是别人用我的代码的时候还得修改编译选项二是修改了整个工程的编译选项可能会对其它代码产生不好的影响。

    既然上面的方法不大好操作那就再想想别的方法。经观察发现isspace函数中靠__locale_changed变量控制流程走向,搜索整个crt的源代码发现__locale_changed的值只有在setlocale函數中发生了改变。最后我把代码进行修改 添加了   

}

我要回帖

更多关于 VS debug 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信