0

api = 'interesting'有人可以提供一个示例,说明如何在 python 中循环这个对象并在哪里和拉出“值”arguments.name = 'FileName'吗?

这是我到目前为止所拥有的。
这个对象有更多的进程和调用......输出已被省略。

编辑:我应该提到运行此代码时出现以下错误:“TypeError:列表索引必须是整数,而不是 str”

for k, v in object['behavior']['processes']['calls'].items():
            if v['api'] == "interesting":
                           <loop through arguments next>

目的:

{"behavior": {
    "processes": [
        {
        "parent_id": "312", 
        "process_name": "test.exe", 
        "process_id": "1184", 
        "first_seen": "2013-03-02 17:22:48,359", 
        "calls": [
            {
            "category": "filesystem", 
            "status": "FAILURE", 
            "return": "0xc000003a", 
            "timestamp": "2013-03-02 17:22:48,519", 
            "thread_id": "364", 
            "repeated": 0, 
            "api": "interesting", 
            "arguments": [
                {
                "name": "FileHandle", 
                "value": "0x00000000"
                }, 
                {
                "name": "DesiredAccess", 
                "value": "0x80100080"
                }, 
                {
                "name": "FileName", 
                "value": "c:\\cgvi5r6i\\vgdgfd.72g"
                }, ...
4

3 回答 3

1

你在做什么看起来不错,但是

  1. 您的索引已关闭(仔细查看有列表
  2. 您的支票似乎无效(v是一个字符串,因此v['api']无效)。

因此,请尝试这样做,(我已将您的对象视为i

for k, v in i['behavior']['processes'][0]['calls'][0].items():
    if k == 'api' and v == "interesting":
        print k,v

或者

for dct in i['behavior']['processes'][0]['calls']:
    if dct['api'] == "interesting":
        print 'api',dct['api']

或者

for dct in i['behavior']['processes'][0]['calls']:
    for k,v in dct.items():
        if k == 'api' and  v =="interesting":
            print 'api',dct['api']

或者,如果每个列表有多个部分,

for proc in i['behavior']['processes']:
    for call in proc['calls']:
        print 'api =>',call['api'] # a if here
        for args in call['arguments']:
            print '   argument.name =>',args['name'] # and another if here should do the trick.

为什么会出现错误
试试下面的代码,你就会明白你做错了什么

print type(i['behavior']['processes'])
print type(i['behavior']['processes'][0])
print type(i['behavior']['processes'][0]['calls'])
print type(i['behavior']['processes'][0]['calls'][0])
于 2013-03-11T03:12:07.953 回答
1

您在问题中作为初学者给出的内容将不起作用,因为您没有遍历列表中的元素,这些元素分别是键"processes"和的值"calls"。也就是说,您将需要更多类似的东西

for proc in object ['processes']:
    for call in proc ['calls']:
        if call ['api'] == "interesting":
            fname = None
            for arg in call ['arguments']:
                if arg ['name'] == "FileName":
                    fname = arg ['value']

然后您要查找的文件名将位于fname. 这没有错误检查,因为我不知道您的数据来自哪里。

于 2013-03-11T03:14:28.523 回答
0
object['behavior']['processes']['calls']

是一个列表,而不是字典。

于 2013-03-11T03:13:28.267 回答