crackmenet1 網絡驗證破解之入門級

前言: 今天無聊的很,看到看雪很早以前的一篇文章,手癢,加上很久沒寫什麼技術文章了,入門級又簡單寫,爲了給自己多加篇日誌隧寫此文,大牛就不必浪費時間看

感謝:   crackmenet1作者 riijj 、 看雪論壇平臺

原貼地址: http://bbs.pediy.com/showthread.php?t=32100

難度:  入門級

作者批註: 這是一個網絡驗證的 crackme,兩個檔案分別是 crackme 和 server,操作方法是,先運行 server,然後運行 crackme。這個 crackme 是十分容易的入門級,新手 可以嘗試爆破,或找出正確序號。
要求: 這個 crackme 理論上沒有 keygen ,但是兄弟們可以試試,不調試 server 程序(假設自己觸摸不到 server 程序真身)只從crackme的結構分析,寫出一個可 以替代 真正server的“僞server程序”如果能夠使用自己的“僞server程序”成功完成註冊的話(任何註冊名字都成功),那便算是這個crackme的完美破解

解:

直接將 crackmenet1.exe 託入IDA Pro 看關鍵算法


流程:

1、 取註冊名,計算其各個字節的和總值(範圍不超過char) ,最後得到異或運算的 keyValue

2、將服務器返回的值前6字節與 keyValue 進行異或運算,得到比較值 cmpRes

3、用 cmpRes 與 "CHKPS"  進行字符串對比,相等則成功

破解思路:

1、以客戶端同算法算出註冊名的異或關鍵值

2、發送異或後的"CHKPS"

實現代碼:

#include "stdafx.h"
#include <WinSock2.h>
#include <windows.h>

#pragma comment(lib, "Ws2_32.lib")

int _tmain(int argc, _TCHAR* argv[])
{
	// MSDN copy listen Example Code
	WSADATA wsaData;
	int iResult = 0;
	SOCKET ListenSocket = INVALID_SOCKET;
	sockaddr_in service;
	iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (iResult != NO_ERROR) {
		wprintf(L"Error at WSAStartup()\n");
		return 1;
	}
	ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (ListenSocket == INVALID_SOCKET) {
		wprintf(L"socket function failed with error: %u\n", WSAGetLastError());
		WSACleanup();
		return 1;
	}
	service.sin_family = AF_INET;
	service.sin_addr.s_addr = inet_addr("127.0.0.1");
	service.sin_port = htons(8877);
	iResult = bind(ListenSocket, (SOCKADDR *)&service, sizeof (service));
	if (iResult == SOCKET_ERROR) {
		wprintf(L"bind failed with error %u\n", WSAGetLastError());
		closesocket(ListenSocket);
		WSACleanup();
		return 1;
	}
	else
		wprintf(L"bind returned success\n");

	if (listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR)
		wprintf(L"listen function failed with error: %d\n", WSAGetLastError());
	// 下面開始關鍵算法計算
	fd_set readfds;
	while ( true )
	{
		char name[24] = { 0 };
		char regkey[24] = { 0 };

		readfds.fd_array[0] = ListenSocket;
		readfds.fd_count = 1;
		iResult = select(NULL, &readfds, NULL, NULL, NULL);
		int aptFD = accept(ListenSocket, NULL, NULL);

		recv(aptFD, name, 20, 0);
		recv(aptFD, regkey, 20, 0);
		Sleep(500);
		// 根據客戶端逆出來的算法計算異或的key值
		UCHAR orKey = 1;
		int namelen = strlen(name);
		for (int i = 0; i < namelen; ++i)
			orKey += name[i];
		// 計算異或後的返回值
		CHAR reskey[6] = { "CHKPS" };
		for (int i = 0; i < 6; ++i)
			reskey[i] ^= orKey;
		send(aptFD, reskey, 6, 0);
	}
	closesocket(ListenSocket);
	WSACleanup();
	return 0;
}


運行僞server後任何註冊都將成功,效果圖:



發佈了32 篇原創文章 · 獲贊 13 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章