能力值:
(RANK:350 )
2 楼
谢谢riijj!
前2天和riijj聊了一下网络验证,请riijj出手写了一个简单的crackme,大家一起来学习。
能力值:
( LV9,RANK:1170 )
3 楼
下来试试!
能力值:
(RANK:300 )
4 楼
最初由 kanxue 发布 谢谢riijj! 前2天和riijj聊了一下网络验证,请riijj出手写了一个简单的crackme,大家一起来学习。
老大客气了
能力值:
( LV2,RANK:10 )
5 楼
name:frip
key: QCMIOCSQKQSQESKSYIYQ
能力值:
(RANK:300 )
6 楼
最初由 frip 发布 name:frip key: QCMIOCSQKQSQESKSYIYQ
恭喜
在现实中我们当然不可以调试 server (不在我们家中),所以没有可能检到序号
唯一方法是爆破
能力值:
(RANK:300 )
7 楼
这个 crackme 理论上没有 keygen ,但是兄弟们可以试试,不调试 server 程序 (假设自己触摸不到 server 程序真身)
只从 crackme 的结构分析,写出一个可以替代真正 server 的 “伪 server 程序”
如果能够使用自己的 “伪 server 程序” 成功完成注册的话 (任何注册名字都成功),那便算是这个 crackme 的完美破解
能力值:
( LV2,RANK:10 )
8 楼
server端返回的注册失败数据与注册信息运算之后为“CHKFL”意为检查失败。
该客户端拿它与一固定字串“CHKPS”(检查通过?)比较,相同则成功。
具体算法部分还没细研究,到dian了。只要把固定字串“CHKPS”改为“CHKFL”即可爆破。
注册机嘛就是研究一下返回数据怎么得到“CHKFL”的,然后用“CHKPS”逆运算回去得到成功的返回数据,有时间再研究。
能力值:
( LV2,RANK:10 )
9 楼
1、得到注册名
2、注册名所有字节相加再+1存入EAX
3、“CHKPS”按字节与AL异或得到“XXXXX”,再加上一个字节值为AL
4、将结果返回客户端
能力值:
(RANK:300 )
10 楼
最初由 女子study 发布 1、得到注册名 2、注册名所有字节相加再+1存入EAX 3、“CHKPS”按字节与AL异或得到“XXXXX”,再加上一个字节值为AL 4、将结果返回客户端
恭喜
能力值:
( LV2,RANK:10 )
11 楼
谢谢版主,继续努力
能力值:
( 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了,,,我想我没这么背正好填的用户名跟注册码是对的吧.呵呵
能力值:
( LV2,RANK:10 )
13 楼
我想问个问题,我能不能把调用send函数那段给去掉,不发送也不接收???
然后自己弄段代码填那个0012F974,这样可行吗?要去掉send和recv直接把调用它们的地方改了行吗?
能力值:
( 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();
}
}
}
能力值:
( LV6,RANK:90 )
15 楼
会修改的帮忙修改一下了~呵呵,这个是源代码包.
上传的附件:
能力值:
( LV6,RANK:90 )
16 楼
能力值:
(RANK:300 )
17 楼
最初由 笑云天 发布 我想问个问题,我能不能把调用send函数那段给去掉,不发送也不接收??? 然后自己弄段代码填那个0012F974,这样可行吗?要去掉send和recv直接把调用它们的地方改了行吗?
对于爆破来说,你可以把中间所有验证都跳过 (插入一个 jmp,飞到终点) , 或是修改关键跳转 (jnz < - > jz)
很多方法
能力值:
(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
能力值:
( 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();
}
}
}
上传的附件:
能力值:
( LV6,RANK:90 )
20 楼
附件是编译后的可执行程序.
上传的附件:
能力值:
( 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();
}
能力值:
(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);
能力值:
( LV2,RANK:10 )
23 楼
如果碰到server端无法触摸,而cleint加了猛壳的,怎么通过sniffer分析加密的报文呢?
能力值:
( LV9,RANK:1130 )
24 楼
啊!!原来这个cm是9月18日的。我所我怎么没有映像呢。
不然说不定我也搞得定它,嘿嘿。吹牛吹牛
能力值:
( LV2,RANK:10 )
25 楼
winsock 一般都要如何做断点?
抓参考函数?
如果在注解中都带点 抓断点的信息就 对于我们这样的初学者就有更大的福分了 呵呵