首页
论坛
课程
招聘
[原创] IDA 7.0 IDAPython MakeStr Bug 修复
2018-7-3 22:19 7939

[原创] IDA 7.0 IDAPython MakeStr Bug 修复

2018-7-3 22:19
7939

MakeStr 在7.0版本中使用会报错,6.8版本每问题,细究原因,属于脚本二次传参错误bug,

可以

D:\IDA 7.0\python\idc_bc695.py

中,113行的

def MakeStr(ea, endea): return create_strlit(ea, 0 if (endea) == ida_idaapi.BADADDR else endea-ea)

屏蔽掉,然后修正添加如下即可

def MakeStr(ea, endea): return create_strlit(ea, endea)

最后reload下idc模块即可



强迫症,将原来的屏蔽后,在原来行修正,避免万一以后还有bug修正某某行,与国际错误行信息不对接

def MakeStr(ea, endea): return create_strlit(ea, endea)  # def MakeStr(ea, endea): return create_strlit(ea, 0 if (endea) == ida_idaapi.BADADDR else endea-ea)



Python>idc.MakeStr(0x413000,BADADDR)

Traceback (most recent call last):

File "<string>", line 1, in <module>

File "C:\IDA 7.0\python\idc_bc695.py", line 113, in MakeStr

#def MakeStr(ea, endea): return create_strlit(ea, 0 if (endea) == ida_idaapi.BADADDR else endea-ea)

File "D:\IDA 7.0\python\idc.py", line 695, in create_strlit

return ida_bytes.create_strlit(ea, 0 if endea == BADADDR else endea - ea, get_inf_attr(INF_STRTYPE))

File "D:\IDA 7.0\python\ida_bytes.py", line 1618, in create_strlit

return _ida_bytes.create_strlit(*args)

OverflowError: in method 'create_strlit', argument 2 of type 'size_t'

Python>reload(idc)

<module 'idc' from 'D:\IDA 7.0\python\idc.pyc'>

Python>idc.MakeStr(0x413000,BADADDR)

True



[公告] 2021 KCTF 春季赛 防守方征题火热进行中!

收藏
点赞0
打赏
分享
最新回复 (7)
雪    币: 12005
活跃值: 活跃值 (242)
能力值: ( LV15,RANK:2427 )
在线值:
发帖
回帖
粉丝
poyoten 活跃值 22 2018-7-3 22:43
2
0

这个问题是由于cretate_strlit这个函数在idcida_bytes中都有定义,如下代码如示,idc中的定义实际上就是调用的ida_bytes中的定义函数。

#in idc.py file
def create_strlit(ea, endea):
    """
    Create a string.

    This function creates a string (the string type is determined by the
    value of get_inf_attr(INF_STRTYPE))

    @param ea: linear address
    @param endea: ending address of the string (excluded)
        if endea == BADADDR, then length of string will be calculated
        by the kernel

    @return: 1-ok, 0-failure

    @note: The type of an existing string is returned by get_str_type()
    """
    return ida_bytes.create_strlit(ea, 0 if endea == BADADDR else endea - ea, get_inf_attr(INF_STRTYPE))


#in ida_bytes file
def create_strlit(*args):
  """
  create_strlit(start, len, strtype) -> bool
  """
  return _ida_bytes.create_strlit(*args)

而在idc_bc695.py文件中,Makestr的定义如下:

def MakeStr(ea, endea): return create_strlit(ea, 0 if (endea) == ida_idaapi.BADADDR else endea-ea)

此函数中实际调用的是idc中的create_strlit,参数并不对应。所以可以将idc_bc695.py中的Makestr函数定义修改为:

def MakeStr(ea, endea): return create_strlit(ea, endea)
#or this
def MakeStr(ea, endea): return ida_bytes.create_strlit(ea, 0 if (endea) == ida_idaapi.BADADDR else endea-ea,get_inf_attr(INF_STRTYPE))
最后于 2018-7-3 22:44 被poyoten编辑 ,原因:
雪    币: 5638
活跃值: 活跃值 (474)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
holing 活跃值 15 2018-7-3 23:08
3
0
大佬可以去pull request一波
雪    币: 6112
活跃值: 活跃值 (354)
能力值: ( LV7,RANK:112 )
在线值:
发帖
回帖
粉丝
SnowFox 活跃值 2018-7-5 21:15
4
0
刚好碰到这个问题, 没想到这里就有解决方案了, 谢谢
雪    币: 313
活跃值: 活跃值 (41)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
wx_sw 活跃值 1 2020-1-16 23:29
5
0
牛逼 不愧是po大叔
雪    币: 4710
活跃值: 活跃值 (585)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
alphc 活跃值 2020-5-3 11:19
6
0
非常感谢,帮了我大忙
雪    币: 76
活跃值: 活跃值 (148)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
EXHades 活跃值 2020-10-10 11:35
7
0
感谢,找到解决方案了
雪    币: 12
活跃值: 活跃值 (119)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
crazycars 活跃值 2021-1-11 13:54
8
0
游客
登录 | 注册 方可回帖
返回