吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 96082|回复: 437

[原创逆向图文] 「逆向的艺术」-某驾校驾驶员理论模拟考试系统4.2算法分析+注册机编写

  [复制链接]
孤星琉月i 发表于 2015-3-8 15:14 | 显示全部楼层 |阅读模式

「作者」:孤星琉月
「工具」:OllyDBG    DeDe
「加壳方式」:无
游客,如果您要查看本帖隐藏内容请回复



到此前四位结束了
  1. 004C25B3 |> 8B45 FC /mov eax,[local.1] ; 从第五位开始
  2. 004C25B6 |. 33DB |xor ebx,ebx
  3. 004C25B8 |. 8A5C30 FF |mov bl,byte ptr ds:[eax+esi-0x1]
  4. 004C25BC |. 83FB 30 |cmp ebx,0x30
  5. 004C25BF |. 7C0A |jl X潍坊长远.004C25CB ; <0
  6. 004C25C1 |. 83FB 37 |cmp ebx,0x37
  7. 004C25C4 |. 7F05 |jg X潍坊长远.004C25CB ; >8
  8. 004C25C6 |. 83C302 |add ebx,0x2 ; 如果是0-7之间的数字,则加2
  9. 004C25C9 |. EB 0D |jmp X潍坊长远.004C25D8
  10. 004C25CB |> 83FB 38 |cmp ebx,0x38
  11. 004C25CE |. 7C08 |jl X潍坊长远.004C25D8
  12. 004C25D0 |. 83FB 39 |cmp ebx,0x39
  13. 004C25D3 |. 7F03 |jg X潍坊长远.004C25D8 ; 8-9的话直下一步
  14. 004C25D5 |. 83EB 08 |sub ebx,0x8 ; 是字母的话或者大的直接减8
  15. 004C25D8 |> 83FB 41 |cmp ebx,0x41 ; Switch (cases 41..5A)
  16. 004C25DB |. 7C29 |jl X潍坊长远.004C2606 ; "A"
  17. 004C25DD |. 83FB 5A |cmp ebx,0x5A
  18. 004C25E0 |. 7F24 |jg X潍坊长远.004C2606 ; “z”
  19. 004C25E2 |. 83EB 41 |sub ebx,0x41
  20. 004C25E5 |. 83FB 0A |cmp ebx,0xA
  21. 004C25E8 |. 7C03 |jl X潍坊长远.004C25ED ; 下面两个字符串也说明了,如果是A-J,则减41,B-Z,则减4B
  22. 004C25EA |. 83EB 0A |sub ebx,0xA ; Cases 4B ('K'),4C ('L'),4D ('M'),4E ('N'),4F ('O'),50 ('P'),51 ('Q'),52 ('R'),53 ('S'),54('T'),55 ('U'),56 ('V'),57 ('W'),58 ('X'),59 ('Y'),5A ('Z') of switch 004C25D8
  23. 004C25ED |> 83FB 0A |cmp ebx,0xA ; Cases 41 ('A'),42 ('B'),43 ('C'),44 ('D'),45('E'),46 ('F'),47 ('G'),48 ('H'),49 ('I'),4A('J') of switch 004C25D8
  24. 004C25F0 |. 7C03 |jl X潍坊长远.004C25F5
  25. 004C25F2 |. 83EB 0A |sub ebx,0xA ; 显然这样计算的结果是在0-10了
  26. 004C25F5 |> 8D45 F8 |lea eax,[local.2] ; 之后的值放在变量中去
  27. 004C25F8 |. E8 2727F4FF |call 潍坊长远.00404D24
  28. 004C25FD |. 80C330 |add bl,0x30 ; 在这时转换成相应的ASCII码值
  29. 004C2600 |. 885C30FF |mov byte ptr ds:[eax+esi-0x1],bl ;放回到我们真注册码保存的位置
  30. 004C2604 |. EB 0C |jmp X潍坊长远.004C2612
  31. 004C2606 |> 8D45 F8 |lea eax,[local.2] ; Default case of switch 004C25D8
  32. 004C2609 |. E8 1627F4FF |call 潍坊长远.00404D24 ;如果里面全都是数字,那取相应的位
  33. 004C260E |. 885C30FF |mov byte ptrds:[eax+esi-0x1],bl ; 直接放进去就好了
  34. 004C2612 |> 46 |inc esi
  35. 004C2613 |. 83FE 09 |cmp esi,0x9
  36. 004C2616 |.^ 75 9B \jnz X潍坊长远.004C25B3
