首先打开程序进行查看
发现存在一个neg窗口
去除neg窗口
方法一
使用VBExploere把timer改为1 破解neg
根据提示框下断点进行分析
方法二
首先将内存定位到程序开始处0x401000
搜索Timer,Timer是VB程序默认的定时器变量
我们找到Timer之后 在上面的位置可以看到一个0x1B58,这个是计时器的秒数。也就是十进制的7000,7000毫秒就 是7秒。所以第一种去Neg的方法就是将0x1B58改为0x0001 但是此种方法也有一定的局限性,如果程序的作者将计时器的默认名称改掉之后 根本无法在内存中搜索到Timer关键 字 也就无法下手。下面介绍一种通用的解决方法
方法三
Virtual Basic可执行程序结构研究 对于Visual Basic5/6编译生成的程序,不管自然编译还是伪编译,其程序入口点处的结构都是一样的。来到OEP处:
指针0x4067D4指向的结构就是Virtual Basic程序的VBHeader结构,由此伸展开,整个VB程序的框架就在这了。 Virtual Basic程序框架结构
可能的Virtual Basic程序框架结构如图
TVBHeader结构定义
AGUTTable(4C的位置)结构定义
以AfkayAs.2.exe为例说明:
其对应每个字节的含义如下表
4C法实战
在程序载入到入口点之后的第一个push也就是VBHeader的位置,数据窗口跟随。
然后在数据窗口输入刚才的地址+4C,找到form GUI描述表的指针
数据窗口跟随DWORD
00 01 指的是窗体的序号 10则为第一个窗体的启动标志
所以 我们只要把第一个窗体数据块的00改成10 然后把第二个窗体的数据块的10改成00,或者将窗体的序号调换。即 可去除neg。
算法分析
第一步
和002一样获取哟弄个户名长度然后根据得到的结果算出来一个值 我这里这个值为355601
第二步
首先将刚才计算的结果转为浮点数 放入到FPU栈 然后将结果加上2.0 得到355603。逆向这个程序你并不需要 看懂每一条浮点指令,只需要单步跟踪 然后时时观察FPU栈的情况。
第三步
还是将刚才的结果转为浮点数并入栈 然后将355603乘以一个值再减去一个值 最后得到结果ST0=1066807.0000
第四步
将刚才那个值 -(-15) 到此验证结束
1066822
结果
编写注册机
脚本编写
1 |
print(((ord(s[0])+len(s)*(0x15b38))+2)*3-2+15) |
1 |
print("please input your username :") |
FROM :ol4three.com | Author:ol4three
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论