1354669803 发表于 2013-12-16 15:52

【吾爱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

waphkj 发表于 2013-12-16 16:07

表示以目前知识的确看不懂。。。 鼓励自己努力

Syer 发表于 2013-12-16 16:15

{:1_931:}格盘大大依旧这么生猛!

omi8888 发表于 2013-12-16 16:23

很牛掰的样子{:1_903:}

Lara 发表于 2013-12-16 16:57



对小白来说,

这个东东是用来注册东西的?

anuo0802 发表于 2014-2-13 06:50

页: [1]
查看完整版本: 【吾爱2013CM大赛解答】-- 2013CM无邪--另类方法过注册