飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2817|回复: 3

iawen申请加入PYG----算法分析2

[复制链接]

该用户从未签到

发表于 2009-1-20 11:08:19 | 显示全部楼层 |阅读模式
目标软件:XXX文件夹加锁王 2009 9.90 钻石版
工具:OD,VolX大侠的脚本
平台:XP SP3

程序加了强壳,用PEID查壳显示为:ASProtect 2.0x Registered -> Alexey Solodovnikov
再用VerA插件赤查找一下,则显示为:Version: ASProtect 1.32 build 10.20 Beta
怀疑是ASPR的高版本,毕竟VerA已经N久没更新了,呵呵!不过,用VolX大侠的脚本,低版本的也许要手脱,高版的却是一健搞定,呵呵!

用脚本脱过后,OD载入!在输入假码后,通过堆栈调用,很快就找到注册验证的关键点:[separator]

  1. 004B9388    /$  55              push ebp
  2. 004B9389    |.  8BEC            mov ebp,esp
  3. 004B938B    |.  83C4 F0         add esp,-10
  4. 004B938E    |.  53              push ebx
  5. 004B938F    |.  33DB            xor ebx,ebx
  6. 004B9391    |.  895D F0         mov dword ptr ss:[ebp-10],ebx
  7. …………
  8. 004B93C5    |.  8B45 FC         mov eax,dword ptr ss:[ebp-4]
  9. 004B93C8    |.  E8 93B6F4FF     call de_folde.00404A60
  10. 004B93CD    |.  3B43 4C         cmp eax,dword ptr ds:[ebx+4C]   ;  比较用户名长度,不得大于0x64
  11. 004B93D0    |.  7F 19           jg short de_folde.004B93EB      ;  大于则跳转将EBX清0,然后直接跳转到段尾
  12. 004B93D2    |.  8B45 FC         mov eax,dword ptr ss:[ebp-4]
  13. 004B93D5    |.  E8 86B6F4FF     call de_folde.00404A60
  14. 004B93DA    |.  3B43 50         cmp eax,dword ptr ds:[ebx+50]   ;  比较用户名长度,不得小于0x3
  15. 004B93DD    |.  7C 0C           jl short de_folde.004B93EB
  16. 004B93DF    |.  8B45 08         mov eax,dword ptr ss:[ebp+8]
  17. 004B93E2    |.  E8 79B6F4FF     call de_folde.00404A60
  18. 004B93E7    |.  85C0            test eax,eax                    ;  测试注册码是否为空
  19. 004B93E9    |.  75 04           jnz short de_folde.004B93EF
  20. 004B93EB    |>  33DB            xor ebx,ebx
  21. 004B93ED    |.  EB 60           jmp short de_folde.004B944F
  22. ………………
  23. 004B9405    |.  8D4D F0         lea ecx,dword ptr ss:[ebp-10]
  24. 004B9408    |.  8B55 FC         mov edx,dword ptr ss:[ebp-4]
  25. 004B940B    |.  8BC3            mov eax,ebx
  26. 004B940D    |.  E8 BAFBFFFF     call de_folde.004B8FCC          ;  关键CALL,计算注册码
  27. 004B9412    |.  8B45 F0         mov eax,dword ptr ss:[ebp-10]
  28. 004B9415    |.  8B55 08         mov edx,dword ptr ss:[ebp+8]
  29. 004B9418    |.  E8 33F8F4FF     call de_folde.00408C50
  30. 004B941D    |.  85C0            test eax,eax
  31. 004B941F    |.  74 04           je short de_folde.004B9425
  32. 004B9421    |.  33DB            xor ebx,ebx
  33. 004B9423    |.  EB 2A           jmp short de_folde.004B944F
  34. ………………
