例如我们有一个 c 源程序

/*************************************************************************> File Name: ddg.c> Author: > Mail: > Created Time: 2017年08月24日 星期四 10时52分31秒************************************************************************/#include<stdio.h>
#define Version_Num "1.122"
#define Version_num 122
const int v_num = 1222;
const char * ver_num = "1.1.1222";
char *x = "Hello world";int main(){int a = 112;a += 12;printf("Version is : %s, %d",x,a);}void print1 (){printf("print1 %s",Version_Num);
}void print2(){printf("print2 %d",Version_num);
}void print3(){printf("print3 %d ",v_num);
}void print4(){printf("print4 %s",ver_num);
}

编译运行(本人使用了交叉编译,生成ARM平台下可执行文件)

然后使用所写脚本即可还原函数调用的参数,不过 脚本的输入是  printf的格式化字符串 例如:“print3 %d”

ida脚本如下:

#!/usr/bin/env python
# coding=utf-8from idc import *
from idaapi import *
import idautils
class AnayBinFil(object):def __init__(self):list = []# 得到某一条汇编指令所指向的内存的内容 def GetXref_String(self,ea,n):if (GetOpType(ea,n) == 2):ea = GetOperandValue(ea,n)if (not SegName(ea) == '.rodata'):addrx = idautils.DataRefsFrom(ea)for item in addrx:return self.GetXref_String(item,n)return idc.Dword(ea)return GetString(ea)#get the register's content whose number is i from ea forward searchdef get_content_register(self,ea,i):#print hex(ea) , idc.GetDisasm(ea), iif (GetOpType(ea,0) == 1 and GetOperandValue(ea,0) == i):# wanted registerif (ua_mnem (ea) == 'LDR'):if (GetOpType(ea,1) == 2):#Optype is Memory Referencereturn self.GetXref_String(ea,1)elif (GetOpType(ea,1) == 4):#Base+index+Displacementif(GetOperandValue(ea,1) == 0): # like  : LDR R3,[R3]return self.get_content_register(PrevHead(ea),i)else:return else :print 'unkown Optype:' ,hex(ea),idc.GetDisasm(ea)elif (ua_mnem(ea) == 'MOV'):if (GetOpType(ea,1) == 5):return GetOperandValue(ea,1)elif (GetOpType(ea,1) == 1):return self.get_content_register(PrevHead(ea),GetOperandValue(ea,1))else:print 'unkown OpType:',hex(ea),idc.GetDisasm(ea)else:return self.get_content_register(PrevHead(ea),i)#from a call instruction BackForward search parameterdef BackForward(self,addr,n):Reg_content = []#addr = PrevHead(addr)i = 0 # register numberfor i in range(n):Reg_content.append(self.get_content_register(addr,i))return Reg_contentdef Anayl_Func_Call(self, func_name, para_num):if func_name == "":return#get start addresssegkind = ['.text' , '.init' ,'.plt'] #startaddr = idc.SegByName('.rodata')startaddr = MinEA() #fun_addr = idc.LocByName(func_name)# search the address of the pattern textwhile True:fun_addr = FindText(startaddr,SEARCH_DOWN, 0, 0, func_name)if not (SegName(fun_addr)) in segkind:breakstartaddr = NextHead(fun_addr)print 'find pattern string addr',hex(fun_addr)#byte_str = [hex(y) for y in bytearray(func_name)]#print byte_str#print hex(fun_addr),idc.GetDisasm(fun_addr)call_addrs = idautils.DataRefsTo(fun_addr)dic = {}for item in call_addrs:if (not isCode(GetFlags(item))):continue#print hex(item),idc.GetDisasm(item)CALL_ADDR = itemwhile ( not ua_mnem(CALL_ADDR) == 'BL' ):CALL_ADDR = NextHead(CALL_ADDR)CALL_ADDR = PrevHead(CALL_ADDR)        #print 'from addr %s analyses' % (str(hex(CALL_ADDR)))para = self.BackForward(CALL_ADDR,para_num)xref_funname = GetFunctionName(CALL_ADDR)dic[xref_funname] = parareturn dicdef print_help():info = 'use this as : idal64/idal -S"Anaylise_All.py \'print1 %s\'" 'print infodef main():#test codeif (len (idc.ARGV) < 2):print_help()ana_fun_name = '%s  version %s  protocol version %d%s'else:ana_fun_name = idc.ARGV[1]#要分析的函数名para_num = 0 #参数数量pos = ana_fun_name.find('%')while (not pos == -1):para_num += 1pos += 1pos = ana_fun_name.find('%',pos)ana = AnayBinFil()dic = ana.Anayl_Func_Call(ana_fun_name,para_num+1)print '在函数中','其调用参数为'for item in dic:print item , dic[item]sf = open("out.dat",'w')if not sf:sf.write ('parameter:'+str(idc.ARGV[0])+str(idc.ARGV[1])+'\n')idc.Exit(0)for item in dic:sf.write('In function : '+item+'\n')x = (dic[item])s = '    'for i in range(len(x)):if x[i] is None:continues += str(x[i])+' , 'sf.write(s + '\n')sf.close()'''# get all names and it's addrfor x in Names():print x'''   idc.Exit(0)if __name__ == '__main__':main()

