X64 下的参数传递

MS VC的参数传递方式为:

前4个参数总是放在寄存器中传递,剩余的参数则压入堆栈中。而x86上则是全部压入堆栈中(除了fastcall方式)。

这4个用于存放参数的寄存器分别是:
存放整数参数的RCX,RDX,R8,R9;
存放浮点数参数的XMM0,XMM1,XMM2,XMM3;

整数和浮点数参数混合出现:
func3(float a, int b, double c, int d)
a放入XMM0中,b放入RDX,c放入XMM2,d放入R9。
这里比较特殊,其实就是按照这个规则:
a b c d
XMM0 RDX  XMM2 R9
也就是说4个整数寄存器严格的一一对应前4个参数,同样前4个XMM寄存器严格的一一应前4个参数,如果是整数浮点数间隔出现,那么就保持对应关系,选择对应的寄存器即可。

而gcc的则不是这样
版权为 win_hate 所有, 转载请保留作者名字
当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。
当参数为 7 个以上时, 前 6 个与前面一样, 但后面的依次从 "右向左" 放入栈中

例如:
CODE… Read More

IDAPython 脚本用VS PythonTool 调试方法

首先VS要安装PythonTool
然后在Python里安装ptvsd模块: pip install ptvsd
将下面的脚本保存到IDA Plugins目录:

# filename: ptvsd_enable.py
import idaapi
import ptvsd

try:
    # Enable the debugger. Raises exception if called more than once.
    ptvsd.enable_attach(secret="IDA")
except:
    pass


class DebugPlugin(idaapi.plugin_t):
    flags = idaapi.PLUGIN_FIX
    comment = "PTVSD Debug Enable"
    help = "Enable debugging using PTVSD"
    wanted_name = "PTVSD"
    wanted_hotkey = 
Read More