复制代码
跟进call de_folde.004B8FCC :

  1. 004B8FCC    /$  55              push ebp
  2. 004B8FCD    |.  8BEC            mov ebp,esp
  3. 004B8FCF    |.  83C4 E0         add esp,-20
  4. 004B8FD2    |.  53              push ebx
  5. 004B8FD3    |.  56              push esi
  6. 004B8FD4    |.  57              push edi
  7. 004B8FD5    |.  33DB            xor ebx,ebx
  8. 004B8FD7    |.  895D EC         mov dword ptr ss:[ebp-14],ebx

  9. 004B9003    |.  BA 7C914B00     mov edx,de_folde.004B917C        ;  ASCII "gf258369gf"
  10. 004B9008    |.  E8 33B8F4FF     call de_folde.00404840           ;  出现一个全局字符
  11. 004B900D    |.  837D EC 00      cmp dword ptr ss:[ebp-14],0      ;  测试全局字符是否为空
  12. 004B9011    |.  75 0D           jnz short de_folde.004B9020


  13. 004B9028    |.  8BD8            mov ebx,eax                     ;  取全局字符的长度
  14. 004B902A    |.  8D45 E8         lea eax,dword ptr ss:[ebp-18]
  15. 004B902D    |.  50              push eax
  16. 004B902E    |.  8BCB            mov ecx,ebx
  17. 004B9030    |.  D1F9            sar ecx,1                       ;  将全局字符长度/2
  18. 004B9032    |.  79 03           jns short de_folde.004B9037
  19. 004B9034    |.  83D1 00         adc ecx,0
  20. 004B9037    |>  BA 01000000     mov edx,1
  21. 004B903C    |.  8B45 EC         mov eax,dword ptr ss:[ebp-14]
  22. 004B903F    |.  E8 74BCF4FF     call de_folde.00404CB8
  23. 004B9044    |.  8D45 E4         lea eax,dword ptr ss:[ebp-1C]
  24. 004B9047    |.  50              push eax
  25. 004B9048    |.  8BC3            mov eax,ebx
  26. 004B904A    |.  D1F8            sar eax,1
  27. 004B904C    |.  79 03           jns short de_folde.004B9051
  28. 004B904E    |.  83D0 00         adc eax,0
  29. 004B9051    |>  8BCB            mov ecx,ebx
  30. 004B9053    |.  2BC8            sub ecx,eax
  31. 004B9055    |.  8BD3            mov edx,ebx
  32. 004B9057    |.  D1FA            sar edx,1
  33. 004B9059    |.  79 03           jns short de_folde.004B905E
  34. 004B905B    |.  83D2 00         adc edx,0
  35. 004B905E    |>  42              inc edx
  36. 004B905F    |.  8B45 EC         mov eax,dword ptr ss:[ebp-14]
  37. 004B9062    |.  E8 51BCF4FF     call de_folde.00404CB8          ;  以上:将全局字符平均分为2个部分
  38. 004B9067    |.  FF75 E8         push dword ptr ss:[ebp-18]
  39. 004B906A    |.  FF75 FC         push dword ptr ss:[ebp-4]
  40. 004B906D    |.  FF75 E4         push dword ptr ss:[ebp-1C]
  41. 004B9070    |.  8D45 E0         lea eax,dword ptr ss:[ebp-20]
  42. 004B9073    |.  BA 03000000     mov edx,3
  43. 004B9078    |.  E8 A3BAF4FF     call de_folde.00404B20          ;  将用户名居中插入到全局字符串中
  44. 004B907D    |>  C745 F0 0000000>mov dword ptr ss:[ebp-10],0

  45. 004B9093    |.  3B46 4C         cmp eax,dword ptr ds:[esi+4C]
  46. 004B9096    |.  7F 0D           jg short de_folde.004B90A5
  47. 004B9098    |.  8B45 FC         mov eax,dword ptr ss:[ebp-4]
  48. 004B909B    |.  E8 C0B9F4FF     call de_folde.00404A60
  49. 004B90A0    |.  3B46 50         cmp eax,dword ptr ds:[esi+50]
  50. 004B90A3    |.  7D 0C           jge short de_folde.004B90B1     ;  再一次测试用户名长度

  51. 004B90B9    |.  8BD8            mov ebx,eax                      ;  取插入后的字符串长度
  52. 004B90BB    |.  EB 37           jmp short de_folde.004B90F4
  53. 004B90BD    |>  8B46 68         /mov eax,dword ptr ds:[esi+68]   ;  ?全局常量:777888999(2E5DA4E7)
  54. 004B90C0    |.  8B56 6C         |mov edx,dword ptr ds:[esi+6C]
  55. 004B90C3    |.  0345 F0         |add eax,dword ptr ss:[ebp-10]   ;  累加到EAX
  56. 004B90C6    |.  1355 F4         |adc edx,dword ptr ss:[ebp-C]
  57. 004B90C9    |.  52              |push edx
  58. 004B90CA    |.  50              |push eax
  59. 004B90CB    |.  8B45 E0         |mov eax,dword ptr ss:[ebp-20]
  60. 004B90CE    |.  0FB64418 FF     |movzx eax,byte ptr ds:[eax+ebx->;  按位取字符串的字符
  61. 004B90D3    |.  50              |push eax
  62. 004B90D4    |.  B8 59040000     |mov eax,459                     ;  常数0x459
  63. 004B90D9    |.  5A              |pop edx
  64. 004B90DA    |.  8BCA            |mov ecx,edx
  65. 004B90DC    |.  33D2            |xor edx,edx
  66. 004B90DE    |.  F7F1            |div ecx                         ;  将常量除以字符
  67. 004B90E0    |.  8BC2            |mov eax,edx                     ;  保留余数
  68. 004B90E2    |.  33D2            |xor edx,edx
  69. 004B90E4    |.  290424          |sub dword ptr ss:[esp],eax      ;  将全局常量减去余数
  70. 004B90E7    |.  195424 04       |sbb dword ptr ss:[esp+4],edx
  71. 004B90EB    |.  58              |pop eax
  72. 004B90EC    |.  5A              |pop edx
  73. 004B90ED    |.  8945 F0         |mov dword ptr ss:[ebp-10],eax   ;  保存到esp-10处(局域变量)
  74. 004B90F0    |.  8955 F4         |mov dword ptr ss:[ebp-C],edx
  75. 004B90F3    |.  4B              |dec ebx
  76. 004B90F4    |>  8B45 E0          mov eax,dword ptr ss:[ebp-20]
  77. 004B90F7    |.  E8 64B9F4FF     |call de_folde.00404A60
  78. 004B90FC    |.  3BD8            |cmp ebx,eax
  79. 004B90FE    |.  7F 04           |jg short de_folde.004B9104
  80. 004B9100    |.  85DB            |test ebx,ebx
  81. 004B9102    |.^ 7F B9           \jg short de_folde.004B90BD
  82. 004B9104    |>  8B5E 60         mov ebx,dword ptr ds:[esi+60]
复制代码
分析完了,开始写KeyGen了,呵呵!
完整的C++代码如下:

  1. #include<stdio.h>
  2. #include<iOStream>
  3. using namespace std;

  4. int main()
  5. {
  6.         char gstr[]="gf258369gf";
  7.         char name[100]={0};
  8.         cout<<"Please Enter Your Name:(Not Space,>3)\n";
  9.         cin>>name;
  10.        
  11.         char tmpStr[128]={0};
  12.         int i=0;
  13.         for(i=0;i<5;i++)
  14.                 tmpStr[i]=gstr[i];
  15.        
  16.         int len=strlen(name);
  17.         for(int j=0;j<len;j++,i++)
  18.                 tmpStr[i]=name[j];
  19.                
  20.         for(int j=5;j<10;j++,i++)
  21.                 tmpStr[i]=gstr[j];
  22.                
  23.         __int64 nCode=0;
  24.         len=strlen(tmpStr);
  25.         len--;
  26.         while(tmpStr[len]){
  27.                 nCode+=0x2E5DA4E7;
  28.                 nCode-=(0x459 % tmpStr[len]);
  29.                 len--;
  30.         }
  31.        
  32.         cout<<"Your RegCode is: ";
  33.         cout.width(10);
  34.         cout.fill('0');
  35.         cout.setf(ios_base::uppercase);
  36.         cout<<hex<<nCode<<endl;;
  37.        
  38.         cout<<"Please Enter a Key to Exit…………\n";
  39.         getchar();
  40.         getchar();
  41.         return 0;
  42. }
复制代码

[ 本帖最后由 iawen 于 2009-1-20 23:45 编辑 ]
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2025-1-4 11:46
  • 签到天数: 1861 天

    [LV.Master]伴坛终老

    发表于 2009-1-20 11:44:32 | 显示全部楼层
    多谢iawen楼主的破解分析,支持你出的多款软件算法注册机.
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-1-20 11:51:16 | 显示全部楼层
    向楼主学习了/:good /:good
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-5-1 14:44
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2009-1-20 23:44:15 | 显示全部楼层
    支持一下!!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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