首页
社区
课程
招聘
[原创]Acid burn 算法注册机
发表于: 2014-9-10 23:55 7171

[原创]Acid burn 算法注册机

2014-9-10 23:55
7171

【破解作者】 Night
【作者主页】 www.freecracker.com
【使用工具】 OD
【破解平台】 Win7
【软件名称】 Acid_burn.zip
------------------------------------------------------------------------------------------------------------
0042F998  /.  55            push ebp
0042F999  |.  8BEC          mov ebp,esp
0042F99B  |.  33C9          xor ecx,ecx
0042F99D  |.  51            push ecx
0042F99E  |.  51            push ecx
0042F99F  |.  51            push ecx
0042F9A0  |.  51            push ecx
0042F9A1  |.  51            push ecx
0042F9A2  |.  51            push ecx
0042F9A3  |.  53            push ebx
0042F9A4  |.  56            push esi
0042F9A5  |.  8BD8          mov ebx,eax
0042F9A7  |.  33C0          xor eax,eax
0042F9A9  |.  55            push ebp
0042F9AA  |.  68 67FB4200   push path_gay.0042FB67
0042F9AF  |.  64:FF30       push dword ptr fs:[eax]
0042F9B2  |.  64:8920       mov dword ptr fs:[eax],esp
0042F9B5  |.  C705 50174300>mov dword ptr ds:[0x431750],0x29
0042F9BF  |.  8D55 F0       lea edx,[local.4]
0042F9C2  |.  8B83 DC010000 mov eax,dword ptr ds:[ebx+0x1DC]
0042F9C8  |.  E8 8BB0FEFF   call path_gay.0041AA58
0042F9CD  |.  8B45 F0       mov eax,[local.4]                        ;  获取用户名
0042F9D0  |.  E8 DB40FDFF   call path_gay.00403AB0                   ;  判断用户名不能为空
0042F9D5  |.  A3 6C174300   mov dword ptr ds:[0x43176C],eax
0042F9DA  |.  8D55 F0       lea edx,[local.4]
0042F9DD  |.  8B83 DC010000 mov eax,dword ptr ds:[ebx+0x1DC]
0042F9E3  |.  E8 70B0FEFF   call path_gay.0041AA58
0042F9E8  |.  8B45 F0       mov eax,[local.4]                        ;  获取用户名
0042F9EB  |.  0FB600        movzx eax,byte ptr ds:[eax]              ;  用户名的第一位放入到eax中
0042F9EE  |.  8BF0          mov esi,eax                              ;  用户名的第一位 放入到esi 中
0042F9F0  |.  C1E6 03       shl esi,0x3                              ;  esi = esi << 3
0042F9F3  |.  2BF0          sub esi,eax                              ;  esi = esi - eax
0042F9F5  |.  8D55 EC       lea edx,[local.5]
0042F9F8  |.  8B83 DC010000 mov eax,dword ptr ds:[ebx+0x1DC]
0042F9FE  |.  E8 55B0FEFF   call path_gay.0041AA58                   ;  返回用户名长度
0042FA03  |.  8B45 EC       mov eax,[local.5]
0042FA06  |.  0FB640 01     movzx eax,byte ptr ds:[eax+0x1]          ;  用户名的第二位保存到eax中
0042FA0A  |.  C1E0 04       shl eax,0x4                              ;  eax = eax << 4
0042FA0D  |.  03F0          add esi,eax                              ;  esi = esi + eax
0042FA0F  |.  8935 54174300 mov dword ptr ds:[0x431754],esi          ;  ds:[0x431754] = 8B2
0042FA15  |.  8D55 F0       lea edx,[local.4]
0042FA18  |.  8B83 DC010000 mov eax,dword ptr ds:[ebx+0x1DC]
0042FA1E  |.  E8 35B0FEFF   call path_gay.0041AA58                   ;  返回用户名长度
0042FA23  |.  8B45 F0       mov eax,[local.4]
0042FA26  |.  0FB640 03     movzx eax,byte ptr ds:[eax+0x3]          ;  用户名第四位保存到eax中
0042FA2A  |.  6BF0 0B       imul esi,eax,0xB                         ;  esi = eax * 0xB
0042FA2D  |.  8D55 EC       lea edx,[local.5]
0042FA30  |.  8B83 DC010000 mov eax,dword ptr ds:[ebx+0x1DC]
0042FA36  |.  E8 1DB0FEFF   call path_gay.0041AA58
0042FA3B  |.  8B45 EC       mov eax,[local.5]
0042FA3E  |.  0FB640 02     movzx eax,byte ptr ds:[eax+0x2]          ;  用户名第三位保存到 eax 中
0042FA42  |.  6BC0 0E       imul eax,eax,0xE                         ;  eax = eax * 0xE
0042FA45  |.  03F0          add esi,eax                              ;  esi = esi + eax
0042FA47  |.  8935 58174300 mov dword ptr ds:[0x431758],esi          ;  ds:[0x431758] = 0A1A
0042FA4D  |.  A1 6C174300   mov eax,dword ptr ds:[0x43176C]
0042FA52  |.  E8 D96EFDFF   call path_gay.00406930
0042FA57  |.  83F8 04       cmp eax,0x4
0042FA5A  |.  7D 1D         jge Xpath_gay.0042FA79                   ;  用户名必须大于等于四位
0042FA5C  |.  6A 00         push 0x0
0042FA5E  |.  B9 74FB4200   mov ecx,path_gay.0042FB74                ;  ASCII 54,"ry Again!"
0042FA63  |.  BA 80FB4200   mov edx,path_gay.0042FB80                ;  ASCII 53,"orry , The serial is incorect !"
0042FA68  |.  A1 480A4300   mov eax,dword ptr ds:[0x430A48]
0042FA6D  |.  8B00          mov eax,dword ptr ds:[eax]
0042FA6F  |.  E8 FCA6FFFF   call path_gay.0042A170
0042FA74  |.  E9 BE000000   jmp path_gay.0042FB37
0042FA79  |>  8D55 F0       lea edx,[local.4]
0042FA7C  |.  8B83 DC010000 mov eax,dword ptr ds:[ebx+0x1DC]
0042FA82  |.  E8 D1AFFEFF   call path_gay.0041AA58
0042FA87  |.  8B45 F0       mov eax,[local.4]
0042FA8A  |.  0FB600        movzx eax,byte ptr ds:[eax]              ;  取用户名第一位 保存到 eax 中
0042FA8D  |.  F72D 50174300 imul dword ptr ds:[0x431750]             ;  eax = eax * ds:[0x431750]
0042FA93  |.  A3 50174300   mov dword ptr ds:[0x431750],eax          ;  ds:[0x431750] = 0xC7E
0042FA98  |.  A1 50174300   mov eax,dword ptr ds:[0x431750]
0042FA9D  |.  0105 50174300 add dword ptr ds:[0x431750],eax          ;  ds:[0x431750] = ds:[0X431750]*2
0042FAA3  |.  8D45 FC       lea eax,[local.1]
0042FAA6  |.  BA ACFB4200   mov edx,path_gay.0042FBAC
0042FAAB  |.  E8 583CFDFF   call path_gay.00403708
0042FAB0  |.  8D45 F8       lea eax,[local.2]
0042FAB3  |.  BA B8FB4200   mov edx,path_gay.0042FBB8
0042FAB8  |.  E8 4B3CFDFF   call path_gay.00403708
0042FABD  |.  FF75 FC       push [local.1]
0042FAC0  |.  68 C8FB4200   push path_gay.0042FBC8                   ;  UNICODE "-"
0042FAC5  |.  8D55 E8       lea edx,[local.6]
0042FAC8  |.  A1 50174300   mov eax,dword ptr ds:[0x431750]
0042FACD  |.  E8 466CFDFF   call path_gay.00406718                   ;  这个函数
0042FAD2  |.  FF75 E8       push [local.6]
0042FAD5  |.  68 C8FB4200   push path_gay.0042FBC8                   ;  UNICODE "-"
0042FADA  |.  FF75 F8       push [local.2]
0042FADD  |.  8D45 F4       lea eax,[local.3]
0042FAE0  |.  BA 05000000   mov edx,0x5
0042FAE5  |.  E8 C23EFDFF   call path_gay.004039AC                   ;  拼接生成真的Key值
0042FAEA  |.  8D55 F0       lea edx,[local.4]
0042FAED  |.  8B83 E0010000 mov eax,dword ptr ds:[ebx+0x1E0]
0042FAF3  |.  E8 60AFFEFF   call path_gay.0041AA58                   ;  获取Key值
0042FAF8  |.  8B55 F0       mov edx,[local.4]                        ;  假的Key值
0042FAFB  |.  8B45 F4       mov eax,[local.3]                        ;  真的Key值
0042FAFE  |.  E8 F93EFDFF   call path_gay.004039FC                   ;  比较

