;下面赋值给寄存器ebx,以便进行crc32转换: ;EBX是待转换的字符串的首地址: lea ebx, szBuffer
;进行crc32转换: invoke arraycrc32
;格式化输出: invoke wsprintf, addr szText, addr szTemplate, addr szBuffer, eax 逆风编程技术
;好啦,让我们显示结果: invoke MessageBox, hWnd, addr szText, addr szTitle, MB_OK .ENDIF .endif .ELSE mov eax,FALSE ret .ENDIF mov eax,TRUE ret WndProc endp
;********************************************************** ;函数功能:生成CRC-32表 ;********************************************************** init_crc32tableproc
;如果用C语言来表示,应该如下: ; ;for (i = 0; i < 256; i ) ;{ ;crc = i; ;for (j = 0; j < 8; j ) ;{ ;if (crc & 1) ;crc = (crc >> 1) ^ 0xEDB88320; ;else ;crc >>= 1; ;} ;crc32tbl[i] = crc; ;} ; ;呵呵,让我们把上面的语句改成assembly的:
mov ecx, 256; repeat for every DWORD in table mov edx, 0EDB88320h $BigLoop: lea eax, [ecx-1] pushecx mov ecx, 8 $SmallLoop: shr eax, 1 jnc @F xor eax, edx @@: dec ecx jne $SmallLoop pop ecx mov [crc32tbl ecx*4-4], eax dec ecx jne $BigLoop
ret init_crc32tableendp
;************************************************************** ;函数功能:计算CRC-32 ;************************************************************** arraycrc32proc
;计算 CRC-32 ,我采用的是把整个字符串当作一个数组,然后把这个数组的首地址赋值给 EBX,把数组的长度赋值给 ECX,然后循环计算,返回值(计算出来的 CRC-32 值)储存在 EAX 中: ; ; 参数: ; EBX = address of first byte ; 返回值: ; EAX = CRC-32 of the entire array ; EBX = ? ; ECX = 0 ; EDX = ?
mov eax, -1 ; 先初始化eax orebx, ebx jz$Done ; 避免出现空指针 @@: mov dl, [ebx] ordl, dl je$Done;判断是否对字符串扫描完毕
;这里我用查表法来计算 CRC-32 ,因此非常快速: ;因为这是assembly代码,所以不需要给这个过程传递参数,只需要把oldcrc赋值给EAX,以及把byte赋值给DL: ; ; 在C语言中的形式: ; ; temp = (oldcrc ^ abyte) & 0x000000FF; ; crc= (( oldcrc >> 8) & 0x00FFFFFF) ^ crc32tbl[temp]; ; ; 参数: ; EAX = old CRC-32 ;DL = a byte ; 返回值: ; EAX = new CRC-32 ; EDX = ? xor dl, al movzx edx, dl shr eax, 8 xor eax, [crc32tbl edx*4]
inc ebx jmp @B
$Done: not eax ret arraycrc32endp
end main ;********************over******************** ;by LC
下面是它的.rc文件:
#include "resource.h"
#define IDC_BUTTON_OPEN3000 #define IDC_EDIT_INPUT 3001 #define IDC_STATIC -1
LC_DIALOG DIALOGEX 10, 10, 195, 60 STYLE DS_SETFONT | DS_CENTER | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "lc’s assembly framework" FONT 9, "宋体", 0, 0, 0x0 BEGIN LTEXT "请输入一个字符串(区分大小写):",IDC_STATIC,11,7,130,10 EDITTEXTIDC_EDIT_INPUT,11,20,173,12,ES_AUTOHSCROLL DEFPUSHBUTTON "Ca&lc",IDC_BUTTON_OPEN,71,39,52,15 END
如果你能够完全理解本节的内容,那么请留意我的下一讲,我将具体介绍如何运用CRC-32对你的文件进行保护。(呵呵,好戏在后头……) 本文章更多内容:<<上一页 - 1 - 2 - 3 |