【吾爱2013CM大赛解答】-- 2013CM无邪--另类方法过注册
本帖最后由 1354669803 于 2013-12-16 15:58 编辑【文章标题】: 【吾爱2013CM大赛解答】-- 2013CM无邪--另类方法过注册
【文章作者】: Kelly
【下载地址】: http://www.52pojie.cn/thread-228707-1-1.html
【加壳方式】: 无
【编写语言】: E语言
【使用工具】: OD
【操作平台】: XP sp3
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
今天刚看到这个程序 听说是易语言的 所以就来看看 看到两位大神的方法 一个是利用GetWindowTextA 另外一个是追码
所以我想到两个方法过注册 一种是超级简单的方法 另外一种是赋值法
首先我就来说说赋值的方法 这个方法适用于反复比较反复调用同一地址的验证(我也解释不清楚 能理解多少就看大家
首先我们到达验证段
004010A1 55 push ebp ----F2断点
00401106 /74 09 je X2013CM_?00401111 ----当我们F8走到这 je未跳转
00401108 |53 push ebx
00401109 |E8 C0080000 call 2013CM_?004019CE ----经过了这个call
0040110E |83C4 04 add esp,0x4
00401111 \8B5D FC mov ebx,dword ptr ss:
00401114 85DB test ebx,ebx
00401116 74 09 je X2013CM_?00401121 ----走到这 je仍然没有跳转
00401118 53 push ebx
00401119 E8 B0080000 call 2013CM_?004019CE -----经过了这个call
0040111E 83C4 04 add esp,0x4
00401121 837D F4 00 cmp dword ptr ss:,0x0 ----F8走到这里 发现此时ebp-C的值为0
00401125 0F84 88000000 je 2013CM_?004011B3 ----这里就跳了(我们先把这个je修改为NOP)
00401187 /74 09 je X2013CM_?00401192 ----F8单步走到这里 je不跳
00401189 |53 push ebx
0040118A |E8 3F080000 call 2013CM_?004019CE ----经过这个call
0040118F |83C4 04 add esp,0x4
00401192 \8B5D F0 mov ebx,dword ptr ss:
00401195 85DB test ebx,ebx
00401197 74 09 je X2013CM_?004011A2 ----F8单步走到这里 je不跳
00401199 53 push ebx
0040119A E8 2F080000 call 2013CM_?004019CE
0040119F 83C4 04 add esp,0x4
004011A2 837D E8 00 cmp dword ptr ss:,0x0 ----F8单步走到这里 此时ebp-18的值为0
004011A6 0F84 07000000 je 2013CM_?004011B3 ----je跳了(如果不跳 则eax=1 004011B7的je不跳)
004011AC B8 01000000 mov eax,0x1
004011B1 EB 02 jmp X2013CM_?004011B5
004011B3 33C0 xor eax,eax ----如果00401125的je和004011A6的je跳 则走到这时eax=0 则下面的je就跳
004011B5 85C0 test eax,eax
004011B7 0F84 82050000 je 2013CM_?0040173F ----如果跳 则走向错误
这只是其中一段代码 我们继续向下面看 会发现有很多类似的判断
00401217 85DB test ebx,ebx
00401219 74 09 je X2013CM_?00401224
0040121B 53 push ebx
0040121C E8 AD070000 call 2013CM_?004019CE
00401221 83C4 04 add esp,0x4
00401224 8B5D FC mov ebx,dword ptr ss:
00401227 85DB test ebx,ebx
00401229 74 09 je X2013CM_?00401234
0040122B 53 push ebx
0040122C E8 9D070000 call 2013CM_?004019CE
00401231 83C4 04 add esp,0x4
00401234 837D F4 00 cmp dword ptr ss:,0x0
00401238 0F84 88000000 je 2013CM_?004012C6 ----这个跳下去就到了004012C6
00401298 85DB test ebx,ebx
0040129A 74 09 je X2013CM_?004012A5
0040129C 53 push ebx
0040129D E8 2C070000 call 2013CM_?004019CE
004012A2 83C4 04 add esp,0x4
004012A5 8B5D F0 mov ebx,dword ptr ss:
004012A8 85DB test ebx,ebx
004012AA 74 09 je X2013CM_?004012B5
004012AC 53 push ebx
004012AD E8 1C070000 call 2013CM_?004019CE
004012B2 83C4 04 add esp,0x4
004012B5 837D E8 00 cmp dword ptr ss:,0x0
004012B9 0F84 07000000 je 2013CM_?004012C6 ----这里的判断
004012BF B8 01000000 mov eax,0x1
004012C4 EB 02 jmp X2013CM_?004012C8
004012C6 33C0 xor eax,eax ----到了这里 下面的je就跳了 所以注册错误
004012C8 85C0 test eax,eax
004012CA 0F84 6A040000 je 2013CM_?0040173A ----这里是我第二段分析的那个
下面还有很多类似的代码 我这里就不一一分析了
那我这里就来给大家理顺一下思路
首先一个cmp X 决定A是不是会跳
如果A跳 则xor eax,eax 影响B
如果B跳 则注册错误
如果A不跳 则另外一个cmp Y Y影响C
如果C跳 则xor eax,eax 即和A的作用是一样的 都是报错
如果C不跳 则mov eax,1 B则不跳 继续执行下一段 下一段的代码和本段代码一样的结构
所以无论A和C跳和不跳 B都是起关键作用 只有B不跳 才是问题的关键
如此这样循环判断 如果有任何一个环节错误 则注册失败
假如说这样的判断有1个或者2个 则我们可以修改B 就能成功 如果这样的判断有大量 比如说10个 100个 我们就要考虑是不
是有必要全部去修改B了 当然 也许可以通过写程序 锁定B的特征码 定位B的地址 用程序进行修改 那么就简单多了
如果我们不会的写这样的程序的话 那我们就要锁定关键了 就是看影响那两个A和C的cmp
影响A: cmp dword ptr ss:,0x0
影响C:cmp dword ptr ss:,0x0
大家也可以往下面看 下面的判断 都是围绕着这两句代码进行的
所以下面的判断结构都是相似的 起决定作用的 就是这两句
在前面的代码分析中 我已经说过了 这两句代码中的ebp-C和ebp-18的值都是0 所以je才会跳
如果ebp-C和ebp-18的值不为0 为1或者是为2 则je不跳 也就是说其他的判断都不会跳了
关键就是修改ebp-C和ebp-18的值 我们往上找 看看这两句代码上面有没有经过相同的地方
00401217 85DB test ebx,ebx
00401219 74 09 je X2013CM_?00401224 ----不跳
0040121B 53 push ebx
0040121C E8 AD070000 call 2013CM_?004019CE ----这里
00401221 83C4 04 add esp,0x4
00401224 8B5D FC mov ebx,dword ptr ss:
00401227 85DB test ebx,ebx
00401229 74 09 je X2013CM_?00401234 ----不跳
0040122B 53 push ebx
0040122C E8 9D070000 call 2013CM_?004019CE ----这里
00401231 83C4 04 add esp,0x4
00401234 837D F4 00 cmp dword ptr ss:,0x0 第一个ebp-C
00401238 0F84 88000000 je 2013CM_?004012C6
00401298 85DB test ebx,ebx
0040129A 74 09 je X2013CM_?004012A5 ----不跳
0040129C 53 push ebx
0040129D E8 2C070000 call 2013CM_?004019CE ----这里
004012A2 83C4 04 add esp,0x4
004012A5 8B5D F0 mov ebx,dword ptr ss:
004012A8 85DB test ebx,ebx
004012AA 74 09 je X2013CM_?004012B5 ----不跳
004012AC 53 push ebx
004012AD E8 1C070000 call 2013CM_?004019CE ----这里
004012B2 83C4 04 add esp,0x4
004012B5 837D E8 00 cmp dword ptr ss:,0x0 第一个ebp-18
004012B9 0F84 07000000 je 2013CM_?004012C6
004012BF B8 01000000 mov eax,0x1
004012C4 EB 02 jmp X2013CM_?004012C8
004012C6 33C0 xor eax,eax
004012C8 85C0 test eax,eax
004012CA 0F84 6A040000 je 2013CM_?0040173A ----A和C影响的B
综上 我们发现了ebp-C和ebp-18 上面都有一个相同的地方 即call 004019CE 这里就是我要修改的地方
如果我们在这里面 给ebp-C和ebp-18赋值 就能达到修改所有跳的效果
PS(这里要说明的是 如果其他非判断的地方调用到了这里 可能会出现别的错误 因为这个call里面是E原体 程序的核心)
假如说这个地方 调用这个call里面 验证其值 决定了是否退出 原本程序调用这里 是可以退出 但是一旦被修改了 得出来
的确实不退出 那就不好玩了 所以我们一般建议 就是不要去修改E原体 我这里也算冒险一次吧 轻则程序错误 重则程序卡
死 导致电脑死机的情况也不是不可能 嘿嘿...
回归正题:直接进去这个call 到达004019CE /FF25 3CAB4600 jmp dword ptr ds:
然后再进去 就到了这里
0041AA90 55 push ebp 我们直接修改这里吧 把两个值改掉
0041AA91 8BEC mov ebp,esp
0041AA93 837D 08 00 cmp dword ptr ss:,0x0
0041AA97 74 25 je X2013CM_?0041AABE
0041AA99 8B45 08 mov eax,dword ptr ss:
0041AA9C 50 push eax
0041AA9D B9 80424900 mov ecx,2013CM_?00494280 ; 晕F
0041AAA2 E8 19A6FFFF call 2013CM_?004150C0
0041AAA7 85C0 test eax,eax
0041AAA9 75 13 jnz X2013CM_?0041AABE
0041AAAB 8B4D 08 mov ecx,dword ptr ss:
0041AAAE 51 push ecx
0041AAAF 6A 00 push 0x0
0041AAB1 8B15 98464900 mov edx,dword ptr ds:
0041AAB7 52 push edx
0041AAB8 FF15 84924600 call dword ptr ds:[<&KERNEL32.HeapFree>] ; ntdll.RtlFreeHeap
0041AABE 5D pop ebp
0041AABF C3 retn
0041AA90 C745 F4 0100000>mov dword ptr ss:,0x1 修改为1 或者2 只要不是0
0041AA97 C745 E8 0100000>mov dword ptr ss:,0x1 同样的修改
0041AA9E C3 retn 修改完了以后记得retn返回
0041AA9F 90 nop 不然下面的代码也会执行 防止错误
0041AAA0 90 nop
0041AAA1 90 nop
0041AAA2 E8 19A6FFFF call 2013CM_?004150C0
0041AAA7 85C0 test eax,eax
0041AAA9 75 13 jnz X2013CM_?0041AABE
0041AAAB 8B4D 08 mov ecx,dword ptr ss:
0041AAAE 51 push ecx
0041AAAF 6A 00 push 0x0
0041AAB1 8B15 98464900 mov edx,dword ptr ds:
0041AAB7 52 push edx
0041AAB8 FF15 84924600 call dword ptr ds:[<&KERNEL32.HeapFree>] ; ntdll.RtlFreeHeap
0041AABE 5D pop ebp
0041AABF C3 retn
修改完了以后 不要太激动了 我们还要排除其他错误 因为这样修改 除了会影响我们需要修改的地方 别的地方也可能会
导致错误 所以我们现在要排除错误
004016F6 /74 09 je X2013CM_?00401701
004016F8 |53 push ebx
004016F9 |E8 D0020000 call 2013CM_?004019CE
004016FE |83C4 04 add esp,0x4
00401701 \837D E8 00 cmp dword ptr ss:,0x0
00401705 0F84 07000000 je 2013CM_?00401712
0040170B B8 01000000 mov eax,0x1
00401710 EB 02 jmp X2013CM_?00401714
00401712 33C0 xor eax,eax
00401714 85C0 test eax,eax
00401716 0F84 0A000000 je 2013CM_?00401726 ----F8一直单步到这里(值我们已经修改完毕了)
0040171C E8 27000000 call 2013CM_?00401748 上面的je没有跳 所以到了这里 我们F7跟进
00401721 E9 05000000 jmp 2013CM_?0040172B F7跟进以后 把所有call 004019CE 全部用NOP填充
00401726 E8 2B010000 call 2013CM_?00401856 出来以后就到了这里 这些call都是错误call
0040172B E8 26010000 call 2013CM_?00401856 里面也会调用到call 004019CE
00401730 E8 21010000 call 2013CM_?00401856 这些call基本上没用 全部NOP掉
00401735 E8 1C010000 call 2013CM_?00401856
0040173A E8 17010000 call 2013CM_?00401856
0040173F E8 12010000 call 2013CM_?00401856 从00401726到0040173F 这几行全部NOP
00401744 8BE5 mov esp,ebp
00401746 5D pop ebp
00401747 C3 retn
至此 保存一份 重新运行 这样就没问题了 嘿嘿 搞定(在此之前 我因为没有NOP掉那些call 程序总是卡死 或者退出)
方法二:我以前说过一种方法 就是无视验证 直接跳成功 我们已经知道了
00401716 /0F84 0A000000 je 2013CM_?00401726
0040171C |E8 27000000 call 2013CM_?00401748 这个call才是正确的 所以我们直接这样修改
00401721 |E9 05000000 jmp 2013CM_?0040172B
00401726 \E8 2B010000 call 2013CM_?00401856
0040172B E8 26010000 call 2013CM_?00401856
00401730 E8 21010000 call 2013CM_?00401856
00401735 E8 1C010000 call 2013CM_?00401856
0040173A E8 17010000 call 2013CM_?00401856
0040173F E8 12010000 call 2013CM_?00401856
004010A1 55 push ebp这里是验证段的段首 找个地方jmp 0040171C 或者call 0040171C
我是这样修改的00401119 E8 B0080000 call 2013CM_?004019CE 修改为 00401119 E8 FE050000 call 2013CM_?0040171C
--------------------------------------------------------------------------------
【版权声明】: 本文原创于Kelly, 转载请注明作者并保持文章的完整, 谢谢!
2013年12月16日 下午 03:49:59
表示以目前知识的确看不懂。。。 鼓励自己努力 {:1_931:}格盘大大依旧这么生猛! 很牛掰的样子{:1_903:}
对小白来说,
这个东东是用来注册东西的?
页:
[1]