|
发表于 2020-5-24 11:34:53
|
显示全部楼层
河北省秦皇岛市
本帖最后由 weion 于 2020-5-24 11:43 编辑
用惯了VC,易语言代码不大懂。只能替你分析一下,问题主要是堆栈没弄平衡。
push_eax() //
add_ecx("CC",)
call_eax() //返回后 EAX中保存的值需要作为当前函数的返回值是吧。
//此时堆栈保存的是上面PUSHAD保存的8个寄存器值 + EAX
//加入的语句在后面
popad() //恢复堆栈,此时EAX为未调用此函数时的值,返回的是相当于函数没有调用的结果
ret() //程序返回了 后面的代码都调用不到
调用汇编代码(。。。。) //没用的
//====建议加入的语句,将调用得到的EAX值,替换堆栈中保存的EAX值=======
//pushad,依次将EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI,执行后ESP- 32
ADD ESP,4 //调试一下 看需要不需要 修正ESP值(),指向原栈顶
ADD ESP,32 //ESP指向堆栈保留的EAX地址
push eax //EAX入栈,同时 ESP-4
SUB ESP,28 //恢复ESP值
//====此后执行POPAD,EAX值即可传递到上层调用
//重点的重点的重点在于,堆栈平衡,堆栈不平衡程序肯定崩掉。
//堆栈中EAX的下面一个是EIP, 也就是RET指令要恢复的指令寄存器,堆栈要不平衡,RET就返不回去了 |
|