首页
论坛
课程
招聘
[原创]用Win32汇编写的Base64加密程序
2008-9-17 10:45 4559

[原创]用Win32汇编写的Base64加密程序

2008-9-17 10:45
4559
来看雪很久了,发个原创的Win32汇编小程序,希望大家支持,谢谢

;-----------------------------------------------------------------------------
;Base64加密程序 BY 民大科技 2008-09-11
;返回值		目的串的长度
;-----------------------------------------------------------------------------
include \masm32\include\masm32rt.inc

.data
IDD_DIALOG1	equ                101
IDC_INPUT       equ                1000
IDC_OUTPUT      equ                1001
IDC_ENCODE      equ                1002
IDC_CLEAR       equ                1003
IDC_STATIC      equ                -1

szError		db	'源串不能为空',0
Base64Table	db	'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',0
;pad		db	'='

.data?
hInstance	dd	?
hWnd		dd	?
bufInput	db	512 dup(?)
bufOutput	db	512 dup(?)

.code
;---------------------------------------------------
;Base64加密函数 Win32汇编实现
;参数	lpSrc		需加密的串的地址
;	SrcLen		需加密的字节数
;	lpDes		存放结果的地址
;返回值	无
;---------------------------------------------------
_Base64Encode	proc uses ebx ecx edx esi edi lpSrc:dword,SrcLen:dword,lpDes:dword
	local	@DesLen
	local	@Groups
	
	mov	esi,lpSrc
	mov	edi,lpDes
	
	xor	edx,edx
	mov	eax,SrcLen
	mov	ebx,3
	div	ebx					;将源串以三位分组

	mov	@Groups,eax				;计算分组数目
	push	edx					;保存余数
	
	mov	ecx,eax
	xor	ebx,ebx
	.while	ebx<ecx				
		mov	edx,ebx
		add	edx,ebx
		add	edx,ebx				;edx=ebx*3
		
		xor	eax,eax
		mov	al,byte ptr [esi+edx]
		shl	ax,6
		mov	byte ptr [edi+ebx*4],ah
		shl	ax,2				;A|al
		
		mov	al,byte ptr [esi+edx+1]		;A|B
		shl	ax,4
		and	ah,63				;and ah,0011 1111
		mov	byte ptr [edi+ebx*4+1],ah
		shl	ax,4				;B|al
		
		mov	al,byte ptr [esi+edx+2]		;B|C
		shl	ax,2
		and	ah,63
		mov	byte ptr [edi+ebx*4+2],ah
		shl	ax,6				;C|al
		
		and	ah,63
		mov	byte ptr [edi+ebx*4+3],ah
		
		inc	ebx
	.endw
	
	pop	edx					;取余数
	.if	edx
		inc	@Groups
		mov	ecx,ebx
		add	ecx,ebx
		add	ecx,ebx				;ecx=ebx*3
		.if	edx==1
			xor	eax,eax
			mov	al,byte ptr [esi+ecx]
			shl	ax,6
			mov	byte ptr [edi+ebx*4],ah
			shl	ax,6
			and	ah,63
			mov	byte ptr [edi+ebx*4+1],ah
			
			mov	byte ptr [edi+ebx*4+2],64
			mov	byte ptr [edi+ebx*4+3],64
		.elseif	edx==2
			xor	eax,eax
			mov	al,byte ptr [esi+ecx]
			shl	ax,6
			mov	byte ptr [edi+ebx*4],ah
			shl	ax,2
			
			mov	al,byte ptr [esi+ecx+1]
			shl	ax,4
			and	ah,63
			mov	byte ptr [edi+ebx*4+1],ah
			
			shl	ax,6
			and	ah,63
			mov	byte ptr [edi+ebx*4+2],ah
			
			mov	byte ptr [edi+ebx*4+3],64
		.endif
	.endif
	
	xor	edx,edx
	mov	eax,4
	mul	@Groups					;edx-eax=@Groups*4
	
	mov	@DesLen,eax
	lea	esi,Base64Table
	mov	ecx,eax
	xor	ebx,ebx
	.while	ebx<ecx					;从Base64Table中取值,写入edi
		xor	eax,eax
		mov	al,byte ptr [edi+ebx]
		mov	al,byte ptr [esi+eax]
		mov	byte ptr [edi+ebx],al
		inc	ebx
	.endw
	
	mov	eax,@DesLen
	ret
_Base64Encode	endp


MyDlgProc	proc	hwndDlg:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
        ;----------------------------------------------
	;INT_PTR CALLBACK DialogProc(
	;  HWND hwndDlg,  // handle to dialog box
	;  UINT uMsg,     // message
	;  WPARAM wParam, // first message parameter
	;  LPARAM lParam  // second message parameter
	;);
	;----------------------------------------------

		.if	uMsg==WM_INITDIALOG
			push	hwndDlg
			pop	hWnd
		.elseif	uMsg==WM_CLOSE
			invoke	EndDialog,hWnd,NULL
		.elseif	uMsg==WM_COMMAND
			mov	eax,wParam
			.if	ax==IDC_CLEAR
				invoke	SetDlgItemText,hWnd,IDC_INPUT,NULL
				invoke	SetDlgItemText,hWnd,IDC_OUTPUT,NULL
			.elseif	ax==IDC_ENCODE
				invoke	RtlZeroMemory,offset bufInput,512
				invoke	RtlZeroMemory,offset bufOutput,512
				invoke	GetDlgItemText,hWnd,IDC_INPUT,offset bufInput,512
				.if	eax!=0
					invoke	_Base64Encode,offset bufInput,eax,offset bufOutput
					invoke	SetDlgItemText,hWnd,IDC_OUTPUT,NULL
					invoke	SetDlgItemText,hWnd,IDC_OUTPUT,offset bufOutput
				.else
					invoke	SetDlgItemText,hWnd,IDC_OUTPUT,offset szError
				.endif
				
			.endif
		.else
			mov	eax,FALSE
			ret
		.endif
		mov	eax,TRUE
		ret
MyDlgProc	endp

start:		
	invoke	GetModuleHandle,NULL		;GetModuleHandle获取应用程序实例
	mov	hInstance,eax
	invoke	DialogBoxParam,hInstance,IDD_DIALOG1,NULL,MyDlgProc,NULL
	invoke	ExitProcess,eax
	
	;INT_PTR DialogBoxParam(
  	;HINSTANCE hInstance,     // handle to module(包含dialog box template 的可执行文件的句柄)
  	;LPCTSTR lpTemplateName,  // dialog box template(TemplateId)
  	;HWND hWndParent,         // handle to owner window(将创建的对话框的所有者)
  	;DLGPROC lpDialogFunc,    // dialog box procedure(窗口处理过程)
  	;LPARAM dwInitParam       // initialization value(指定WM_INITDIALOG的lParam)
  	
  	
	;);

		end start


[公告]《CTF高级解混淆》训练营,国际顶尖CTF战队大牛亲自授课,助你快速成长!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (2)
雪    币: 372
活跃值: 活跃值 (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
笨奔 活跃值 1 2008-9-17 10:50
2
0
呵。呵。支持原創。
雪    币: 205
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
neverqq 活跃值 2008-9-17 18:41
3
0
鼓励一下,还有后半部的解密呢
游客
登录 | 注册 方可回帖
返回