运行命令:idal64 -S"../Graph-based_Bug_Search/Analysis_Param_Call.py 'print4 %s'" arm_ddg

-S 表示运行ida python脚本

得到结果

In function : print4
    print4 %s , 1.1.1222 ,

利用ida python 实现复原函数调用的参数 (仅对数据被简单硬编码有效)相关推荐

  1. python根据频率画出词云_利用pandas+python制作100G亚马逊用户评论数据词云

    原标题:利用pandas+python制作100G亚马逊用户评论数据词云 数据挖掘入门与实战 公众号: datadw 我们手里面有一个差不多100G的亚马逊用户在购买商品后留下的评论数据(数据格式为j ...

  2. python 文件写入多个参数_pandas 把数据写入txt文件每行固定写入一定数量的值方法...

    我遇到的情况是:把数据按一定的时间段提出.比如提出每天6:00-8:00的每个数据,可以这样做: # -*-coding: utf-8 -*- import pandas as pd import d ...

  3. python 调用航空公司的接口 获取机票数据 api简单案例

    首先简单说下接口测试,现在常用的2种接口就是http api和rpc协议的接口,今天主要说:http api接口是走http协议通过路径来区分调用的方法,请求报文格式都是key-value形式,返回报 ...

  4. python怎么理解函数的参数_理解Python中函数的参数

    定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解 ...

  5. Python解析命令行读取参数 -- argparse模块

    在多个文件或者不同语言协同的项目中,python脚本经常需要从命令行直接读取参数.万能的python就自带了argprase包使得这一工作变得简单而规范.PS:optparse包是类似的功能,只不过写 ...

  6. 程序调试的时候利用Call Stack窗口查看函数调用信息

    http://blog.csdn.net/augusdi/article/details/6407422 http://blog.csdn.net/zhg598242449/article/detai ...

  7. 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍 一、pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主

    利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍 一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目 ...

  8. Python函数中4种参数的使用

    1.必需的参数: 必须参数须以正确的顺序传入函数,调用的数量必须和声明时的一样 def f(name,age):print('I am %s,I am %d'%(name,age))f('alex', ...

  9. 利用ida对程序的静态链接库进行处理

    用IDA进行反汇编时最怕遇到的就是跟踪到了程序静态链接的库函数中,看得一头雾水不说,还浪费了大量的时间.其实如果有符号表的话,看看函数名就知道大概功能了,再看看参数就可以pass了.本文以meterp ...

最新文章

  1. 华人斩获最佳Demo论文,Bengio获时间检验奖,最佳论文突破NLP传统测试方法 | ACL 2020...
  2. 服务器要最多能装多少个cpu,服务器主机可以装多少个cpu
  3. 我是如何使用python控制迅雷自动下载电影的?
  4. Java中的几种引用类型_Java中的几种引用类型(转载)
  5. 【深度学习篇】--神经网络中解决梯度弥散问题
  6. java arraylist 对象 删除_ArrayList实现删除重复元素(元素不是对象类型的情况)...
  7. 4x4矩阵键盘工作原理及扫描程序_AVR单片机扫描4X4矩阵键盘并数码管显示程序
  8. [c++][语言语法]函数模板和模板函数 及参数类型的运行时判断
  9. 这个网盘下载60MB/s!PanDownload复活了!
  10. c语言结果九位数,C语言实例:九位累进可除数
  11. 酷黑风个人主页+引导页源码
  12. quicksearch连接oracle,dos命令下连接oracle数据库表
  13. 微信OAUTh2.0来实现第三方授权登录
  14. 第九周 棚拍静物——让你的照片更有味道
  15. 每个系统管理员都要知道的 30 个 Linux 系统监控工具
  16. CNN卷积神经网络结构遐思
  17. java 监控系统cpu,java系统监控CPU 磁盘
  18. 【Scratch考级99图】图26-等级考试scratch绘制复杂图形旋转三角形 少儿编程 scratch画图案例教程
  19. 【推荐系统】基于协同过滤的图书推荐系统
  20. 这位年轻人,把CryptoPunks送给了无聊猿公司?B轮4个亿?

热门文章

  1. 大一计算机在线考试,大一计算机考试题(含答案).pdf
  2. ggforce|绘制区域轮廓-区域放大-寻找你的“onepiece”
  3. Nucleic Acids Research | NONCODE数据库V6版发布,涵盖全面的动植物长非编码RNA注释
  4. 易生信极高性价比暑期黑马集训 -- 低至2500每人
  5. 谈谈数次生信线下活动的收获和体会
  6. Airflow使用入门指南
  7. 1.3编程基础之算术表达式与顺序执行 01 A+B问题 (Python3实现)
  8. 1982:【19CSPJ普及组】数字游戏
  9. 1.5编程基础之循环控制 01 求平均年龄
  10. 计算机应用基础教程2015答案,《计算机应用基础教程(2015版)》_课后题答案.doc