鼠标打字 高级版iii 之 内存注册机
本帖最后由 PYG官方论坛 于 2019-11-17 15:54 编辑昨天将话题抛到官方群里,引起不少群友的关注,其中扫地僧xxxxxx给出了明码比较点,和keygen代码。顺便还指出了 wtt.dll 的妙用。
这里先把内存注册机相关的资料进行整理。
方法一:OD 动态调试
xxxxxx 给出的动态调试方案:
OD载入,在 0x44f36e 内存设置内存访问断点:
(该方案可能和调试器或平台有关,本机测试环境为x64, x86平台可以测试这两个地址:0044986 或 0044A3E3)
运行,中断后观察堆栈,我们知道p-code就是堆栈机,所以一些关键数据难免存留与栈中:
为什么是这个地址呢? 0x44f36e, 我们用 VB Decompiler 打开程序找到该指令处:
在弹框上方处,程序自己算出了真码 。。。(VB Decompiler 11.x 真是香啊,谁那有可否分享一份)
方法二:Baymax 制作内存注册机
Rooking 版主在群里也给了一种制作内存注册机的方案:
在 oleaut32.dll 模块的 VarBstrCat 的函数返回处下断点,大约中断二十几次,观察堆栈,当 ESI =0044DEDF 时,堆栈 即为真码:
我们看一下内存注册机的设置。
1. 首先干掉程序启动的时间限制,先添加一个特征码替换补丁条目:
F4 1F F4 05 F3 DC 07 ==> F4 1F F4 05 F3 33 08
2. 添加内存注册机条目:
方案一:
76970D12 >8BFF MOV EDI, EDI // VarBstrCat 函数入口地址
... ...
76970D67 C2 0C00 RETN 0C // VarBstrCat 函数返回地址
在 oleaut32.dll 模块的 VarBstrCat 的函数偏移 0x55 处设置断点(retn指令),堆栈即为真码,记得设置条件断点 ESI == 0044DEDF。
由于该函数的返回地址,可能因版本不同而偏移值不同,故方法可能不通用。
方案二(通用方案):
在函数返回地址 retn 看到真码后,F8单步一次:
在函数返回处设置断点(这里就避免去计算函数返回地址的偏移量了),添加内存注册机条目,保存UNICODE字符串。
设置条件断点数据:ESI==0044DEDF
再添加一条条件断点,展示截获的内存数据(条件断点同上):
创建劫持补丁,由于 Baymax 未提供针对VB的劫持dll, 需要自己来实现劫持dll
借用rooking版主提供的 sxs.dll 劫持dll来加载PYG.DLL , 效果如下,
BTW:注册信息保存在这里,注册后可以删掉接着玩
HKEY_CURRENT_USER\Software\VB and VBA Program Settings\MyApp\Startup
吼吼吼 不知道第三篇是不是就该是Keygen啦 {:lol:} 膜拜各种姿势都会的老司机! 这个好像对 一些不懂打字人的挺有用的,了解 一下了 謝謝大牛的進一步解釋好好學習了 大婶们热情洋溢,膜拜。 感谢!造福有需要的人 {:biggrin:}很好,已收藏学习。谢谢分享。 感谢!造福有需要的人 膜拜各位大表哥,收藏学习了,感谢分享