吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 3318|回复: 20

[原创逆向图文] 一个简单cm的分析

  [复制链接]
rain灿 发表于 2014-10-12 18:16 | 显示全部楼层 |阅读模式

今天。风清扬大大甩给我一个cm让我干了。。。
然后就有了这个文章=-=

地址先丢出来:链接: http://pan.baidu.com/s/1kT2zj6J 密码: 7ikh

废话不多说了。。。开始了。。。

先载入od

然后查找字符串 QQ图片20141012172846.png

发现OK 和 Wrong(错误)
这两个关键字符串。。
于是双击进入OK。
然后找到断首


这里在用户名里输入rain
在密码里输入123
  1. 00401410    53              push ebx                            断首下断
  2. 00401411    55              push ebp
  3. 00401412    56              push esi
  4. 00401413    57              push edi
  5. 00401414    8BF9            mov edi,ecx
  6. 00401416    6A 01           push 1
  7. 00401418    E8 93030000     call <jmp.&MFC42.#operator new_823>
  8. 0040141D    83C4 04         add esp,4
  9. 00401420    85C0            test eax,eax
  10. 00401422    74 07           je short 0040142B
  11. 00401424    C600 18         mov byte ptr ds:[eax],18
  12. 00401427    8BD8            mov ebx,eax
  13. 00401429    EB 02           jmp short 0040142D
  14. 0040142B    33DB            xor ebx,ebx
  15. 0040142D    6A 01           push 1
  16. 0040142F    E8 7C030000     call <jmp.&MFC42.#operator new_823>
  17. 00401434    83C4 04         add esp,4
  18. 00401437    85C0            test eax,eax
  19. 00401439    74 07           je short 00401442
  20. 0040143B    C600 18         mov byte ptr ds:[eax],18
  21. 0040143E    8BF0            mov esi,eax
  22. 00401440    EB 02           jmp short 00401444
  23. 00401442    33F6            xor esi,esi
  24. 00401444    6A 14           push 14
  25. 00401446    53              push ebx
  26. 00401447    8D8F A0000000   lea ecx,dword ptr ds:[edi+A0]
  27. 0040144D    E8 58030000     call <jmp.&MFC42.#CWnd::GetWindowTextA_3>               获取用户名
  28. 00401452    6A 14           push 14
  29. 00401454    56              push esi
  30. 00401455    8D4F 60         lea ecx,dword ptr ds:[edi+60]
  31. 00401458    E8 4D030000     call <jmp.&MFC42.#CWnd::GetWindowTextA_3>               获取注册码
复制代码
这是前面的一部分

然后现在讲下怎么爆破。。
先运行起来把。。
然后点一下验证。
发现断下来了

QQ图片20141012173437.jpg

于是F8单步到这里。
(编辑框1和2不能大于10个字节,如果大于就nop把。。)
我这里填的没有大于10字节所以默认的就没跳。
继续F8单步把。。。


现在先讲爆破。。分析就直接略过把。。

然后继续单步。。

QQ图片20141012173542.jpg

单步到这里004014BD

然后按照恒大教给我们的。
nop了。。。。
下面的那个004014C1的跳转没跳。。。
于是不管他。
直接点运行。
哇!成功了!!!!!
咦。。不对啊。。怎么什么都没显示。。。

