赞
踩
原先想要获取vx的sessionid,一般都是通过注入dll的方式来实现,所以一般使用c++或者易语言编译dll的方式实现,但是这样的方式使用前还需要注入dll,容易检测出,而且编写调试过程相对麻烦,所以打算用python这个解释型语言尝试。
获取sessionid需要调用相应的call,寻找call的过程就不过多叙述,这里只解释如何使用python调用这些call,主要使用的库是win32api,ctypes,keystone,其中只有keystone是第三方库,它能将汇编代码转换成机器码,然后通过win32api与ctypes将机器码写入vx的内存中,再通过远程线程调用的方式执行即可。
可以看到,当我们点击打开小程序的时候,程序执行完图中的两个call之后,内存窗口就出现sessionid的数据,(由于某些敏感原因,不方便放出其它dbg信息,想要交流的可以QQ:3122142139)
因为python无法直接将汇编代码写入内存,所以需要转换成机器码,keystone是第三方库,可以使用pip安装,他可以将汇编代码以字符串的形式转换成列表形式的机器码。上图中的汇编转换如下,偏移需要自己计算;
asm = '''
pushad
call 0x3B310A0
call 0x3D46BD0
popad
ret
'''
ks = Ks(KS_ARCH_X86, KS_MODE_32)
machine_code, _ = ks.asm(asm) # machine_code就是得到的机器码
python想要读取其他进程的内存数据,需要加载kernel32.dll,并导出内部的函数,如果有windows编程基础的就知道,我们用到的函数主要是VirtualAllocEx,WriteProcessMemory,CreateRemoteThread,ReadProcessMemory,VirtualFreeEx,流程如下:
1.VirtualAllocEx:开辟内存空间
2.WriteProcessMemory:写入机器码
3.CreateRemoteThread:远程线程调用call
4.ReadProcessMemory:读取sessionid数据
5.VirtualFreeEx:释放内存空间
# 加载kernel32.dll kernel32 = ctypes.windll.LoadLibrary("kernel32.dll") # 打开进程 handle = win32api.OpenProcess(PROCESS_ALL_ACCESS, False, pid) # 开辟内存空间 poind = kernel32.VirtualAllocEx(int(handle), None, 100, MEM_COMMIT, PAGE_EXECUTE_READWRITE) # 写入机器码 byte_code = (c_char * len(machine_code))() for i, v in enumerate(machine_code): byte_code[i] = v kernel32.WriteProcessMemory(int(handle), poind, byte_code, len(machine_code), None) # 执行 kernel32.CreateRemoteThread(int(handle), None, 0, poind, 0, 0, None) # 读取sessionid kernel32.ReadProcessMemory(int(handle), SessionAdd, byref(Psessionid), 4, None) # 释放内存 kernel32.VirtualFreeEx(int(handle), poind, None, MEM_RELEASE) # 关闭句柄 kernel32.CloseHandle(int(handle))
上述代码中传入pid之后,就能调用相应的call生成sessionid,并直接拿到sessionid,这样做的好处在于不需要进行编译,也不需要注入dll,并且由于是通过远程线程调用的方式,开辟的内存空间最后也会释放,所以相对稳定
sessionid的作用相信能看到大家都知道,下一篇我讲介绍如何通过sessionid直接获取小程序支付的链接,使用纯python实现,不需要注入。
最后想要交流学习的可以QQ:3122142139
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。