国产探花免费观看_亚洲丰满少妇自慰呻吟_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;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 卓资县| 余干县| 拜泉县| 临武县| 南岸区| 芦山县| 独山县| 那坡县| 安乡县| 肥乡县| 沙洋县| 青河县| 南昌县| 武山县| 香河县| 新河县| 新田县| 富蕴县| 潞城市| 新乡县| 蒲江县| 阜新| 克什克腾旗| 碌曲县| 阳西县| 揭东县| 佛坪县| 江北区| 大港区| 湟中县| 嘉善县| 右玉县| 临武县| 广河县| 余江县| 茶陵县| 绩溪县| 盖州市| 纳雍县| 丹江口市| 桃江县|