程序的参数值和返回值构成了程序的另一个重要特征:数据流。同控制流一样,数据流也是程序分析的重要指标。

      获得程序的函数调用序列后,获取参数值和返回值就较为方便,我采取的方法如下:

      首先建立敏感函数信息库。进行函数参数和返回值的提取,需要知道函数的参数个数、格式、在操作系统中的加载地址等基本信息。

      其次、监控每条执行指令,发现进入敏感函数后,确认在该函数内执行push ebp(0x55)操作后,依据栈状态,此时ESP+0x8为第一个参数所在、ESP+0xc为第二个参数所在。。。即可成功提取各个参数的值。

      如果还想获取函数的返回值,就需要在获取参数的同时标记本函数的返回地址,当函数返回时,就可以从eax寄存器中顺利读出。

      如果想获取类似recv函数的接收数据,需要在获取参数的同时,记录函数返回地址和缓冲区地址,在函数返回时,依据返回值进行读取。