Key值中间部分计算函数 如下
00406DC2  |$  B9 0A000000   mov ecx,0xA                              ;  ecx = 0xA
00406DC7  |>  8D75 C4       lea esi,[local.15]
00406DCA  |>  31D2          /xor edx,edx                             ;  edx 清零
00406DCC  |.  F7F1          |div ecx                                 ;  eax / ecx  eax中存放商  edx 中存放余数
00406DCE  |.  80C2 30       |add dl,0x30                             ;  dl = dl + 0x30
00406DD1  |.  80FA 3A       |cmp dl,0x3A                             ;  判断dl  是否 小于 0x3A
00406DD4  |.  72 03         |jb Xpath_gay.00406DD9
00406DD6  |.  80C2 07       |add dl,0x7                              ;  如果不小于0x3A  的话  dl = dl + 0x7
00406DD9  |>  4E            |dec esi
00406DDA  |.  8816          |mov byte ptr ds:[esi],dl                ;  保存结果
00406DDC  |.  09C0          |or eax,eax
00406DDE  |.^ 75 EA         \jnz Xpath_gay.00406DCA
00406DE0  |.  8D4D C4       lea ecx,[local.15]
00406DE3  |.  29F1          sub ecx,esi
00406DE5  |.  8B55 E0       mov edx,[local.8]
00406DE8  |.  83FA 10       cmp edx,0x10
00406DEB  |.  72 01         jb Xpath_gay.00406DEE
00406DED  |.  C3            retn

