首页
社区
课程
招聘
[旧帖] [分享]原创— 新手的超简单的注册机(申请邀请码) 0.00雪花
发表于: 2010-9-17 20:01 2340

[旧帖] [分享]原创— 新手的超简单的注册机(申请邀请码) 0.00雪花

2010-9-17 20:01
2340
我的第一个注册机,超简单,另附上源代码,VC++6.0编译通过,
看雪论坛的PEDIY CrackMe 2007 中有篇文章,是作 者: shuair  的,
简单的crackme,作者分析的 非常好, 我也看懂了,就是用C写不出C版注册机,好痛苦啊,论坛请教过各位 高手, 2010-06-06, 15:01:03  【原创】自学 ? 太难 !Windows编程,
我以上为题曾 请教过,问过 ,
                    其中 Ditans 会员曾给我提到过,

用户名^0x5678=中间量1
中间量1 ^0x1234=密码
本来这个我是知道的,可是为什么就是写不出呢,

有天终于 让我 发现了,10进制, 16进制,这个最基本问题, OD 中的数字都是,16进制数,

举例说明:运行 我的注册机 ,输入 用户名:user 就可以得到 注册码 4573, 其实这就是 注册码,不过是16 进制数, 注册码 空格中 需要是10 进制数 ,所以需要 16进制 10 进制数 才行,转换 很easy,
4573H  =  17779D ,注意,这里的 17779 是个 10 进制数,
也说明我不仔细,
啊,还想到  输入 注册码 反推 用户名,可惜,太难,向 是 解 不定方程
实在 写不出来,谁会,告诉我一声, 多谢了,
以下 是源代码,附件 打包中有 源代码,注册机,作 者: shuair原文,和 Crackme 程序,运行 请 在 cmd 下,  

发 几句 牢骚! 还 , 不能 升级 成为 会员, 想下 些资料 回去, 都 不成 ,钱 用 完了,就 1  Kx ,买啥 都不成

shuair原文 分析的 很好 ,我 自己在写 未必有 他的 好,就付上 他的原文 把

===============================================
标 题: 简单分析crackme算法之一
作 者: shuair
时 间: 2006-08-02 14:01
附 件: crackme1.zip
链 接: http://bbs.pediy.com/showthread.php?threadid=29982
详细信息:
【文章标题】: 简单分析crackme算法之一
【文章作者】: shuair
【软件名称】: CRACKME.EXE
【软件大小】: 6.56 KB
【下载地址】: 本地下载
【加壳方式】: 无
【保护方式】: 注册码
【编写语言】: MASM32 / TASM32 [Overlay]
【使用工具】: OD
【操作平台】: Windows 2003
【作者声明】: 业余爱好,欢迎交流!
--------------------------------------------------------------------------------
【详细过程】
  一,用PEID查壳为MASM32 / TASM32 [Overlay]无壳。
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++
  二,运行软件,注册窗口进行注册,输入错误的注册信息进行检测!软件有尾巴!
   提示说:“No luck there mate!”
  用OD载入,右键超级字串查找,找到"No luck there mate!",双击进入程序代码段,往上查找,在一个合适的地方下断。
00401382  |.  56            push    esi                        ;  CRACKME.0040218E
00401383  |>  8A06          /mov     al, [esi]      获取第一位
00401385  |.  84C0          |test    al, al
00401387  |.  74 13         |je      short 0040139C   
00401389  |.  3C 41         |cmp     al, 41      
0040138B  |.  72 1F         |jb      short 004013AC    小于41
0040138D  |.  3C 5A         |cmp     al, 5A      
0040138F  |.  73 03         |jnb     short 00401394    如果大于等于5A   检查!
00401391  |.  46            |inc     esi      
00401392  |.^ EB EF         |jmp     short 00401383  
00401394  |>  E8 39000000   |call    004013D2
00401399  |.  46            |inc     esi      
0040139A  |.^ EB E7         \jmp     short 00401383
0040139C  |>  5E            pop     esi            
0040139D  |.  E8 20000000   call    004013C2              ; |这里是用户名位数想加,进入看看!
004013A2  |.  81F7 78560000 xor     edi, 5678          //结果与5678 xor
004013A8  |.  8BC7          mov     eax, edi
004013AA  |.  EB 15         jmp     short 004013C1
004013AC  |>  5E            pop     esi
004013AD  |.  6A 30         push    30                               ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
004013AF  |.  68 60214000   push    00402160                         ; |Title = "No luck!"
004013B4  |.  68 69214000   push    00402169                         ; |Text = "No luck there, mate!"
004013B9  |.  FF75 08       push    dword ptr [ebp+8]                ; |hOwner
004013BC  |.  E8 79000000   call    <jmp.&USER32.MessageBoxA>        ; \MessageBoxA
004013C1  \>  C3            retn    //注册码位置

用户名CALL算法:

004013C2  /$  33FF          xor     edi, edi
004013C4  |.  33DB          xor     ebx, ebx
004013C6  |>  8A1E          /mov     bl, [esi]           ; 取第一位
004013C8  |.  84DB          |test    bl, bl
004013CA  |.  74 05         |je      short 004013D1
004013CC  |.  03FB          |add     edi, ebx           ; 第一位和0加保存=edi ;;第二次=第一次结果+第二位
004013CE  |.  46            |inc     esi
004013CF  |.^ EB F5         \jmp     short 004013C6

