日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一个含有crc32算法的CrackMe分析

發布時間:2025/3/21 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一个含有crc32算法的CrackMe分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

exe文件的下載地址為: http://pan.baidu.com/s/1gfw0XKf

啟動界面:

大概意思是輸入用戶名和序列號,檢查是否匹配,現在用ida打開分析一下:

msg==0x111位處理傳過來的WM_COMMAND消息



下面對關鍵的地方進行分析,F5大法:

size = GetDlgItemTextA(hWnd, 1004, name, 255); // 取Name放到name數組里面if ( size >= 4 ) // 名字必須大于等于4{nameSize = size;codeSize[0] = GetDlgItemTextA(hWnd, 1005, code, 255);crc32Init();//對codeSize進行CRC32加密,且必須為0x2f6016f7//用python寫個爆破腳本可得到codeSize為26if ( Funcrc32(codeSize) == 0x2F6016F7 ){RtlZeroMemory(byte_40347F, 8);//初始化0x40347f的8個字節byte_40347F[0] = code[8]; //取第9位 byte_40347F[1] = code[17];//取第18位crc32Init();//將第9位和第18組成的字節數組進行CRC32加密,且必須為0x242C1465if ( Funcrc32(byte_40347F) == 0x242C1465 ){//用python寫個爆破腳本可得到9位和18位都為'-'//可得到Serial的格式為12345678-12345678-12345678RtlZeroMemory(&buffer1, 10);RtlZeroMemory(&buffer2, 10);cnt = 0;while ( 1 ){t = code[cnt];if ( t > '9' && t < 'A' )break;if ( t < '0' || t > 'F' ) // 16進制檢查break;if ( ++cnt == 8 ){count = 0;v10 = 0;buffer1_1 = &buffer1;do{v10 *= 16;v12 = code[count];*buffer1_1 = v12;if ( v12 < 'A' || v12 > 'F' )v13 = v12 - '0'; // 不正常elsev13 = v12 - '7'; // 正常LOBYTE(v10) = v13 & 0xF | v10;++buffer1_1;++count;step1 = v10; }while ( count != 8 );// 這個while循環將相應的16進制字符串轉化為int類型crc32Init();crcName = Funcrc32(name);//對name數組進行crc32加密,且必須等于Serial的第一部分if ( step1 == crcName ) // 名字必須滿足這個條件{v15 = 0;v16 = &code[9];//Serial的第二部分的首地址while ( 1 ){v17 = v16[v15];if ( v17 > '9' && v17 < 'A' )break;if ( v17 < '0' || v17 > 'F' )break;if ( ++v15 == 8 ){cnt_1 = 0;v19 = 0;v20 = &buffer2;do{v19 *= 16;v21 = v16[cnt_1];*v20 = v21;*v16 = v21;if ( v21 < 'A' || v21 > 'F' )v22 = v21 - 48;elsev22 = v21 - 55;LOBYTE(v19) = v22 & 0xF | v19;++v20;++cnt_1;step2 = v19;}while ( cnt_1 != 8 );// 這個while循環將Serial第二部分的16進制字符串轉化為int類型,并保存在step2變量里crc32Init();crcBuffer1 = Funcrc32(&buffer1);if ( step2 == crcBuffer1 ){//Serial第二部分的值必須等于Serial第一部分CRC32加密后的值crc32Init();step2 = Funcrc32(&buffer2);//對第二部分進行crc32加密,并且保存到step2變量里v24 = 0;v25 = &code[18];while ( 1 ){v26 = v25[v24];if ( (unsigned __int8)v26 > 0x39u && (unsigned __int8)v26 < 0x41u )break;if ( (unsigned __int8)v26 < 0x30u || (unsigned __int8)v26 > 0x46u )break;if ( ++v24 == 8 ){cnt_2 = 0;v28 = 0;do{v28 *= 16;v29 = v25[cnt_2];*v25 = v29;if ( (unsigned __int8)v29 < 0x41u || (unsigned __int8)v29 > 0x46u )v30 = v29 - 48;elsev30 = v29 - 55;LOBYTE(v28) = v30 & 0xF | v28;++cnt_2;step3 = v28;}while ( cnt_2 != 8 );這個while循環將Serial的第三部分16進制字符串轉換為int類型// if ( (step2 ^ step1) == step3 )//最后一個條件step2和step1進行異或的值必須為step3{SetWindowTextA(hWnd, "GOOD JOB, MAN!");//成功hCheck = GetDlgItem(hWnd, 0x3EE);EnableWindow(hCheck, 0);// 禁用單擊按鈕 #求codeSize的腳本: def crc32(v):'''Generates the crc32 hash of the v.@return: str, the str value for the crc32 of the v'''return "%08X"%(binascii.crc32(v)&0xffffffff)for i in range(60):crc = crc32(binascii.a2b_hex('%02X'%i))#print crcif crc=='2F6016F7':print ibreak#求第9位和第18位的腳本: for i,j in itertools.product(string.printable,string.printable):crc =crc32(binascii.a2b_hex('%02X%02x'%(ord(i),ord(j))))if crc=='242C1465':print i,jbreak#上面是確定Serial的長度和格式:12345678-12345678-12345678 #最后注冊機為:import crypt,binascii,itertoolsname = raw_input('輸入你的注冊名(大于4):')c1 = crc32(name)print 'c1',c1,hex(int(c1,16))c2 = crypt.crc32(c1)print 'c2',c2,hex(int(c2,16))t = crypt.crc32(c2)c3 = '%08X'%(int(t,16)^int(c1,16))print 'Serial:',c1+'-'+c2+'-'+c3

總結

以上是生活随笔為你收集整理的一个含有crc32算法的CrackMe分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。