level 8
大佬们,我想跳转到0x00403180处,然后用的是e9来跳转,结果跳转的是一个偏移地址,该怎么办?要提前计算好偏移地址然后再跳转吗?
//用其他语言内联,但不支持直接内联,所以用的是机器码
2020年12月08日 13点12分
1
level 8
其实我是在学习Windows消息机制的时候想写一个API窗口来使用方便学习一点,写完之后想写一个窗体类方便以后使用
2020年12月09日 05点12分
3
level 8
but,类成员函数使用的是thiscall调用约定,而系统调用窗体处理函数使用的是stdcall调用约定,就必须有一个中间代码来进行转换
2020年12月09日 05点12分
4
level 8
于是乎写了一个跳转函数,压入了this指针并跳转(这就是我之前跳转出问题的地方)(前面用的是jmp,前面我以为thiscall和stdcall的区别就在于一个this指针,所以认为函数可以自己清理堆栈)
2020年12月09日 05点12分
5
level 8
没想到的是thiscall不但要把this指针压入堆栈,还有存在ecx,关键是返回值还存在堆栈所有参数前一个值指向的地址,并且还将eax置为0
2020年12月09日 05点12分
6
level 13
我是这样看的,高阶语言所有调用,函数或api只是一个封装,它定义了需要什么输入,然后有什么输出,你调用一个函数,不管什么编译器结果都是一样.
但,深入一层去看汇编,你会发现不同的编译器会有不同的处理方法,参数传递,返回方式都可能不同.就是同一编译器,32bit和64bit就已经完全不同,64bit会用到rcx,rdx,r8,r9来传入参数而不是用堆栈.
所以用不用ecx或者怎样传入怎样返回,都不必太惊讶.
2020年12月09日 12点12分
8
多谢大佬提点
2020年12月09日 12点12分