复制代码
到此后四位就处理结束了。
  1. 004C2618 |. 8D45 F4 lea eax,[local.3]
  2. 004C261B |. 8B55 F8 mov edx,[local.2]
  3. 004C261E |. E8 8122F4FF call 潍坊长远.004048A4 ;大概是拷贝了一份放在变量3里面了吧
  4. 004C2623 |. 8D45 F4 lea eax,[local.3]
  5. 004C2626 |. E8 F926F4FF call 潍坊长远.00404D24 ; System.@UniqueStringA(String;String);
  6. 004C262B |. 8B55 F8 mov edx,[local.2]
  7. 004C262E |. 8A5202 mov dl,byte ptrds:[edx+0x2] ; 变量2的第2位
  8. 004C2631 |. 8810 mov byte ptr ds:[eax],dl ; 第0位
  9. 004C2633 |. 8D45 F4 lea eax,[local.3]
  10. 004C2636 |. E8 E926F4FF call 潍坊长远.00404D24
  11. 004C263B |. 8B55 F8 mov edx,[local.2]
  12. 004C263E |. 8A5204 mov dl,byte ptrds:[edx+0x4] ; 第四位换第4
  13. 004C2641 |. 8850 01 mov byte ptr ds:[eax+0x1],dl ; 换第1
  14. 004C2644 |. 8D45 F4 lea eax,[local.3]
  15. 004C2647 |. E8 D826F4FF call 潍坊长远.00404D24
  16. 004C264C |. 8B55 F8 mov edx,[local.2]
  17. 004C264F |. 8A5207 mov dl,byte ptrds:[edx+0x7] ; 7
  18. 004C2652 |. 8850 02 mov byte ptr ds:[eax+0x2],dl ; 换2
  19. 004C2655 |. 8D45 F4 lea eax,[local.3]
  20. 004C2658 |. E8 C726F4FF call 潍坊长远.00404D24
  21. 004C265D |. 8B55 F8 mov edx,[local.2]
  22. 004C2660 |. 8A12 mov dl,byte ptr ds:[edx] ; 0换3
  23. 004C2662 |. 8850 03 mov byte ptr ds:[eax+0x3],dl
  24. 004C2665 |. 8D45 F4 lea eax,[local.3]
  25. 004C2668 |. E8 B726F4FF call 潍坊长远.00404D24
  26. 004C266D |. 8B55 F8 mov edx,[local.2]
  27. 004C2670 |. 8A5203 mov dl,byte ptrds:[edx+0x3] ; 3换4
  28. 004C2673 |. 8850 04 mov byte ptr ds:[eax+0x4],dl
  29. 004C2676 |. 8D45 F4 lea eax,[local.3]
  30. 004C2679 |. E8 A626F4FF call 潍坊长远.00404D24
  31. 004C267E |. 8B55 F8 mov edx,[local.2]
  32. 004C2681 |. 8A5206 mov dl,byte ptrds:[edx+0x6] ; 6换5
  33. 004C2684 |. 8850 05 mov byte ptr ds:[eax+0x5],dl
  34. 004C2687 |. 8D45 F4 lea eax,[local.3]
  35. 004C268A |. E8 9526F4FF call 潍坊长远.00404D24
  36. 004C268F |. 8B55 F8 mov edx,[local.2]
  37. 004C2692 |. 8A5201 mov dl,byte ptrds:[edx+0x1] ; 1换6
  38. 004C2695 |. 8850 06 mov byte ptr ds:[eax+0x6],dl
  39. 004C2698 |. 8D45 F4 lea eax,[local.3]
  40. 004C269B |. E8 8426F4FF call 潍坊长远.00404D24
  41. 004C26A0 |. 8B55 F8 mov edx,[local.2]
  42. 004C26A3 |. 8A5205 mov dl,byte ptrds:[edx+0x5] ; 5换7.
  43. 004C26A6 |. 8850 07 mov byte ptr ds:[eax+0x7],dl
  44. 004C26A9 |. BE 01000000 mov esi,0x1 ; 上面的注册码进行了进一步调整
  45. 004C26AE |> 8B45 F4 /mov eax,[local.3]
  46. 004C26B1 |. 807C30FF 4F |cmp byte ptr ds:[eax+esi-0x1],0x4F
  47. 004C26B6 |. 75 0D |jnz X潍坊长远.004C26C5
  48. 004C26B8 |. 8D45 F4 |lea eax,[local.3]