于是别着急。
仔细看看这两处的代码
  1. 004014C3    50              push eax
  2. 004014C4    68 50304000     push 00403050                            ; Ok
  3. 004014C9    68 2C304000     push 0040302C                            ; Congratulations!This is the key!
  4. 004014CE    50              push eax
  5. 004014CF    FF15 D8214000   call dword ptr ds:[<&USER32.MessageBoxA>>; USER32.MessageBoxA
  6. 004014D5    5F              pop edi
  7. 004014D6    5E              pop esi
  8. 004014D7    5D              pop ebp
  9. 004014D8    5B              pop ebx
  10. 004014D9    C3              retn
复制代码
  1. 004014DA    6A 00           push 0
  2. 004014DC    68 28304000     push 00403028                            ; Msg
  3. 004014E1    68 20304000     push 00403020                            ; Wrong!
  4. 004014E6    6A 00           push 0
  5. 004014E8    FF15 D8214000   call dword ptr ds:[<&USER32.MessageBoxA>>; USER32.MessageBoxA
  6. 004014EE    5F              pop edi
  7. 004014EF    5E              pop esi
  8. 004014F0    5D              pop ebp
  9. 004014F1    5B              pop ebx
  10. 004014F2    C3              retn
复制代码
发现除了内容不同 还有1个地方不同
那就是成功地方是
push eax
push 成功内容
push eax

而失败地方是
push 0
push 失败内容
push 0

发现了什么?。。。
就是成功地方是由eax来确定是不是创建这个窗口的(小菜是这么理解的。。。如有错误 请指出来把。)。。。
下面的失败内容中
push 的是0
而上面的eax
我们单步到那里

QQ图片20141012174042.png


发现eax=1

那么我们只要在这把eax赋值为0
就好了把?。
于是就在
004014C3    50              push eax
的前面
004014B8    83D8 FF         sbb eax,-1

修改代码为mov eax,1

在运行看看。是不是成功了?
QQ图片20141012174437.jpg


啊啊啊啊,好开心。。。


下面进入注册码分析:
  1. 00401410    53              push ebx
  2. 00401411    55              push ebp
  3. 00401412    56              push esi
  4. 00401413    57              push edi
  5. 00401414    8BF9            mov edi,ecx
  6. 00401416    6A 01           push 1
  7. 00401418    E8 93030000     call <jmp.&MFC42.#operator new_823>
  8. 0040141D    83C4 04         add esp,4
  9. 00401420    85C0            test eax,eax
  10. 00401422    74 07           je short 0040142B
  11. 00401424    C600 18         mov byte ptr ds:[eax],18
  12. 00401427    8BD8            mov ebx,eax
  13. 00401429    EB 02           jmp short 0040142D
  14. 0040142B    33DB            xor ebx,ebx
  15. 0040142D    6A 01           push 1
  16. 0040142F    E8 7C030000     call <jmp.&MFC42.#operator new_823>
  17. 00401434    83C4 04         add esp,4
  18. 00401437    85C0            test eax,eax
  19. 00401439    74 07           je short 00401442
  20. 0040143B    C600 18         mov byte ptr ds:[eax],18
  21. 0040143E    8BF0            mov esi,eax
  22. 00401440    EB 02           jmp short 00401444
  23. 00401442    33F6            xor esi,esi
  24. 00401444    6A 14           push 14
  25. 00401446    53              push ebx
  26. 00401447    8D8F A0000000   lea ecx,dword ptr ds:[edi+A0]
  27. 0040144D    E8 58030000     call <jmp.&MFC42.#CWnd::GetWindowTextA_3>; 取编辑框1.内容 也就是用户名
  28. 00401452    6A 14           push 14
  29. 00401454    56              push esi
  30. 00401455    8D4F 60         lea ecx,dword ptr ds:[edi+60]
  31. 00401458    E8 4D030000     call <jmp.&MFC42.#CWnd::GetWindowTextA_3>; 取编辑框2.内容 也就是密码
  32. 0040145D    8BFB            mov edi,ebx
  33. 0040145F    83C9 FF         or ecx,FFFFFFFF
  34. 00401462    33C0            xor eax,eax
  35. 00401464    F2:AE           repne scas byte ptr es:[edi]
  36. 00401466    F7D1            not ecx
  37. 00401468    49              dec ecx
  38. 00401469    8BFE            mov edi,esi                              ; 以上代码是取编辑框1的长度
  39. 0040146B    8BE9            mov ebp,ecx                              ; 4位
  40. 0040146D    83C9 FF         or ecx,FFFFFFFF
  41. 00401470    F2:AE           repne scas byte ptr es:[edi]
  42. 00401472    F7D1            not ecx
  43. 00401474    49              dec ecx                                  ; 取编辑框2的长度
  44. 00401475    83FD 0A         cmp ebp,0A
  45. 00401478    77 60           ja short 004014DA                        ; 编辑框1.长度大于10就错误
  46. 0040147A    83F9 0A         cmp ecx,0A
  47. 0040147D    77 5B           ja short 004014DA                        ; 编辑框2.长度大于10也错误
  48. 0040147F    53              push ebx
  49. 00401480    E8 7B000000     call 00401500                            ; 算法call1
  50. 00401485    56              push esi
  51. 00401486    E8 A5000000     call 00401530                            ; 算法call2
  52. 0040148B    83C4 08         add esp,8
  53. 0040148E    8A0B            mov cl,byte ptr ds:[ebx]                 ; 运算完成的第一个用户名ASCII
  54. 00401490    8A16            mov dl,byte ptr ds:[esi]                 ; 运算完成的第一个密码ASCII
  55. 00401492    8AC1            mov al,cl
  56. 00401494    3ACA            cmp cl,dl                                ; 互相比较是不是一样
  57. 00401496    75 1E           jnz short 004014B6                       ; 如果一样就不跳
  58. 00401498    84C0            test al,al
  59. 0040149A    74 16           je short 004014B2
  60. 0040149C    8A53 01         mov dl,byte ptr ds:[ebx+1]               ; 运算完成的第二个用户名ASCII
  61. 0040149F    8A4E 01         mov cl,byte ptr ds:[esi+1]               ; 运算完成的第二个密码ASCII
  62. 004014A2    8AC2            mov al,dl
  63. 004014A4    3AD1            cmp dl,cl                                ; 比较一样不
  64. 004014A6    75 0E           jnz short 004014B6                       ; 一样就不跳 不一样就跳
  65. 004014A8    83C3 02         add ebx,2                                ; 舍去2个用户名ASCII码 到第三个
  66. 004014AB    83C6 02         add esi,2                                ; 舍去2个密码ASCII码 到第三个
  67. 004014AE    84C0            test al,al
  68. 004014B0  ^ 75 DC           jnz short 0040148E
  69. 004014B2    33C0            xor eax,eax
  70. 004014B4    EB 05           jmp short 004014BB                       ; 于是就成功了=-=
  71. 004014B6    1BC0            sbb eax,eax
  72. 004014B8    83D8 FF         sbb eax,-1
  73. 004014BB    85C0            test eax,eax
  74. 004014BD    75 1B           jnz short 004014DA
  75. 004014BF    85ED            test ebp,ebp
  76. 004014C1    74 17           je short 004014DA
  77. 004014C3    50              push eax
  78. 004014C4    68 50304000     push 00403050                            ; Ok
  79. 004014C9    68 2C304000     push 0040302C                            ; Congratulations!This is the key!
  80. 004014CE    50              push eax
  81. 004014CF    FF15 D8214000   call dword ptr ds:[<&USER32.MessageBoxA>>; USER32.MessageBoxA
  82. 004014D5    5F              pop edi
  83. 004014D6    5E              pop esi
  84. 004014D7    5D              pop ebp
  85. 004014D8    5B              pop ebx
  86. 004014D9    C3              retn
  87. 004014DA    6A 00           push 0
  88. 004014DC    68 28304000     push 00403028                            ; Msg
  89. 004014E1    68 20304000     push 00403020                            ; Wrong!
  90. 004014E6    6A 00           push 0
  91. 004014E8    FF15 D8214000   call dword ptr ds:[<&USER32.MessageBoxA>>; USER32.MessageBoxA
  92. 004014EE    5F              pop edi
  93. 004014EF    5E              pop esi
  94. 004014F0    5D              pop ebp
  95. 004014F1    5B              pop ebx
  96. 004014F2    C3              retn
复制代码



算法call1:
  1. 00401500    8B5424 04       mov edx,dword ptr ss:[esp+4]             ; 算法call1
  2. 00401504    56              push esi
  3. 00401505    57              push edi
  4. 00401506    8BFA            mov edi,edx
  5. 00401508    83C9 FF         or ecx,FFFFFFFF
  6. 0040150B    33C0            xor eax,eax
  7. 0040150D    F2:AE           repne scas byte ptr es:[edi]
  8. 0040150F    F7D1            not ecx
  9. 00401511    49              dec ecx                                  ; rain的长度4
  10. 00401512    8BF1            mov esi,ecx
  11. 00401514    74 11           je short 00401527
  12. 00401516    8A0C10          mov cl,byte ptr ds:[eax+edx]             ; 循环读取ASCII
  13. 00401519    80F1 03         xor cl,3                                 ; ASCII码与3异或
  14. 0040151C    80E9 14         sub cl,14                                ; -20
  15. 0040151F    880C10          mov byte ptr ds:[eax+edx],cl
  16. 00401522    40              inc eax
  17. 00401523    3BC6            cmp eax,esi
  18. 00401525  ^ 72 EF           jb short 00401516
  19. 00401527    5F              pop edi
  20. 00401528    5E              pop esi
  21. 00401529    C3              retn
复制代码


算法call2:
  1. 00401530    8B5424 04       mov edx,dword ptr ss:[esp+4]             ; 算法call 2
  2. 00401534    56              push esi
  3. 00401535    57              push edi
  4. 00401536    8BFA            mov edi,edx
  5. 00401538    83C9 FF         or ecx,FFFFFFFF
  6. 0040153B    33C0            xor eax,eax
  7. 0040153D    F2:AE           repne scas byte ptr es:[edi]
  8. 0040153F    F7D1            not ecx
  9. 00401541    49              dec ecx                                  ; 4
  10. 00401542    8BF1            mov esi,ecx
  11. 00401544    74 11           je short 00401557
  12. 00401546    8A0C10          mov cl,byte ptr ds:[eax+edx]             ; 循环取ASCII
  13. 00401549    80C1 02         add cl,2                                 ; ASCII+2
  14. 0040154C    80F1 10         xor cl,10                                ; 和10异或
  15. 0040154F    880C10          mov byte ptr ds:[eax+edx],cl
  16. 00401552    40              inc eax
  17. 00401553    3BC6            cmp eax,esi
  18. 00401555  ^ 72 EF           jb short 00401546
  19. 00401557    5F              pop edi
  20. 00401558    5E              pop esi
  21. 00401559    C3              retn
复制代码

总结一下流程:
一上来读取编辑框1.内容的长度
然后计次循环
{
取出ASCII码
然后和3异或-14
}


然后编辑框2.内容的长度
计次循环
{
取出ASCII码
然后+2异或10
}

然后和第一个比较

计算出来的相同就正确


那么下面开始
(注意都是十六进制的运算)
我的用户名是rain
密码未知。
rain通过取ASCII码是72、61、69、6E。
然后和3异或是71、62、6A、6D。
然后-14是5D、4E、56、59




然后因为计算要是同样的
所以既然用户名是4个。
那密码也要是4个。
这个都知道。
然后开始计算
异或有个运算顺序:
     A运算B=C
     A=B运算C
可以用生哥OD里面的逆向计算器
来运算一下。 先勾上16进制
QQ图片20141012180521.jpg

然后5D XOR 10=4D
现在来检验一下。。
10 XOR 4D =5D   检验成功
然后继续运算。 运算4个之后。
密码的ASCII码=4D、5E、46、49
然后别忘了减去2哦。
因为这是算法,+2最后就要-2:
(取出ASCII码
然后+2异或10)

减去2之后密码的ASCII=4B、5C、44、47
然后查ASCII码表 得出
密码=K/DG

填进去。发现正确了=-=


于是就到这里了。。结束


希望所有看过帖子的人回复一个正确的key!
肯定会评分的!!!

评分

参与人数 25威望 +1 HB +50 THX +14 收起 理由
花盗睡鼠 + 2 + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
29590 + 1
24567 + 1
Jawon + 1
是的是的 + 1
一路走来不容易 + 1
Soul1999 + 1
WolfKing + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
风里去 + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
冷亦飞 + 1
消逝的过去 + 2
zyyujq + 1
天使替我爱你 + 1
SmallEXpel + 1
叶落花开 + 2
liugu0hai + 1 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
jaunic + 2
hnymsh + 1
lies + 1
蜡笔小新 + 1 + 1 永远支持菜菜师父
小高 + 5 + 1 积极评分从我做起,感谢!
穆菲菲 + 1 + 1 你将受到所有人的崇拜!
Shark恒 + 1 + 20 + 1 你将受到所有人的崇拜!
微笑的耗子 + 3 + 1 积极评分从我做起,感谢!
小丸子 + 3 + 1 菜菜 老师 好样的!

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
微笑的耗子 发表于 2014-10-12 20:10 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Crack杰 发表于 2014-10-12 21:58 | 显示全部楼层

学霸啊,学习了,感谢lz发帖

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Shark恒 发表于 2014-10-12 22:07 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
穆菲菲 发表于 2014-10-13 18:27 | 显示全部楼层

一下子接受不了,留下来慢慢学习,谢谢分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
小明同学 发表于 2014-10-14 15:22 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
yexpin 发表于 2014-10-14 15:38 | 显示全部楼层

非常感谢分享教程
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
小高 发表于 2014-10-14 22:37 | 显示全部楼层

好技术都是分享心得总结经验得来的!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
司辰。 发表于 2015-3-15 23:03 | 显示全部楼层

感谢分享~~
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Icc 发表于 2017-8-22 11:31 | 显示全部楼层

_KaQqi
V"\,LD

[C] 纯文本查看 复制代码
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
	char Name[512];
	char key[512];
	int SizeOfName;
	scanf("%s",Name);
	SizeOfName = strlen(Name);
	if(SizeOfName > 10)
		return 0;
	for(int i = 0;i < SizeOfName;i++)
	{
		Name[i] ^= 3;
		Name[i] -= 0x14;
		key[i] = Name[i];
		key[i] ^= 0x10;
		key[i] -= 2;
	}
	for(int i = 0;i < SizeOfName;i++)
		printf("%c",key[i]);
	while(1);
	return 0;
}
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层
8层
9层
10层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

快速回复 返回顶部 返回列表