win32汇编Demo_电话本

2024-06-05 14:48
文章标签 demo 汇编 win32 电话本

本文主要是介绍win32汇编Demo_电话本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用win32汇编实现一个电话本Demo

PhoneBook.inc

include windows.inc
include kernel32.inc
include user32.inc
include Comctl32.inc
include shell32.incincludelib kernel32.lib
includelib user32.lib
includelib Comctl32.lib
includelib shell32.libDlgProc			PROTO	:HWND,:UINT,:WPARAM,:LPARAM;图标
ICO_MAIN    	equ   101      
;输入姓名
IDC_EDT_NAME 	equ   1001
;姓名标签
IDC_STC1        equ   1002
;添加号码
IDC_BTN_ADDNUM  equ   1003
;删除号码
IDC_BTN_DELNUM  equ   1004
;修改号码
IDC_BTN_UPNUM   equ   1005
;查询号码
IDC_BTN_SELNUM  equ   1006
;输入号码
IDC_EDT_NUMBER  equ   1008
;显示所有联系人
IDC_EDT_DISPLAY equ   1009
;联系人组别
IDC_EDT_SEC     equ   1012IDD_DIALOG1	equ   101;#######################################################################
.const;ini文件名字
szFileName      db      '\telNum.ini',0
szSecPos        db      'Windows Position',0
szFmtSelect	db      '%s的电话:%s',0
szKeyX		db	'X',0
szKeyY		db	'Y',0
szFmt1		db	'%d',0
szFmtSection	db	'[%s]';换行
szCrLf		db	0dh,0ah,0
lpText          db      '添加成功!',0
lpCaption       db      '提示',0lpText1          db     '没有该联系人!',0lpText2          db     '请输入电话号码!',0lpText3          db      '修改成功!',0lpText4          db      '删除成功!',0lpText5          db      '未找到联系人!',0lpText6          db      '组别,姓名,电话不能为空!',0lpText7          db      '组别,姓名不能为空!',0
;#########################################################################.data?hInstance	 dd ?
hWinMain         dd ?
hIcon            dd ?             
szProfileName                   dd MAX_PATH dup(?)szBuffer1                       dd 32760 dup(?)
szBuffer2                       dd 32760 dup(?);#########################################################################


PhoneBook.cpp
.386
.model flat, stdcall  ;32 bit memory model
option casemap :none  ;case sensitiveinclude PhoneBook.inc.code; 循环遍历全部的组别和对应组别中的姓名,将其保存在缓冲区中
_EnumINI 	proc    local	@szBuffer[256]:byte;读取 组别 列表并循环处理invoke	SetDlgItemText,hWinMain,IDC_EDT_DISPLAY,NULL;返回组别的名称存入szBuffer1中invoke	GetPrivateProfileSectionNames,addr szBuffer1,\sizeof szBuffer1,addr szProfileNamemov	esi,offset szBuffer1.while	byte ptr [esi]invoke	wsprintf,addr @szBuffer,addr szFmtSection,esiinvoke	SendDlgItemMessage,hWinMain,IDC_EDT_DISPLAY,EM_REPLACESEL,FALSE,addr @szBuffer; 读取 联系人 列表并循环显示;根据组别名称,返回联系人invoke	GetPrivateProfileSection,esi,addr szBuffer2,\sizeof szBuffer2,addr szProfileNamemov	edi,offset szBuffer2.while	byte ptr [edi]invoke	SendDlgItemMessage,hWinMain,IDC_EDT_DISPLAY,EM_REPLACESEL,FALSE,ediinvoke	SendDlgItemMessage,hWinMain,IDC_EDT_DISPLAY,EM_REPLACESEL,FALSE,addr szCrLfinvoke	lstrlen,ediadd	edi,eaxinc	edi.endwinvoke	lstrlen,esiadd	esi,eaxinc	esi.endwret_EnumINI	endp;将当前路径和 ini 文件名组合起来
_GetPosition	proclocal	@szBuffer[512]:byteinvoke	GetCurrentDirectory,MAX_PATH,addr szProfileNamemov	esi,offset szProfileNameinvoke	lstrlen,esimov	ecx,offset szFileName.if	byte ptr [esi+eax-1] == '\'inc	ecx.endifinvoke	lstrcat,esi,ecxret_GetPosition	endpstart:invoke GetModuleHandle,NULLmov		hInstance,eaxinvoke InitCommonControlsinvoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULLinvoke ExitProcess,0;########################################################################DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAMlocal	@szSection[256]:byte ;组别local	@szKey[256]:byte     ;姓名local	@szValue[256]:byte   ;电话local	@szBuffer[256]:byte  ;字符缓冲区mov	eax,uMsg.if eax==WM_INITDIALOGinvoke	_GetPositioninvoke	_EnumINI.elseif eax==WM_COMMAND;获取对话框中的值invoke	GetDlgItemText,hWin,IDC_EDT_SEC,addr @szSection,sizeof @szSectioninvoke	GetDlgItemText,hWin,IDC_EDT_NAME,addr @szKey,sizeof @szKeyinvoke	GetDlgItemText,hWin,IDC_EDT_NUMBER,addr @szValue,sizeof @szValuemov	eax,wParam;##########修改号码##########	.if	ax ==	IDC_BTN_UPNUM  ;首先查询号码是否存在invoke	GetPrivateProfileString,addr @szSection,\addr @szKey,NULL,addr @szBuffer,\sizeof @szBuffer,addr szProfileName.if eax == 0;返回0表示没有该联系人invoke  MessageBox,hWin,addr lpText1,addr lpCaption, MB_OK.else;非0则存在联系人,判断添加号码是否为空.if @szValue != NULLinvoke	WritePrivateProfileString,addr @szSection,\addr @szKey,addr @szValue,addr szProfileNameinvoke  MessageBox,hWin,addr lpText3,addr lpCaption, MB_OK.elseinvoke  MessageBox,hWin,addr lpText2,addr lpCaption, MB_OK.endif.endif;##########删除号码##########.elseif	ax ==	IDC_BTN_DELNUM .if  @szSection == NULL || @szKey == NULLinvoke  MessageBox,hWin,addr lpText7,addr lpCaption, MB_OK.elseinvoke	WritePrivateProfileString,addr @szSection,\addr @szKey,NULL,addr szProfileNameinvoke  MessageBox,hWin,addr lpText4,addr lpCaption, MB_OK.endif	;##########添加号码##########		.elseif	ax ==	IDC_BTN_ADDNUM  .if     @szSection == NULL || @szKey == NULL || @szValue == NULLinvoke  MessageBox,hWin,addr lpText6,addr lpCaption, MB_OK.elseinvoke	WritePrivateProfileString,addr @szSection,\addr @szKey,addr @szValue,addr szProfileNameinvoke  MessageBox,hWin,addr lpText,addr lpCaption, MB_OK.endif;##########查询号码##########		.elseif	ax ==	IDC_BTN_SELNUM  invoke	GetPrivateProfileString,addr @szSection,\addr @szKey,NULL,addr @szValue,\sizeof @szValue,addr szProfileName.if	eax != 0invoke	wsprintf,addr @szBuffer,addr szFmtSelect,addr @szKey,addr @szValueinvoke	SetDlgItemText,hWin,IDC_EDT_DISPLAY,addr @szBuffer.elseinvoke  MessageBox,hWin,addr lpText5,addr lpCaption, MB_OK.endif.endifinvoke	_EnumINI.elseif eax==WM_CLOSEinvoke EndDialog,hWin,0.elsemov	eax,FALSEret.endifmov	eax,TRUEretDlgProc endpend start

