首页
社区
课程
招聘
riijj ? crackme net-1 网络验证 (初级)
发表于: 2006-9-18 12:00 23812

riijj ? crackme net-1 网络验证 (初级)

2006-9-18 12:00
23812

名字: riijj ? crackme net-1
难度: 初级入门
批注: 这是一个网络验证的 crackme,两个档案分别是 crackme 和 server,操作方法是,先运行 server,然后运行 crackme。这个 crackme 是十分容易的入门级,新手可以尝试爆破,或找出正确序号。

信息: 没有壳, 没有 anti-debug


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (46)
雪    币: 47147
活跃值: (20450)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
谢谢riijj!
前2天和riijj聊了一下网络验证,请riijj出手写了一个简单的crackme,大家一起来学习。
2006-9-18 13:46
0
雪    币: 461
活跃值: (93)
能力值: ( LV9,RANK:1170 )
在线值:
发帖
回帖
粉丝
3
下来试试!
2006-9-18 13:49
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
4
最初由 kanxue 发布
谢谢riijj!
前2天和riijj聊了一下网络验证,请riijj出手写了一个简单的crackme,大家一起来学习。

老大客气了
2006-9-18 14:03
0
雪    币: 215
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
name:frip

key: QCMIOCSQKQSQESKSYIYQ
2006-9-18 14:22
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
6
最初由 frip 发布
name:frip

key: QCMIOCSQKQSQESKSYIYQ

恭喜

在现实中我们当然不可以调试 server (不在我们家中),所以没有可能检到序号
唯一方法是爆破
2006-9-18 14:37
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
7
这个 crackme 理论上没有 keygen ,但是兄弟们可以试试,不调试 server 程序 (假设自己触摸不到 server 程序真身)

只从 crackme 的结构分析,写出一个可以替代真正 server 的 “伪 server 程序”

如果能够使用自己的 “伪 server 程序” 成功完成注册的话  (任何注册名字都成功),那便算是这个 crackme 的完美破解

2006-9-18 15:26
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
server端返回的注册失败数据与注册信息运算之后为“CHKFL”意为检查失败。
该客户端拿它与一固定字串“CHKPS”(检查通过?)比较,相同则成功。
具体算法部分还没细研究,到dian了。只要把固定字串“CHKPS”改为“CHKFL”即可爆破。
注册机嘛就是研究一下返回数据怎么得到“CHKFL”的,然后用“CHKPS”逆运算回去得到成功的返回数据,有时间再研究。
2006-9-19 14:12
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
1、得到注册名
2、注册名所有字节相加再+1存入EAX
3、“CHKPS”按字节与AL异或得到“XXXXX”,再加上一个字节值为AL
4、将结果返回客户端
2006-9-19 15:19
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
10
最初由 女子study 发布
1、得到注册名
2、注册名所有字节相加再+1存入EAX
3、“CHKPS”按字节与AL异或得到“XXXXX”,再加上一个字节值为AL
4、将结果返回客户端

恭喜
2006-9-19 16:31
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
谢谢版主,继续努力
2006-9-19 17:03
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
呃,第一次弄个这个,不知道怎么搞,瞎来了,技术又不行,想到了做不出来...
因为既然是网络注册,当然就要假设我没有服务器端,所以我拿到服务器端就是运行在那里,没有对服务器端进行任何操作,由于水平有限,虽然知道服务器传回来的结果,但是反推不出9楼的那种算法,我只知道本地是怎么验证的,就是拿注册名的各个字符相加再加1,得出来的低位(?是低位吗?我学汇编不好,高低不分..)和服务器传回来的"XXXXX"进行Xor运算,结果为"CHKFL"失败,(为"CHKPS"成功,??),

我就想在文件中插入自己的代码,将输入的注册名(在0012F98C可以找到)各个字符相加,低位(?)与"CHKPS"五个字符分别进行Xor运算,得出来的结果分别填到0012F974处,
注意,在
7C9513E2    FF12            call    [edx]
7C9513E4    C2 2800         retn    28

这个call里面就是从服务器接收信息(猜的,反正出来就变成了服务器传回来的东西,我汇编比较次,看不懂),只要在这句之后把0012F974中的内容变成上面说的运算结果,那么就可以成功注册.我不会用汇编写程序,所以放弃了.....

第二个,比上一个简单点,但是也要自己加代码,所以放弃了,但是是可行的,

00401331  |> /8A4C04 14     /mov     cl, [esp+eax+14]
00401335  |. |32CA          |xor     cl, dl
00401337  |. |884C04 14     |mov     [esp+eax+14], cl
0040133B  |. |40            |inc     eax
0040133C  |. |83F8 06       |cmp     eax, 6
0040133F  |.^\72 F0         \jb      short 00401331
这个循环里面,把服务器传回来的"XXXXX"经过Xor运算变成了"CHKFL"(或者"CHKPS"??),如果能够在这个循环之后跳到自己添加的代码中,将0012F974写成"CHKPS",那么也可以成功注册.