注册机代码如下 :
/***
*   Acid burn.exe 程序注册机  
*   完成时间: 2014年9月10日  23:43   
*   完成人  : Night
*/

#include "stdafx.h"
#include "string.h"

int _tmain(int argc, _TCHAR* argv[])
{
        //存放用户名
        char userName[100]        = {0};
        //内存00431750地址处的值
        unsigned int value_431750 = 0x29;
        //临时存放值
        unsigned int value        = 0;
        //控制数组下标
        unsigned int k                          = 0;
        //程序中初始化的值
        unsigned int x                          = 0xA;
        //存放商
        unsigned int quotient     = 0;
        //存放余数
        unsigned int mod                  = 0;
        //存放结果
        unsigned int result[10]          = {0};
        //把存放的结果转化成字符再倒置
        char         encode[10]   = {0};
        //CrackMe程序初始化注册码的前缀
        char         before  [30] = "CW-";
        //CrackMe程序初始化注册码的后缀
        char         after   [9]  = "-CRACKED";

        printf("请输入用户名:");
        gets_s(userName);

        value = userName[0] * value_431750;
        value = value * 2;

        do
        {
                mod      = 0;
                quotient = value / x ;
                mod      = value % x ;

                mod = mod + 0x30;

                if(mod > 0x3A)
                {
                        mod = mod + 0x7;
                }
                result[k++] = mod ;

                value = quotient;
        } while (value);

        for (int i = 0; i < k; i++)
        {
                encode[k-i-1] = result[i];
        }
        strcat_s(before,encode);
        strcat_s(before,after);
        puts(before);
        printf("\n");
        return 0;
}

PS: VS2012 编译,如果注册机有问题或者有更简洁的算法 请大神们多多指教。谢谢


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 3
支持
分享
最新回复 (4)
雪    币: 96
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
太高深了,看不懂
2014-9-11 08:00
0
雪    币: 86
活跃值: (1183)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
很久没看过算法了
2014-9-11 11:30
0
雪    币: 10887
活跃值: (3919)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不懂算法,感谢分享了,学习
2014-9-11 19:03
0
雪    币: 517
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
手贱,爱瞎改:

#include "stdio.h"
#include "string.h"

void main()
{
    unsigned char userName[100] = {0};  //存放用户名
    int value = 0;             //临时存放值
    int i,k = 0;               //控制数组下标
    int result[10] = {0};      //存放结果
    char encode[10] = {0};     //把存放的结果转化成字符再倒置
    char before[30] = "CW-";   //CrackMe程序初始化注册码的前缀
    char after[9] = "-CRACKED";//CrackMe程序初始化注册码的后缀
	
	do
	{
		printf("请输入用户名:\n");
		gets(userName);
		if(userName[0]==0) break;
		value = userName[0] * 0x52;
		do
		{
			result[k++] = (value % 10) + 0x30;
			value /=  10;
		} while (value);

		for ( i = 0; i < k; i++)
			encode[k-i-1] = result[i];
		strcat(before,encode);
		strcat(before,after);
		printf("注册码为:\n%s\n\n",before);
		strcpy(before,"CW-");
	} while(1);
}

VC6通过。
2014-9-11 22:16
0
游客
登录 | 注册 方可回帖
返回
//