参考MSDN官方文档,长期更新,将在实践中的常见函数列出来。
MK_FP
原型: #define MK_FP( seg,ofs )( (void _seg * )( seg ) +( void near * )( ofs ))
说明:设置一个远指针,一般会前后异或,可以用来判断内存修改,分析函数有没有溢出。
例如:*MK_FP(__FS__, 40LL),取FS段偏移量为40LL地址的值
JUMPOUT
说明:IDA中用于建立一个长跳转的函数,其参数一般为一个具体的函数开始地址。
原型:long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
说明 :提供了父进程观察和控制其子进程执行的能力,发送给被跟踪的子进程的信号(除了SIGKILL),都会被转发给父进程,这也是调试器主要原理。
1). enum __ptrace_request request:指示了ptrace要执行的命令。如:PTRACE_SETREGS---设置寄存器;PTRACE_GETREGS---读取寄存器;PTRACE_KILL---杀掉子进程,使它退出。
详细request参数解释:http://blog.csdn.net/u012417380/article/details/60468697
2). pid_t pid: 指示ptrace要跟踪的进程。
3). void *addr: 指示要监控的内存地址。
4). void *data: 存放读取出的或者要写入的数据。
scanf
原型: int scanf(char *format[,argument,...]);
说明:通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。
sscanf
原型:int sscanf (const char *str,const char * format,........);
说明:与scanf类似,但是以固定字符串为输入源,sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。转换后的结果存于对应的参数内。成功则返回参数数目,失败则返回0。
例如:sscanf("12345","%4s",str); -->str=1234
std::basic_ostream
这是一个IO流操作函数,可以建立std::cin与std::cout和>>以及<<的操作方式,实现cin与cout库函数,如一个例子中:std::basic_ostream>::operator<<(v0, std::endl); 就等价于cout<<endl;
_cinit
如果有全局类数组,在main之前类数组会被初始化, 类的构造会被调用。
第一步_FPinit 主要用来初始化浮点运算,第二步和第三步是分别对C和C++程序做初始化。_initterm 接受两个指针作为参数。全局类的初始化由_cinit的第二个_initterm发起.
// __xc_a(函数指针表开始地址) 和 __xc_z (函数指针表结束地址) 是编译器填写的// 从__xc_a开始, 到 (__xc_z - 4)是函数指针表, 里面的内容是代理函数地址.
_initterm( __xc_a, __xc_z );///< 负责全局类的初始化, 调用类的构造
可以考虑使用idapython编写脚本解决这些函数数据的转化,以及去除函数的空嵌套的情况。
PeekMessage
原型:BOOLPeekMessage( LPMSG IpMsg, HWND hWnd, UINT wMSGfilterMin, UINT wMsgFilterMax, UINT wRemoveMsg);
说明:为一个消息检查线程消息队列,并将该消息(如果存在)放于指定的结构。IpMsg为接收消息信息的MSG结构指针;hWnd为其消息被检查的窗口句柄。和函数GetMessage不一样的是,GetMessage:从系统获取消息,将消息从系统中移除,属于阻塞函数。当系统无消息时,GetMessage会等待下一条消息。而函数PeekMesssge是以查看的方式从系统中获取消息,可以不将消息从系统中移除,是非阻塞函数;当系统无消息时,返回FALSE,继续执行后续代码。一般用为输入等操作的信息获取。