第三个最简单,前面我总是想把要验证的东西,跟样品比较,其实反过来想,我们拿样品去跟要验证的东西比也是一样的,而且跟0012F974中的"CHKFL"进行比较的字符串总是固定的,就是"CHKPS",而且这个还是在程序中固定的字符串,所以我直接用winhex找到这个字符串,改成CHKFL,OK了,,,我想我没这么背正好填的用户名跟注册码是对的吧.呵呵
2006-9-19 22:27
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我想问个问题,我能不能把调用send函数那段给去掉,不发送也不接收???
然后自己弄段代码填那个0012F974,这样可行吗?要去掉send和recv直接把调用它们的地方改了行吗?
2006-9-19 22:31
0
雪    币: 234
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
14
呵呵,算法是比较简单的,不过要用程序要虚拟服务器,我还比较菜,本人不懂编程,从MSDN上搜了下socket编程,C#,有一点还不会,就是字符串与用户名的ASCII码之SUM值+1低位做异或运算,不知道如何写,如有知道的,请帮忙贴上,以便学习。
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace $safeprojectname$
{
    class Class1
    {
        //定义端口号
        private const int porNum = 8877;
        [STAThread]
        static void Main(string[] args)
        {
            bool done = false;
            TcpListener listener = null;
            //定义监听主机IP地址
            IPAddress localAddr = IPAddress.Parse("127.0.0.1");
            listener = new TcpListener(localAddr,porNum);
            listener.Start();
            while (!done)
            {
                Console.Write("******虚拟riijj服?器******\n正在侦听8877端口...");
                TcpClient client = listener.AcceptTcpClient();
                Console.WriteLine("\n接收用户名及密码...");
                NetworkStream ns = client.GetStream();
                byte[] bytes = new byte[256];
                int bytesRead = ns.Read(bytes, 0, bytes.Length);
                Console.WriteLine("用户名:");
                //获取输入用户名
                int i=0;
                String data1 = null;
                while (bytes[i] != 0)
                {
                    data1 = null;
                    data1 = System.Text.Encoding.ASCII.GetString(bytes, 0, i+1);
                    i++;
                }
                //处理用户名,ASCII码之Sum值+1,然后取低位跟CHKPS做异或运算
                //char[] w = new char[20];
                char[] b = new char[20];
                data1.CopyTo(0,b,0,data1.Length);
                Int32 data3 = 0;
                for (int y = 0; y < data1.Length; y++)
                {
                    data3 += (int)b[y]++;
                }
                Console.WriteLine(data1);
                //Int32 m;
                //m = Convert.ToInt32("C", 10) ^ data3;
                Console.WriteLine(data3);
                Console.WriteLine("密码:");
                //获取输入密码
                int j = 20;
                String data2 = null;
                while (bytes[j] != 0)
                {
                    data2 = null;
                    data2 = System.Text.Encoding.ASCII.GetString(bytes, 20, i);
                    j++;
                }
                Console.WriteLine(data2);
                byte[] sendData = Encoding.ASCII.GetBytes("CHKPS");
                //此处就是需要异或后的值来写入buff,因为还不会写,所以暂时用CHKPS来替代下;
                try
                {
                    ns.Write(sendData,0,sendData.Length);
                    ns.Close();
                    client.Close();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
            listener.Stop();
        }
    }
}
2006-9-20 00:21
0
雪    币: 234
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
15
会修改的帮忙修改一下了~呵呵,这个是源代码包.
上传的附件:
2006-9-20 08:35
0
雪    币: 234
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
16
这个是半成品~
上传的附件:
2006-9-20 08:36
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
17
最初由 笑云天 发布
我想问个问题,我能不能把调用send函数那段给去掉,不发送也不接收???
然后自己弄段代码填那个0012F974,这样可行吗?要去掉send和recv直接把调用它们的地方改了行吗?

对于爆破来说,你可以把中间所有验证都跳过 (插入一个 jmp,飞到终点) , 或是修改关键跳转  (jnz < - > jz)

很多方法
2006-9-20 10:50
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
18
最初由 inraining 发布
呵呵,算法是比较简单的,不过要用程序要虚拟服务器,我还比较菜,本人不懂编程,从MSDN上搜了下socket编程,C#,有一点还不会,就是字符串与用户名的ASCII码之SUM值+1低位做异或运算,不知道如何写,如有知道的,请帮忙贴上,以便学习。
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
........

这样便可以了

for (int y = 0; y < 6; y++)
{
   sendData[y] = (byte)(sendData[y] ^ data3);
}

注意长度是 6, 把 CHKPS 结尾的 \0 也 XOR
2006-9-20 13:32
0
雪    币: 234
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
19
我上午重新写了下,已经OK了,不过感觉又长又臭,呵呵,下午试试你写的那个看看是否可以,那样会简单很多.附件是源代码.
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace SocketServer
{
    class Class1
    {
        //定义端口号
        private const int porNum = 8877;
        [STAThread]
        static void Main(string[] args)
        {
            bool done = false;
            TcpListener listener = null;
            //定义监听主机IP地址
            IPAddress localAddr = IPAddress.Parse("127.0.0.1");
            listener = new TcpListener(localAddr,porNum);
            listener.Start();
            while (!done)
            {
                Console.Write("******虚拟riijj服?器******\n正在侦听8877端口...");
                TcpClient client = listener.AcceptTcpClient();
                Console.WriteLine("\n接收用户名及密码...");
                NetworkStream ns = client.GetStream();
                byte[] bytes = new byte[256];
                int bytesRead = ns.Read(bytes, 0, bytes.Length);
                Console.WriteLine("用户名:");
                //获取输入用户名
                int i=0;
                String data1 = null;
                while (bytes[i] != 0)
                {
                    data1 = null;
                    data1 = System.Text.Encoding.ASCII.GetString(bytes, 0, i+1);
                    i++;
                }
                //处理用户名,ASCII码之Sum值+1,然后取低位跟CHKPS做异或运算
                //char[] w = new char[20];
                char[] b = new char[20];
                data1.CopyTo(0,b,0,data1.Length);
                Int32 data3 = 0;
                for (int y = 0; y < data1.Length; y++)
                {
                    data3 += (int)b[y];
                }
                data3 = data3 + 1;
                string m;
                m=Convert.ToString(data3, 16).Substring((Convert.ToString(data3, 16).Length - 2), 2);
                Console.WriteLine(data1);
                char[] a = new char[5] {'C','H','K','P','S'};
                byte[] m1 = new byte[5];
                for(int x=0;x<5;x++)
                {
                    m1[x] = (byte)(int.Parse(m, System.Globalization.NumberStyles.HexNumber) ^ (int)a[x]);
                    Console.WriteLine("打印出与CHKPS分别异或后的值...");
                    Console.WriteLine(m1[x]);
                }
                Console.WriteLine("打印出(SUM+1)的值(AL)...");
                Console.WriteLine(m);
                Console.WriteLine("打印出(SUM+1)的值...");
                Console.WriteLine(Convert.ToString(data3,16));
                Console.WriteLine("打印出加密字符串(超出ASCII码范围的为问号)...");
                Console.WriteLine(System.Text.Encoding.ASCII.GetChars(m1));
                Console.WriteLine("密码:");
                //获取输入密码
                int j = 20;
                String data2 = null;
                while (bytes[j] != 0)
                {
                    data2 = null;
                    data2 = System.Text.Encoding.ASCII.GetString(bytes, 20, i);
                    j++;
                }
                Console.WriteLine(data2);
                byte[] sendData = m1;
                byte[] sendData1 = new byte[1];
                sendData1[0]=(byte)int.Parse(m, System.Globalization.NumberStyles.HexNumber);
                //向buffer写入异或的值+(SUM值+1)
                try
                {
                    ns.Write(sendData,0,sendData.Length);
                    ns.Write(sendData1, 0, 1);
                    ns.Close();
                    client.Close();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
            listener.Stop();
        }
    }
}
上传的附件:
2006-9-20 13:58
0
雪    币: 234
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
20
附件是编译后的可执行程序.
上传的附件:
2006-9-20 14:01
0
雪    币: 234
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
21
恩,重新修改一下.都可以OK,呵呵,简单多了.因为不会操作字符串所以上午都是看网络定义七并八凑的.
                char[] a = new char[6] {'C','H','K','P','S','\0'};
                byte[] m1 = new byte[6];
                for(int x=0;x<6;x++)
以及,
                //byte[] sendData1 = new byte[1];
                //sendData1[0]=(byte)int.Parse(m, System.Globalization.NumberStyles.HexNumber);
                //向buffer写入异或的值+(SUM值+1)
                try
                {
                    ns.Write(sendData,0,sendData.Length);
                    //ns.Write(sendData1, 0, 1);
                    ns.Close();
                    client.Close();
                }
2006-9-20 14:08
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
22
最初由 inraining 发布
恩,重新修改一下.都可以OK,呵呵,简单多了.因为不会操作字符串所以上午都是看网络定义七并八凑的.
char[] a = new char[6] {'C','H','K','P','S','\0'};
byte[] m1 = new byte[6];
for(int x=0;x<6;x++)
以及,
........


可以这样

byte[] sendData = new byte[6];
                Encoding.ASCII.GetBytes("CHKPS").CopyTo(sendData, 0);
2006-9-21 11:12
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
如果碰到server端无法触摸,而cleint加了猛壳的,怎么通过sniffer分析加密的报文呢?
2006-12-26 07:46
0
雪    币: 405
活跃值: (10)
能力值: ( LV9,RANK:1130 )
在线值:
发帖
回帖
粉丝
24
啊!!原来这个cm是9月18日的。我所我怎么没有映像呢。
不然说不定我也搞得定它,嘿嘿。吹牛吹牛
2006-12-26 08:59
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
winsock 一般都要如何做断点?

抓参考函数?

如果在注解中都带点 抓断点的信息就 对于我们这样的初学者就有更大的福分了 呵呵
2007-1-19 22:15
0
游客
登录 | 注册 方可回帖
返回
//