来到这里:

00401232   .  50            push    eax
00401233   .  68 7E214000   push    0040217E                         ;  ASCII "78"
00401238   .  E8 9B010000   call    004013D8           ;  算法
0040123D   .  83C4 04       add     esp, 4
00401240   .  58            pop     eax
00401241   .  3BC3          cmp     eax, ebx           ;  用户名的与5678异或的结果与注册码比较
00401243   .  74 07         je      short 0040124C         ;  爆炸点
00401245   .  E8 18010000   call    00401362
0040124A   .^ EB 9A         jmp     short 004011E6
0040124C   >  E8 FC000000   call    0040134D
00401251   .^ EB 93         jmp     short 004011E6
00401253  /.  C8 000000     enter   0, 0
00401257  |.  53            push    ebx
00401258  |.  56            push    esi
00401259  |.  57            push    edi

进入算法Call

004013D8  /$  33C0          xor     eax, eax           ;   清0
004013DA  |.  33FF          xor     edi, edi           ;   清0
004013DC  |.  33DB          xor     ebx, ebx           ;   清0
004013DE  |.  8B7424 04     mov     esi, [esp+4]               ;   取注册码78  
004013E2  |>  B0 0A         /mov     al, 0A           
004013E4  |.  8A1E          |mov     bl, [esi]           ;   取注册码第一位7   取8
004013E6  |.  84DB          |test    bl, bl
004013E8  |.  74 0B         |je      short 004013F5
004013EA  |.  80EB 30       |sub     bl, 30           ;   37-30    38-30
004013ED  |.  0FAFF8        |imul    edi, eax           ;   0*A  第一位结果edi*A
004013F0  |.  03FB          |add     edi, ebx           ;   得到的结果加第一位=edi    edi*a+第二位  
                                                                     ;   
004013F2  |.  46            |inc     esi           ;   下一位
004013F3  |.^ EB ED         \jmp     short 004013E2      
004013F5  |>  81F7 34120000 xor     edi, 1234           ;    (edi*a+第二位)结果 与 1234 异或
004013FB  |.  8BDF          mov     ebx, edi         
004013FD  \.  C3            retn

--------------------------------------------------------------------------------
【经验总结】
  它的算法是:
  用户名的位数想加得到的数与5678做异或运算
  
  注册码第一位-30 = 用A标记   第二次很明显了哦~  
  第一位 * A(这里被初始为0了;;;这句xor     eax, eax) = B 标记   第二次循环时:第一位结果edi*A
  第一位edi+0 =C 标记    ;;;第二次时:edi*a+第二位
  最后的出edi 与 1234 做异或! 比较注册名与注册码是否相等,如果相等成功.不等OVER.描述有些乱边调试边对照边想想就OK!
  
  后记:有一年多没有来看雪了,突然有种兴奋就有了这篇破文,适合菜鸟看!
  PS:感觉论坛很慢!!!!HOHO

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
看来还是得慢满学习哦
2010-9-17 20:43
0
雪    币: 125
活跃值: (161)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
#include<stdio.h>
#include<string.h>

int main()
{
	int i,sum=0;
	char code[20];
	scanf("%s",&code);
	int codelen = strlen(code);
	if(codelen==0) //用户名为空 挂。。
		return 0;
	for(i=0;i<codelen;i++)
	{
		if(code[i]<'A')  //用户名ASCII码小于字符'A'    挂
			return 0;
		if(code[i]>'Z')
			code[i]-=32;   //如果字符ASCII码大于'Z'  减去32。(其实作者原意应该是小写直接转换成大写)
	}
	
	for(i=0;i<codelen;i++)
	{
		sum+=code[i];    //把用户名每一位ASCII码加到一起
	}
	sum^=0x5678; //异或上0x5678 (16进制哦)
	sum^=0x1234; //crack me中这里是对密码进行的异或 , 解密的时候也是直接异或就行了。(异或的特性知道吧~)
	printf("%d\n",sum);
	
	return 0;
}


异或 加 明码比较~   
我觉得LZ你还是要自己仔细去分析。。
其实这个不是太难。 特别是异或

如果要逆运算的话 直接再异或运算就行了。
2010-9-17 22:11
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
zhangtaopy 的分析 就是

原来这么 简单, 多谢 zhangtaopy 的 点拔 ,,

直接 用 注册码 ^ 就行 了 我现在 想明白了
应该 是 注册码^5678^1234, 用16 进制 ,就应该是 用户名

输入: 用户名
输入: 注册码

注册码^5678^1234 =   用户名 , 1234,5678 都是 16 进制 ,

不对, zhangtaopy 会员,

原 Crackme 的 用户名 是只能用 ascii 码 字符,莫非 用

%c 转换 , printf("m= %c  ",m );  
m 是  用户名  ( 或者  m 为注册码 )

希望 有心人  都能  进步  !!

感谢  看雪  这 一很好 的 平台 !!
2010-9-18 20:13
0
游客
登录 | 注册 方可回帖
返回
//