jjnetcn

Results 4 comments of jjnetcn

增加64位地址取值函数, 64位下调用 GetWeChatKey64,而不是调用GetWeChatKey func GetWeChatKey64(process windows.Handle, offset uintptr) (string, error) { var buffer = make([]byte, 8) err := windows.ReadProcessMemory(process, offset, &buffer[0], 8, nil) if err != nil { return "",...

具体的4处修改:修改ARCHamd64, 下载64位的库否则gcc会提示二进制不兼容,修改间接根据地址取key的函数以及调用者,同时增加了最新版本的几个偏移参数,试着编译了一下, 在最新的3.9.5.81可以用, 这几个地址是没有问题的,当然只是试了下show_info功能, 没有去看其他功能。 另外,编译出的64位pe, 在遍历32位wechat进程的模块时候,也遍历不到WeChatWin.dll(没有报错,但是列出的模块异常少就结束了,另外我自己本地改过标准if (Module32First) { do {..} while( Module32Next)}这种标准框架,不清楚只是调用module32next是不是有问题或者兼容性如何), 而32位的程序去遍历64位的wechat直接报了299错误。 也就是说: 32位的wechat必须用32位的程序才能找到模块,64位亦然。所以结论可能需要编译两个版本, 一个32位的针对32位的wechat,一个针对64位的。 对go语言不熟, 一边问chatgpt一边试着改的,代码质量不高, 就不提pr了

补充一下: 根据查阅资料, PsApi系列的enumProcessModules,以及kernel系列的Module32First/Module32Next 确实只能枚举跟自身位数相同的进程的模块, 即要遍历32位进程需要把程序编译成32位模式,反之亦然。 但是PsApi系列还有一个函数enumProcessModulesEx , 可以通过设置flags来枚举32,64或者两者的exe的模块,也就是用这个api替换掉就可以只编译成32位程序, 唯一需要的就是在读间接地址key的时候需要判断exe的版本来决定地址读4个字节还是8个字节。 晚上我回家试试,看能不能编一个通用的版本

32位程序用常规方法无法列举出64位模块, 已提交了个pr, 采用wow64ex库, 临时切换到64位模式下调用64位系统调用来实现, 做了下实验,在32位微信和最新的64位微信上都能获取了,因该问题不大了