复制代码
这里也是最后一次处理了。

  1. 004C26BB |. E8 6426F4FF |call 潍坊长远.00404D24 ; 这里的大概意思是说,处理之后看看是否有字母O
  2. 004C26C0 |. C64430 FF 30 |mov byte ptr ds:[eax+esi-0x1],0x30 ;如果有则换成数字0
  3. 004C26C5 |> 46 |inc esi
  4. 004C26C6 |. 83FE 09 |cmp esi,0x9
  5. 004C26C9 |.^ 75 E3 \jnz X潍坊长远.004C26AE
  6. 004C26CB |. 8D55 F0 lea edx,[local.4]
  7. 004C26CE |. 8B45 F4 mov eax,[local.3] ;将变量3中字母转成大写
  8. 004C26D1 |. E8 C265F4FF call 潍坊长远.00408C98 ;UpperCase(AnsiString)
  9. 004C26D6 |. 8B55 F0 mov edx,[local.4]
  10. 004C26D9 |. 8D45 F4 lea eax,[local.3]
  11. 004C26DC |. E8 C321F4FF call 潍坊长远.004048A4 ; System.@LStrLAsg
  12. 004C26E1 |. 8BC7 mov eax,edi
  13. 004C26E3 |. 8B55 F4 mov edx,[local.3]
  14. 004C26E6 |. E8 7521F4FF call 潍坊长远.00404860 ; System.@LStrAsg
  15. 004C26EB |. 33C0 xor eax,eax
  16. 004C26ED |. 5A pop edx
  17. 004C26EE |. 59 pop ecx
  18. 004C26EF |. 59 pop ecx
  19. 004C26F0 |. 64:8910 mov dword ptr fs:[eax],edx
  20. 004C26F3 |. 68 0D274C00 push 潍坊长远.004C270D
  21. 004C26F8 |> 8D45 F0 lea eax,[local.4]
  22. 004C26FB |. BA 04000000 mov edx,0x4
  23. 004C2700 |. E8 2B21F4FF call 潍坊长远.00404830 ; System.@LStrArrayClr
复制代码
好了。我们解读下算法。
通过上面的分析,整个注册都在“注册”按钮事件里面处理完成,我们大致总结一下算法(我们试注册的码称假码)。
    假码处理:注册码必须是8位字符,不包括两端的空格键,不能有英文字母O,如果有则用数字0替换掉了,但对我们没有影响,它会自动替换掉。
    注册码:先取1-4位处理,5-8位处理,最后就是打乱它们的位置

我们开始编写注册机。我用的编辑器是VS 2013     C#写的
  1. namespace csharp_reg
  2. {
  3. public partial class Form1 : Form
  4. {
  5. public Form1()
  6. {
  7. InitializeComponent();
  8. }
  9. //首先我们要有一个字符串来存机器码

  10. private void Btn_Reg_Click(object sender, EventArgs e)
  11. {
  12. if (TB_REGCODE.Text.ToString().Length != 8)
  13. return;
  14. char[] MCODE=new char[8];
  15. char[] KEYWORD=new char[8];
  16. int i = 0;

  17. MCODE = TB_REGCODE.Text.ToString().ToCharArray();
  18. //一、对机器码的前4位的处理
  19. for(;i<4;i++)
  20. {
  21. char k;
  22. //如果是数字

  23. if (Char.IsNumber(MCODE[i]))
  24. {
  25. k = MCODE[i];
  26. k +=Convert.ToChar( (i+1)*2 +17);
  27. MCODE[i] = k;
  28. }
  29. //其它的我们在这里处理
  30. else
  31. {
  32. k = MCODE[i];
  33. if (k <= ('Z' - (i+1)))
  34. {
  35. MCODE[i] = Convert.ToChar(k + i + 1);
  36. }
  37. else
  38. {
  39. if (k < ('Z'+1 - (i + 1)))
  40. {
  41. MCODE[i] = k;
  42. }
  43. else
  44. {
  45. if (k > 'Z')
  46. {
  47. MCODE[i] = k;
  48. }
  49. else
  50. {
  51. k = Convert.ToChar((Convert.ToInt16(k)-26 + i+1));
  52. MCODE[i] = k;
  53. }
  54. }
  55. }
  56. }
  57. }
  58. //二是、对机器码的后4位的处理
  59. /*
  60. 30下 直接存起来。
  61. 30-37 +2 结束
  62. 38-39 -8 存起来
  63. 40 直接存
  64. 41 -41 转ASCII+30存
  65. 41-5A 里面值 -41
  66. 小于存, 如果大于10 -10 还大于10就再减10*/
  67. for (; i < 8; i++)
  68. {
  69. if( (MCODE[i] < '0')||(MCODE[i]=='@'))
  70. {
  71. Console.WriteLine(MCODE[i]);
  72. }
  73. else
  74. {
  75. if (MCODE[i] < '8')
  76. {
  77. MCODE[i] = Convert.ToChar((MCODE[i] + 2));
  78. continue;
  79. }
  80. if (MCODE[i] < 'A')
  81. {
  82. MCODE[i] =Convert.ToChar((MCODE[i] + 8));
  83. continue;
  84. }
  85. if (MCODE[i] >= 'A')
  86. {
  87. int K = MCODE[i] - 'A';
  88. if (K < 10)
  89. {
  90. MCODE[i] = Convert.ToChar(K + 48);
  91. }
  92. else
  93. {
  94. if (K < 10)
  95. {
  96. MCODE[i] = Convert.ToChar(K + 48);
  97. }
  98. else
  99. {
  100. K -= 10;
  101. MCODE[i] = Convert.ToChar(K + 48);
  102. }
  103. }
  104. }
  105. }
  106. }

  107. //三是、换位,成型!
  108. KEYWORD[0] = MCODE[2];
  109. KEYWORD[1] = MCODE[4];
  110. KEYWORD[2] = MCODE[7];
  111. KEYWORD[3] = MCODE[0];
  112. KEYWORD[4] = MCODE[3];
  113. KEYWORD[5] = MCODE[6];
  114. KEYWORD[6] = MCODE[1];
  115. KEYWORD[7] = MCODE[5];
  116. string msg=null;
  117. for (i = 0; i < 8; i++)
  118. {
  119. msg += KEYWORD[i].ToString();
  120. }
  121. this.textBox_reg.Text = msg;
  122. }

  123. private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
  124. {
  125. System.Diagnostics.Process.Start("iexplore.exe", <A >www.xuepojie.com</A>);
  126. }
  127. }
  128. }
