PYG官方论坛 发表于 2019-11-17 15:08:25

鼠标打字 高级版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



Rooking 发表于 2019-11-17 15:46:35

吼吼吼 不知道第三篇是不是就该是Keygen啦 {:lol:}

smallhorse 发表于 2019-11-17 15:48:19

膜拜各种姿势都会的老司机!

freedomw10 发表于 2019-11-17 16:50:59

这个好像对 一些不懂打字人的挺有用的,了解 一下了

雲裏霧裏 发表于 2019-11-17 18:06:03

謝謝大牛的進一步解釋好好學習了

飞天 发表于 2019-11-17 20:18:35

大婶们热情洋溢,膜拜。

shsjhm 发表于 2019-11-17 20:19:52

感谢!造福有需要的人

Arsage 发表于 2019-11-17 20:34:48

{:biggrin:}很好,已收藏学习。谢谢分享。

senlly 发表于 2019-11-18 05:10:58

感谢!造福有需要的人

非诚勿扰 发表于 2019-11-18 08:23:20

膜拜各位大表哥,收藏学习了,感谢分享
页: [1] 2 3 4
查看完整版本: 鼠标打字 高级版iii 之 内存注册机