不借用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 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
不尊重楼主不懂感谢的人,不配来这里!!! 是标记1吗,我遇到过标记2被VM了,但没有看到标记1被VM的。 本帖最后由 狐白小刺客 于 2018-4-25 20:31 编辑
sxdx1372 发表于 2018-4-25 20:03
是标记1吗,我遇到过标记2被VM了,但没有看到标记1被VM的。
核心库是不能被VM的vm只能vmJMP []的
一旦VM 易语言调用时间会延迟 直接出错的
我插件的基本原理也是这样的重写来分析逆向
可以通过易语言核心命令来重写程序
sxdx1372 发表于 2018-4-25 20:03
是标记1吗,我遇到过标记2被VM了,但没有看到标记1被VM的。
当然 也可以自己手动来加密这段代码 感谢楼主的分析,有收获,但还是不能全吸收,没有基础真的很难,知其然不知其所以然. 狐白小刺客 发表于 2018-4-25 20:33
当然 也可以自己手动来加密这段代码
受教了,我刚才手动把FF25和这2个标记VM了以下,OD里看了下,确实可以被VM掉了,小白一枚刚学没多少久,多谢指正。 hardchao 发表于 2018-4-25 21:17
感谢楼主的分析,有收获,但还是不能全吸收,没有基础真的很难,知其然不知其所以然.
可以编译一个源码研究,关键CALL进去走一遍,多走几遍就会领悟其中的奥秘 如果时钟移除不掉的话,可以在这里下个断点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