sxdx1372 发表于 2018-4-25 15:56

不借用E盾任何特征码,从源头秒杀(貌似无视VMP)

本帖最后由 sxdx1372 于 2018-4-25 18:12 编辑

1、拖入DO,运行起来。
2、先定义2个标记方便描述,后面所说的在标记1、标记2下断都是在所对应的FF25函数体下断,后面不在具体说明。要是没有下面2张图的话,那就是被VM了,自己对比确定,这里不详细说明。
标记1: 标记2: 3、登录:标记2下断点击登录(有时钟检测的话自己用PCHunter移除),断下后F9运行,直到堆栈窗口顶第二行出现输入的卡号或密码停下来(返回地址是到VM区域的),堆栈顶返回地址下断F9。修改方法如下:(修改完后F8单步返回)mov eax,0x1mov esp,ebppop ebpretn
4、合法:取消标记2断点,在标记1下断F9运行1次(次数有的不同,保险期间可以在这里下个断点8B 44 24 0C 56 8B30 56(倒数第二个),经过这里的就是合法点),堆栈顶返回地址下断F9。修改方法如下:(修改完后F8单步返回)mov esp,ebppop ebpretnnop
5、算法:取消标记1断点,Ctrl+B搜索特征码55 8BEC 8B C1 40 C1 E0 02 2B E0,这个肯定是能找到的,段尾下断F9运行,直到堆栈窗口出现四个随机数信息后取消断点,F8单步返回,继续往下看。0012F198   0041AA92返回到 0041AA92 来自 0040142C0012F19C   004E3F8BASCII "登录成功运算,"0012F1A0   001CFFE8ASCII "5150"0012F1A4   004B2ED5UNICODE ","0012F1A8   001D2C30ASCII "7877"0012F1AC   004B2ED5UNICODE ","0012F1B0   001D29E8ASCII "7080"0012F1B4   004B2ED5UNICODE ","0012F1B8   001D1FE0ASCII "5828"在标记2下断F9运行11次,堆栈顶地址下断F9运行1次,可以发现寄存器中eax的值与指向的数值很相似但是不相等(更直观的说就是堆栈窗口里的一个数字字符串),此时把eax的值置0算法就这样过了。
6、暗桩:取消标记2断点,Ctrl+B搜索8B 44 24 0C 56 8B30 56(倒数第二个)段尾下断F9运行,断下后单步返回,一般2次,第1次前面已经修改过了,第2次需要修改,修改方法见下面(这2次都是合法性检测)
修改方法如下:(修改完后F8单步返回)mov esp,ebppop ebpretnnop
2次合法检测后,取消上面的断点,在标记2下断F9运行1次,堆栈顶地址下断F9运行1次,此时把寄存器中eax的值置1就过掉了暗桩。
后面还有一次合法性检测,不用管,因为前面已经修改过了,取消所有断点,这里会有一个登录成功剩余时间的eax赋值,方法是在标记2下断F9运行1次,栈顶返回地址下断F9运行,修改eax 的值就是登录成功剩余时间,单位是秒,到这里基本上都解决了,取消所有断点F9运行应该会弹出登录成功窗体,要是后面还有暗桩的话,自己摸索了(比如到期时间判断、验证返回数据、再次调用远程计算、验证频率等等),教程到此结束,此方法基本可以通杀E盾个人版,无视各种壳、VMP,貌似牛B吹的有点大,此方法的核心就是程序运行都必须经过FF25函数体,以此为突破口。
最后说一个合法性检测的通杀的特征码8B 44 24 0C 56 8B30 56(倒数第二个),只要是经过这里的,F8单步返回后,如果寄存器前3个数字都是0的话,很大可能性就是合法检测,直接mov esp,ebppop ebpretnnop
方法仅供学习和研究交流!!!有不对的地方请各位大神们指正.

sxdx1372 发表于 2018-4-25 18:24

本帖最后由 sxdx1372 于 2018-4-25 22:42 编辑

断下后F9运行次数不是绝对的,重点是看堆栈窗口的数据,自己可以编译一个源码看看,对比堆栈数据,确定正确返回点
如果时钟移除不掉的话,可以在这里下个断点8B 44 24 0C 56 8B30 56(倒数第二个)F9,查看堆栈。
从按钮事件到登录call里面有4层堆栈,我们只需要3层就可以了,也可以在第4层堆栈找返回地址修改,第4层自己可以编译源码查看。
堆栈:相同颜色内的是同一层堆栈,每层栈顶下的地址就是该CALL的返回地址
0012F414   0012F43C
0012F418   014D90A0E盾个人014D90A0   第三层CALL返回地址 (就是登录特征码CALL)
0012F41C   011E9BF8E盾个人011E9BF8
0012F420   00000001
0012F424   0012F468
0012F428   00000001
0012F42C   00000000
0012F430   00000000
0012F434   006BA1D4E盾个人006BA1D4
0012F438   00000000
0012F43C   0012F470
0012F440   01370D7AE盾个人01370D7A   第二层CALL返回地址源码里面-验证_登录()CALL
0012F444   011E9BF8E盾个人011E9BF8
0012F448   00000001
0012F44C   0012F468
0012F450   00000001
0012F454   01ECFC10
0012F458   FFFFFFFF
0012F45C   00000006
0012F460   02D99198ASCII "111111"   这里输入的卡号或密码
0012F464   00000000                           这里是输入的账号                                 
0012F468   00000000
0012F46C   00000000
0012F470   0012F4A4
0012F474   012E5B84E盾个人012E5B84       第一层CALL返回地址(按钮事件CALL的返回地址)
0012F478   01ECFC10
0012F47C   011F63F8E盾个人011F63F8
0012F480   01ECFC10
0012F484   011F63F8E盾个人011F63F8
0012F488   00000001
0012F48C   011F63F8E盾个人011F63F8
0012F490   FFFFFFFF
0012F494   0012F71C
0012F498   77D2BC90返回到 user32.77D2BC90 来自 gdi32.TextOutW
0012F49C   6B01015E
0012F4A0   005244EBE盾个人005244EB      这个地址是进按钮事件CALL的地址
0012F4A4   000007D8   这里貌似都是这个值,反正E盾是的
我们在第3层堆栈返回地址下断修改就可以了
mov eax,0x1
mov esp,ebp
pop ebp
retn