复制代码
QQ截图20150308151226.jpg

注册机源码下载:
csharp_reg.zip (54.32 KB, 下载次数: 65)




评分

参与人数 146威望 +1 HB +198 THX +114 收起 理由
xiaoxixpj + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
24567 + 1
Jawon + 2
Soul1999 + 1
太阳神 + 2 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
shaokui123 + 1
WolfKing + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
冷亦飞 + 1
消逝的过去 + 1
纯英文 + 1
搞不懂都 + 1
temp + 1 + 1
丰明泽 + 1
Wayne + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
陈沦 + 1
549625751 + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
谷歌 + 1
jaunic + 2
MoeRay + 1
口水鸡 + 1 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
阿晋 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
hotD + 2 + 1
hetao8003200 + 1
bnjzzheng + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
hnymsh + 1
sm5186 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
zxjzzh + 2 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
kalove + 1
哈哈买买买 + 1
yeyuzhen11101 + 1 + 1
leo999 + 1
zwc123xyz + 1 + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!
成丰羽 + 1 + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!
Amir + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!
cluo777 + 1
smrjp + 1 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
cai7381237 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
lies + 1
lijun55555 + 1 [快捷评语] - 吃水不忘打井人,给个评分懂感恩!
wei1526 + 1 + 1 分析的很详细,喜欢这样的文章
Oneness神 + 2 + 1 [快捷评语] - 2018,狗年发发发,狗年旺旺旺!
万俊幻影 + 1 + 1 [快捷评语] - 吃水不忘打井人,给个评分懂感恩!
cchhww00 + 1 [快捷评语] - 吃水不忘打井人,给个评分懂感恩!
wswwj + 1 + 1 [快捷评语] - 吃水不忘打井人,给个评分懂感恩!
一介书生 + 1 [快捷评语] - 2017,让我们17学破解!
hysmy17 + 1 [快捷评语] - 2017,让我们17学破解!
hongf + 1 [快捷评语] - 评分=感恩!简单却充满爱!感谢您的作品!
wpsys + 1 + 1 [快捷评语] - 2017,让我们17学破解!
半世浮华 + 1 [快捷评语] - 分享精神,是最值得尊敬的!
康师傅 + 1 [快捷评语] - 2017,让我们17学破解!

查看全部评分

本帖被以下淘专辑推荐:

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Mrsin 发表于 2015-3-8 15:27 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Crook 发表于 2015-3-8 15:29 | 显示全部楼层

膜拜玩算法的大牛
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Jacky 发表于 2015-3-8 15:33 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
pojie520 发表于 2015-3-8 15:35 | 显示全部楼层

这个不错啊,正是需要
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Bei_eec 发表于 2015-3-8 15:36 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Bei_eec 发表于 2015-3-8 15:42 | 显示全部楼层

新人求解,局部变量4 是什么意思
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
彡墨鱼灬丶 发表于 2015-3-8 15:45 | 显示全部楼层

首先感谢大神的原创教程,让我又学到新的技能!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
whazyy2008 发表于 2015-3-8 15:50 | 显示全部楼层

给力啊  不服不行!!!!!!!!!!!!我喜欢我考100分
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
有何不可 发表于 2015-3-8 15:52 | 显示全部楼层

感谢,新技能get!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!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

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