我曾经在一个二进制文件下面的结构输出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对象中,但是是上面的代码。任何指针结构虽然没有读入容易。
是的结构是正确的。我正在使用版本1.01。 v1.2仅在beta版中。我可以在下周发布一个恢复示例文件。如果文件直接使用数组,我只需使用c_char_p类型或c_char * sizeof(array)? – RG5
谢谢你试图帮助我。我认为我的问题是我不熟悉尝试将这种类型的数据读入python对象。我使用readinto函数将整个结构复制到上面定义的RestoreStruct对象中。如果您使用恢复文件运行上面的代码,我会得到您正在讨论的值,但我仍然不确定如何解析argv数组。 ms_running正在更新,我只是没有在上面的代码中打印出来。我会编辑以反映这个价值。 – RG5
谢谢,我会放弃。当我提出解决方案时,我会发布一个工作版本。我同意缺乏文件。 – RG5