zy675527723 发表于 2018-4-25 19:43

不尊重楼主不懂感谢的人,不配来这里!!!

sxdx1372 发表于 2018-4-25 20:03

是标记1吗,我遇到过标记2被VM了,但没有看到标记1被VM的。

狐白小刺客 发表于 2018-4-25 20:24

本帖最后由 狐白小刺客 于 2018-4-25 20:31 编辑

sxdx1372 发表于 2018-4-25 20:03
是标记1吗,我遇到过标记2被VM了,但没有看到标记1被VM的。
核心库是不能被VM的vm只能vmJMP []的
一旦VM 易语言调用时间会延迟 直接出错的
我插件的基本原理也是这样的重写来分析逆向
可以通过易语言核心命令来重写程序

狐白小刺客 发表于 2018-4-25 20:33

sxdx1372 发表于 2018-4-25 20:03
是标记1吗,我遇到过标记2被VM了,但没有看到标记1被VM的。

当然 也可以自己手动来加密这段代码

hardchao 发表于 2018-4-25 21:17

感谢楼主的分析,有收获,但还是不能全吸收,没有基础真的很难,知其然不知其所以然.

sxdx1372 发表于 2018-4-25 21:37

狐白小刺客 发表于 2018-4-25 20:33
当然 也可以自己手动来加密这段代码

受教了,我刚才手动把FF25和这2个标记VM了以下,OD里看了下,确实可以被VM掉了,小白一枚刚学没多少久,多谢指正。

sxdx1372 发表于 2018-4-25 21:46

hardchao 发表于 2018-4-25 21:17
感谢楼主的分析,有收获,但还是不能全吸收,没有基础真的很难,知其然不知其所以然.

可以编译一个源码研究,关键CALL进去走一遍,多走几遍就会领悟其中的奥秘

sxdx1372 发表于 2018-4-25 22:17

如果时钟移除不掉的话,可以在这里下个断点8B 44 24 0C 56 8B30 56(倒数第二个)F9,查看堆栈。
从按钮事件到登录call里面有4层堆栈,我们只需要3层就可以了,也可以在第4层堆栈找返回地址修改,第4层自己可以编译源码查看。
堆栈:相同颜色内的是同一堆栈,每层栈顶下的地址就是该CALL的返回地址
0012F414   0012F43C
0012F418   014D90A0E盾个人?014D90A0   第三层CALL返回地址 (就是登录特征码CALL)
0012F41C   011E9BF8E盾个人?011E9BF8
0012F420   00000001
0012F424   0012F468
0012F428   00000001
0012F42C   00000000
0012F430   00000000
0012F434   006BA1D4E盾个人?006BA1D4
0012F438   00000000
0012F43C   0012F470
0012F440   01370D7AE盾个人?01370D7A   第二层CALL返回地址源码里面-验证_用户登录()CALL
0012F444   011E9BF8E盾个人?011E9BF8
0012F448   00000001
0012F44C   0012F468
0012F450   00000001
0012F454   01ECFC10
0012F458   FFFFFFFF
0012F45C   00000006
0012F460   02D99198ASCII "111111"←←←←这里输入的卡号或密码
0012F464   00000000   ←←←←←←←←←←←这里是输入的账号                                 
0012F468   00000000
0012F46C   00000000
0012F470   0012F4A4
0012F474   012E5B84E盾个人?012E5B84       第一层CALL返回地址(按钮事件CALL的返回地址)
0012F478   01ECFC10
0012F47C   011F63F8E盾个人?011F63F8
0012F480   01ECFC10
0012F484   011F63F8E盾个人?011F63F8
0012F488   00000001
0012F48C   011F63F8E盾个人?011F63F8
0012F490   FFFFFFFF
0012F494   0012F71C
0012F498   77D2BC90返回到 user32.77D2BC90 来自 gdi32.TextOutW
0012F49C   6B01015E
0012F4A0   005244EBE盾个人?005244EB      这个地址是进按钮事件CALL的地址
0012F4A4   000007D8←←←←←←←←←    这里貌似都是这个值,反正E盾是的
我们在第3层堆栈返回地址下断修改就可以了
mov eax,0x1
mov esp,ebp
pop ebp
retn
页: [1] 2 3 4 5
查看完整版本: 不借用E盾任何特征码,从源头秒杀(貌似无视VMP)