国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

cm練習-2017-0217

2019-11-08 03:05:05
字體:
來源:轉載
供稿:網友

前言

今天做了一個cm, 用了好長時間, 扒出算法后, 嘗試窮舉注冊碼, 居然沒有找到. 后來發現, 還是注冊算法細節上扒錯了, 要循環移位時, 不能用算術移位. 如果不好表達,可以用內聯匯編或做匯編函數和C聯合編譯. 如果不知道注冊碼位數和格式, 用窮舉不行啊. 超過1分鐘出不來, 心里慌:)

UI

這里寫圖片描述

注冊機

// KeyGen.cpp : for cm19//#include "stdafx.h"#include <windows.h>#include <stdlib.h>#include <crtdbg.h>DWord g_dw403168_HdInfo = 0; // 注冊碼比對值2DWORD g_dw40316D_UserInputInfo = 0; // 注冊碼比對值1DWORD g_dw403172 = 0; // 中間值, cm里會用到DWORD g_dw403177 = 0; // 中間值, cm里會用到DWORD GetHdInfo();DWORD CalcSn(/*OUT*/char* PRegSn, int iLen);BOOL TryToFindRegSn(DWORD* pdwUserInput, DWORD dwHdInfo);int main(int argc, char* argv[]){ char szSn[0x100] = {'/0'}; DWORD dwRc = 0; DWORD dwUserInput = 0; // 從代碼邏輯看, 用戶輸入的注冊碼都是數字 printf("g_dw403168_HdInfo = 0x%8.8X/r/n", GetHdInfo()); // 先按照8位的注冊碼試試, 能否找到和硬件信息匹配的注冊碼 // "99999999" 計算出的數, 也比硬件信息的值小, 可以不用窮舉的 // 用反推, 硬件信息的值 ror 2, 列出10進制值就是用戶要輸入的注冊碼 // 最后的注冊碼是"1268698068", 在不知道注冊碼長度的情況下, 窮舉不好玩啊. if (TryToFindRegSn(&dwUserInput, g_dw403168_HdInfo)) { printf("find RegSn = %u = 0x%X/r/n", dwUserInput, dwUserInput); } sprintf(szSn, "%u", dwUserInput); dwRc = CalcSn(szSn, strlen(szSn)); printf("pwd = %s , verify code = 0x%X/r/n", szSn, dwRc); if (dwRc == g_dw403168_HdInfo) { printf("find reg sn : %s/r/n", szSn); } system("pause"); return 0;}DWORD GetHdInfo(){ BOOL bRc = FALSE; DWORD dwVolumeSerialNumber = 0; DWORD dwParam1 = 0; DWORD dwParam2 = 0; DWORD dwBuildIn = 0; char szVolumeName[0x21] = {'/0'}; char szFileSystemName[0x21] = {'/0'}; // 這里簡單的拿文件系統名稱("NTFS")和卷號(0x66a668f9), 做硬件綁定碼 // 雖然簡單, 也可以叫做和硬件識別碼進行綁定 :) bRc = GetVolumeInformation( NULL, // IN LPCWSTR lpRootPathName, szVolumeName, // OUT LPWSTR lpVolumeNameBuffer, sizeof(szVolumeName) - 1, // IN DWORD nVolumeNameSize, &dwVolumeSerialNumber, // OUT LPDWORD lpVolumeSerialNumber, NULL, // OUT LPDWORD lpMaximumComponentLength, NULL, // OUT LPDWORD lpFileSystemFlags, szFileSystemName, // OUT LPWSTR lpFileSystemNameBuffer, sizeof(szFileSystemName) - 1 // IN DWORD nFileSystemNameSize ); _ASSERT(bRc); /** + szFileSystemName 0x0018fd8c "NTFS" + szVolumeName 0x0018fdb0 "dat" dwVolumeSerialNumber 0x66a668f9 */ printf("szVolumeName = %s/r/n", szVolumeName); printf("dwVolumeSerialNumber = 0x%X/r/n", dwVolumeSerialNumber); printf("szFileSystemName = %s/r/n", szFileSystemName); dwParam1 = dwVolumeSerialNumber; dwParam2 = *(DWORD*)szFileSystemName; dwParam1 += dwParam2; g_dw403168_HdInfo = (dwParam1 >> 2); __asm { // DWORD值字節逆序 push eax mov eax, g_dw403168_HdInfo bswap eax mov g_dw403177, eax pop eax } dwBuildIn = dwParam1; dwBuildIn -= 0x44464347; dwBuildIn <<= 2; __asm { // DWORD值字節逆序 push eax mov eax, dwBuildIn bswap eax mov dwBuildIn, eax pop eax } dwBuildIn ^= 0x7479; dwBuildIn += 0x313233; printf("dwBuildIn = 0x%X/r/n", dwBuildIn); return g_dw403168_HdInfo;}BOOL TryToFindRegSn(DWORD* pdwUserInput, DWORD dwHdInfo){ int i = 0; DWORD dwCurCharValue = 0; DWORD dwRc = 0; if (NULL != pdwUserInput) { __asm { push eax mov eax, dwHdInfo ror eax, 2 mov dwRc, eax pop eax } *pdwUserInput = dwRc; return TRUE; } return FALSE;}DWORD CalcSn(/*OUT*/char* pRegSn, int iLen){ int i = 0; DWORD dwRc = 0; DWORD dwCurCharValue = 0; if (NULL != pRegSn) { for (i = 0; i < iLen; i++) { dwCurCharValue = (DWORD)pRegSn[i]; dwCurCharValue -= 0x30/*'0'*/; dwRc = dwCurCharValue + dwRc * 10; } // dwRc ^= 0; // 這里有個不可達分支, 初始值為0 // 這里是循環左移2位!, 數據不會丟 __asm { push eax mov eax, dwRc rol eax, 2 mov dwRc, eax pop eax } g_dw40316D_UserInputInfo = dwRc; dwRc += 0x7479; dwRc ^= 0x313233; dwRc <<= 6; g_dw403172 = dwRc; } // g_dw40316D 和 g_dw403168 必須相等, 這是注冊成功的第一個條件 // 這里成立后, 就沒再往下看了, 先試了一下, 這個條件成立時,就已經注冊成功了 return g_dw40316D_UserInputInfo;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 白城市| 汽车| 岑巩县| 陕西省| 邵东县| 贞丰县| 安宁市| 南和县| 绿春县| 巴彦淖尔市| 土默特左旗| 乡城县| 汉阴县| 怀柔区| 盐山县| 石渠县| 扶余县| 洛隆县| 张家界市| 万州区| 始兴县| 远安县| 平乐县| 海伦市| 海丰县| 竹溪县| 鄄城县| 武陟县| 浮梁县| 龙南县| 克东县| 古丈县| 牙克石市| 根河市| 绥德县| 开原市| 奉贤区| 砀山县| 平山县| 临安市| 凤阳县|