主要观点总结
文章描述了在将旧版本dll替换到新软件中遇到的堆栈指针问题。文章的关键点包括:在win7和win10下运行新软件时遇到的问题,逆向分析过程中发现函数入口使用rsp和函数结束使用esp的问题,以及这个问题在win7和win10下表现不同的原因。
关键观点总结
关键观点1: 软件在新旧操作系统中的兼容性问题
文章中描述了在将新软件中的插件替换旧版本时遇到的问题,win7下正常运行,但在win10下闪退。
关键观点2: 逆向分析过程中的堆栈指针问题
文章详细描述了逆向分析过程中发现的堆栈指针问题,入口使用rsp和出口使用esp的冲突问题。
关键观点3: 问题产生的根源和解决方案
通过分析发现了导致问题的原因:直接操作32位寄存器会将高32位清零,最后解释了问题的解决方法以及测试中为何在win7和win10下表现不同。
关键观点4: 编译细节和问题探讨
文章提到了编译过程中入口使用rsp和结尾使用esp的情况,同时提出了一个关于为什么使用这样的编译方式的问题。
正文
add, esp, 298h
指令:
聪明的你一定已经发现问题了,怎么开始是用的rsp寄存器,后面用的是esp寄存器呢?
PS:esp是x86架构CPU的栈指针寄存器,rsp是x64架构CPU的栈指针寄存器。x64兼容了x86指令集,可以通过esp访问rsp的低32位。
先别往下看,你先猜一下,这里会出问题吗,为什么会出问题呢?
由于前面正好有一堆nop,于是将紧邻着的一个nop从0x90改为0x48,这样一来,就把
add esp, 298h
这条指令,改成了
add rsp, 298h
了。保存,然后成功修复了~然后很得意的在群里吹水去了~
但事情并没有结束。过了几天总结文档时,突然意识到:不对!有问题!
修复程序的当时我给开发那边给出了一个解释,是恢复栈指针时出现了错误导致堆栈不平衡。但现在仔细想想,简简单单一句“堆栈不平衡”完全解释不通。
原因是,win7能跑,意味着在win7下
add esp