运行效果如图所示:



这篇关于win32汇编Demo_电话本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1033356

相关文章

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

linux 内核提权总结(demo+exp分析) -- 任意读写(四)

hijack_modprobe_path篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm     原理同hijack_prctl, 当用户执行错误格式的elf文件时内核调用call_usermod

linux 内核提权总结(demo+exp分析) -- 任意读写(三)

hijack_prctl篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm   prctl函数: 用户态函数,可用于定制进程参数,非常适合和内核进行交互 用户态执行prctl函数后触发prctl系统

linux 内核提权总结(demo+exp分析) -- 任意读写(二)

hijack_vdso篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm     vdso: 内核实现的一个动态库,存在于内核,然后映射到用户态空间,可由用户态直接调用 内核中的vdso如果被修改

linux 内核提权总结(demo+exp分析) -- 任意读写(一)

cred篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm   每个线程在内核中都对应一个线程结构块thread_infothread_info中存在task_struct类型结构体 struct t

linux 内核提权总结(demo+exp分析) -- ROP(二)

ret2usr CR4篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm   smep: smep是内核的一种保护措施, 使得内核不可执行用户态代码 内核通过CR4寄存器的第20位来控制smep,

linux 内核提权总结(demo+exp分析) -- ROP(一)

基础ROP篇(linux 5.0.21) 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm   内核提权与用户态攻击的区别 攻击流程 用户态攻击: 执行 system("/bin/sh") 获得shel

Win32函数调用约定(Calling Convention)

平常我们在C#中使用DllImportAttribute引入函数时,不指明函数调用约定(CallingConvention)这个参数,也可以正常调用。如FindWindow函数 [DllImport("user32.dll", EntryPoint="FindWindow", SetLastError = true)]public static extern IntPtr FindWindow

汇编:嵌入式软件架构学习资源

成为嵌入式软件架构设计师需要掌握多方面的知识,包括嵌入式系统、实时操作系统、硬件接口、软件设计模式等。 以下是一些推荐的博客和网站,可以帮助你深入学习嵌入式软件架构设计: ### 1. **Embedded.com**    - **网址**: [Embedded.com](https://www.embedded.com/)    - **简介**: 这是一个专注于嵌入式系统设计的专业网

实例demo理解面向接口思想

浅显的理解面向接口编程 Android开发的语言是java,至少目前是,所以理解面向接口的思想是有必要的。下面通过一个简单的例子来理解。具体的概括我也不知道怎么说。 例子: 现在我们要开发一个应用,模拟移动存储设备的读写,即计算机与U盘、MP3、移动硬盘等设备进行数据交换。已知要实现U盘、MP3播放器、移动硬盘三种移动存储设备,要求计算机能同这三种设备进行数据交换,并且以后可能会有新的第三方的