您的位置:逆风者 汇编技术 正文
原作者:www.upwinder.com 添加时间:2007-09-01 原文发表:2007-08-31 人气:5 来源:未知

本文章共4412字,分3页,当前第3页,快速翻页:
 


;下面赋值给寄存器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
相关文章

移位指令在Win32消息处理中的一些问题
小试Win32汇编
客户寄存器结构
事件对象
扩展Int 13H调用规范
内存映射文件
使用DLL中的资源
关于在8086/88内存寻址方式
抓取屏幕内容(字符模式)
利用驱动程序读取硬盘序列号
修改文件操作
80386的中断和异常
列表视图控件
Windows下控制台输出
在弹出菜单的同时再次弹出菜单
自己编程实现多引导
虚拟设备驱动程序初步
VxD 程序设计入门
Win32调试API 第一部分
树型视图控件

相关评论


本文章所属分类:首页 汇编技术

  热门关键字:
进制数据输出的通用程序 2007-09-12
汇编源码--showmem 2007-08-31
汇编源码--CLEAN 2007-08-31
汇编源码--hdr 2007-08-31
汇编源码--basload 2007-08-31
汇编源码--CHAR 2007-08-31
汇编源码--fxn 2007-08-31
汇编源码--alarm 2007-08-31
汇编源码--getsect 2007-08-31
汇编源码--DEV 2007-08-31
汇编源码--getspace 2007-08-31
汇编源码--frespace 2007-08-31
CIH文件型病毒检测消除程序 2007-08-31
Mixer Volume Ctrler V1.0 2007-08-31
汇编源码--COMINT 2007-08-31
自己用汇编语言写的一个病毒(源码... 2007-08-31
汇编源码--col 2007-08-31
汇编源码--BURNOUT 2007-08-31