2014-04-11 36 views
2

我曾经在一个二进制文件下面的结构输出hashcat恢复文件:访问ctypes的**从二进制文件的argv通过Python的

typedef struct 
{ 
    uint32_t version_bin; 
    char  cwd[256]; 
    uint32_t argc; 
    char  **argv; 
    uint32_t pid; 

    uint32_t devices_cnt; 

    uint32_t dictpos; 
    uint32_t maskpos; 

    uint64_t *pw_off; 
    uint64_t *pw_num; 
    uint64_t pw_cur; 

    uint32_t digests_cnt; 
    uint32_t digests_done; 
    uint  *digests_shown; 

    uint32_t salts_cnt; 
    uint32_t salts_done; 
    uint  *salts_shown; 

    float  ms_running; 

} restore_data_t; 

我试图导入原始数据,并用它解析使用ctypes的数据结构如下Python脚本:

class RestoreStruct(Structure): 

    _fields_ = [ 
     ("version_bin", c_uint32), 
     ("cwd", c_char*256), 
     ("argc", c_uint32), 
     ("argv", POINTER(POINTER(c_char))), 
     ("pid", c_uint32), 
     ("devices_cnt", c_uint32), 
     ("dictpos", c_uint32), 
     ("maskpos", c_uint32), 
     ("pw_off", POINTER(c_uint64)), 
     ("pw_NUM", POINTER(c_uint64)), 
     ("pw_CUR", c_uint64), 
     ("digests_cnt", c_uint32), 
     ("digests_done", c_uint32), 
     ("digests_shown", POINTER(c_uint32)), 
     ("salts_cnt", c_uint32), 
     ("salts_done", c_uint32), 
     ("salts_shown", POINTER(c_uint*30)),  
     ("ms_running", c_float) 

     ] 

with open("cudaHashcat.restore", "rb") as restore_file: 

    status = [] 
    struct = RestoreStruct() 
    while restore_file.readinto(struct) == sizeof(struct): 
     status.append((struct.version_bin, struct.cwd, struct.argc, struct.argv, \ 
        struct.pid, struct.devices_cnt, struct.dictpos, struct.maskpos, struct.pw_off, \ 
        struct.pw_NUM, struct.pw_CUR, struct.digests_cnt, struct.digests_done, struct.digests_shown, \ 
        struct.salts_cnt, struct.salts_done, struct.salts_shown, struct.ms_running)) 



    print struct._fields_[0][0], status[0][0] 
    print struct._fields_[1][0], status[0][1] 
    print struct._fields_[2][0], status[0][2] 
    print struct._fields_[3][0], status[0][3] 
    print struct._fields_[4][0], status[0][4] 
    print struct._fields_[5][0], status[0][5] 
    print struct._fields_[6][0], status[0][6] 
    print struct._fields_[7][0], status[0][7] 
    print struct._fields_[8][0], status[0][8] 
    print struct._fields_[9][0], status[0][9] 
    print struct._fields_[10][0], status[0][10] 
    print struct._fields_[11][0], status[0][11] 
    print struct._fields_[12][0], status[0][12] 
    print struct._fields_[13][0], status[0][13] 
    print struct._fields_[14][0], status[0][14] 
    print struct._fields_[15][0], status[0][15] 
    print struct._fields_[16][0], status[0][16] 
    print struct._fields_[17][0], status[0][17] 

我遇到这个问题是如何访问指针ctypes的(argv的,pw_off等)的数据?我试过“内容”,但我得到“NULL指针访问”错误。 argv应该是char数组的数组,而其他的应该是一个简单的指向int的指针。

我将如何访问指针正在寻址的实际数据?我完全不了解我如何去做这件事?

这里是恢复文件的base64编码的版本:

ZQAAAEU6XG9jbEhhc2hjYXQtMS4wMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAACBdvAHwiAAABAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAABACgBAAAAAA8AAAAFAAAAAAAAAAEAAAAAAAAAAAAAAEDPnkYAAAAAY3VkYUhh c2hjYXQzMgotbQoxMDAwCi1hCjAKLXIKcnVsZXNccmljaF9wd19ydWxlcy5ydWxlCi4uXHBsYWlu X3RleHRfaGFzaC50eHQKLi5cMTZfV2Fsa19taW4udHh0Cv // JwEAAAAAAAAIAAAAAAAAAAAAAQAA AAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

正如它看起来像argv的值存储在文件中以纯文本在评论中指出。我的问题仍然是如何正确读取这些信息到结构中。恢复结构中的所有其他值都被读入并正确存储在python对象中,但是是上面的代码。任何指针结构虽然没有读入容易。

+0

是的结构是正确的。我正在使用版本1.01。 v1.2仅在beta版中。我可以在下周发布一个恢复示例文件。如果文件直接使用数组,我只需使用c_char_p类型或c_char * sizeof(array)? – RG5

+0

谢谢你试图帮助我。我认为我的问题是我不熟悉尝试将这种类型的数据读入python对象。我使用readinto函数将整个结构复制到上面定义的RestoreStruct对象中。如果您使用恢复文件运行上面的代码,我会得到您正在讨论的值,但我仍然不确定如何解析argv数组。 ms_running正在更新,我只是没有在上面的代码中打印出来。我会编辑以反映这个价值。 – RG5

+0

谢谢,我会放弃。当我提出解决方案时,我会发布一个工作版本。我同意缺乏文件。 – RG5

回答

1

在这里接受eryksun的建议我做了什么来获得argv值。

class RestoreStruct(Structure): 

    _fields_ = [ 
     ("version_bin", c_uint32), 
     ("cwd", c_char*256), 
     ("argc", c_uint32), 
     ("argv", POINTER(POINTER(c_char))), 
     ("pid", c_uint32), 
     ("devices_cnt", c_uint32), 
     ("dictpos", c_uint32), 
     ("maskpos", c_uint32), 
     ("pw_off", POINTER(c_uint64)), 
     ("pw_NUM", POINTER(c_uint64)), 
     ("pw_CUR", c_uint64), 
     ("digests_cnt", c_uint32), 
     ("digests_done", c_uint32), 
     ("digests_shown", POINTER(c_uint32)), 
     ("salts_cnt", c_uint32), 
     ("salts_done", c_uint32), 
     ("salts_shown", POINTER(c_uint*30)),  
     ("ms_running", c_float) 

     ] 

with open("cudaHashcat.restore", "rb") as restore_file: 

    status = [] 
    struct = RestoreStruct() 
    restore_file.readinto(struct) 
    rest = restore_file.read() 

    print struct.version_bin 
    # Print rest of variables that are not pointers 

    print rest.splitlines()[0:struct.argc] # Prints a list structure of argv values