win32汇编环境,按字节、双字等复制字符的操作

;运行效果

;win32汇编环境,按字节、双字等复制字符的操作
;这是汇编的优点之一。我们可以按字节、双字、四字、八字节等复制或挨个检查字符。
;有时候,在接收到的一串信息中,比如访问网站时,返回的字串里,有很多0值存在,用一般的字符串处理函数会把它当作结束符看待。这是错误的,因为这个0值只是一段信息的结束,后面还跟着很多的字串。
;有时候,访问网站时,返回的字串是UFT8编码的,这是不定长的字串,由某个字节的内容决定后面跟着的字串有几个字节,或有多长。我们必须分析每个字节的内容,决定后一步如何读取或分析。用其它的高级语言,反而变得更复杂,甚至无法这么低层的操作。
;在写网络爬虫时,一样可以按字节分析,把汉字与字母区别开来。
;很多的时候,显示出乱码,都是因为编码的问题导致的。比如字串是UNICODE编码的,按默认的ASCII去读取或发送,就成了乱码。
;我们首先需要知道,byte是字节(8位)、word是双字节(16位)、dword是四字节(32位),qword是八字节(64位)的概念。
;下面为asm文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386 
.model flat,stdcall 
option casemap:none 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include    windows.inc 
include    user32.inc 
include    kernel32.inc 
includelib user32.lib 
includelib kernel32.lib 
; 自定义函数声明;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD   ;对话框窗口函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data 
DlgName    db "MyDialog",0
szCap      db "提示",0 
szEx       db "ABCDEFGHIJKLMNOPQRST",0      ;要读取的字符串
.data? 
hInstance HINSTANCE             ? 

.const 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN    equ 1000    ;图标

IDB01      equ 11        ;按钮控件标识符 
IDB02      equ 12  
IDB03      equ 13  
IDB04      equ 14 
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code 
start:     
        invoke GetModuleHandle, NULL     
        mov    hInstance,eax     
        invoke DialogBoxParam, hInstance, ADDR DlgName,NULL, addr DlgProc, NULL     
        invoke ExitProcess,eax 
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM  
        LOCAL   @stPs:PAINTSTRUCT
        LOCAL   @stRect:RECT
        LOCAL   @hDc
        LOCAL   @szBuffer[256]:byte
        
       .if      uMsg == WM_INITDIALOG                 
                        invoke    LoadIcon,hInstance,ICO_MAIN    ;加载图标                
                        invoke    SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
        .elseif uMsg == WM_COMMAND                                  
                mov eax,wParam                        
                .if     eax == IDB01 
                        mov bl,byte ptr [szEx+3]             ;因为从0开始计数,取第4个字节则是+3,这里使用bl寄存器,它是8位寄存器,即1个字节.byte的意思是按字节复制
                        mov byte ptr [@szBuffer],bl  
                        mov byte ptr [@szBuffer+1],0         ;第2个字节加0,即结束符
                        invoke  MessageBox,NULL,addr @szBuffer,addr szCap,MB_OK                                                   
                .elseif ax == IDB02                         
                        mov bx,word ptr [szEx+4]             ;按双字节复制,这里使用bx,bx是16位寄存器,word是双字节,每字节为8位,双字即16位,要对应的上
                        mov word ptr [@szBuffer],bx  
                        mov byte ptr [@szBuffer+2],0        
                        invoke  MessageBox,NULL,addr @szBuffer,addr szCap,MB_OK              
                .elseif ax == IDB03                          
                        mov ebx,dword ptr [szEx+4]            ;按四字节复制
                        mov dword ptr [@szBuffer],ebx  
                        mov byte ptr [@szBuffer+4],0        
                        invoke  MessageBox,NULL,addr @szBuffer,addr szCap,MB_OK                                      
                .elseif ax == IDB04                        
                        mov ebx,dword ptr [szEx]              ;按八字节复制,这里分两次按4字节操作,因为现在用的是32位编译器,撑不上64位。不用追求64位的,那个还不完善,32位的精通了,一样实现目的。
                        mov dword ptr [@szBuffer],ebx  
                        mov ebx,dword ptr [szEx+4]            
                        mov dword ptr [@szBuffer+4],ebx
                        mov byte ptr [@szBuffer+8],0        
                        invoke  MessageBox,NULL,addr @szBuffer,addr szCap,MB_OK                                                                        
                .endif 
        .elseif uMsg == WM_PAINT 
                invoke    BeginPaint,hWnd,addr @stPs            
                mov @hDc,eax 
                mov @stRect.left,20                                
                mov @stRect.top,20                                  
                mov @stRect.right,200                               
                mov @stRect.bottom,40                                              
                invoke  DrawText,@hDc,addr szEx,-1,addr @stRect,DT_SINGLELINE or DT_LEFT or DT_VCENTER                                         
                invoke  EndPaint,hWnd,addr @stPs
                                     
        .elseif uMsg == WM_CLOSE                 
                        invoke EndDialog, hWnd,NULL         
        .else                
                mov eax,FALSE                 
                ret                 
        .endif                 
        mov eax,TRUE         
        ret 
DlgProc endp 

end start 

;下面为rc文件内容
#include "resource.h"              //提示缺少该文件,可以在资源里下载
#define    ICO_MAIN        1000    //图标  
#define    IDB01       11         
#define    IDB02       12
#define    IDB03       13
#define    IDB04       14

ICO_MAIN    ICON        "Main.ico"

//定义对话框
MyDialog DIALOG 10, 10, 120, 130 
STYLE  DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK 

CAPTION "对话框程序模版"
 BEGIN    
     PUSHBUTTON      "复制第4个字节", IDB01,  10,40,100,14      
     PUSHBUTTON      "复制第3个双字节", IDB02,  10,60,100,12      
     PUSHBUTTON      "复制第2个四字节", IDB03,  10,80,100,14      
     PUSHBUTTON      "复制第1个八字节", IDB04,  10,100,100,12      
END 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/958018.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Node.js接收文件分片数据并进行合并处理

前言:上一篇文章讲了如何进行文件的分片:Vue3使用多线程处理文件分片任务,那么本篇文章主要看一下后端怎么接收前端上传来的分片并进行合并处理。 目录: 一、文件结构二、主要依赖1. express2. multer3. fs (文件系统模块)4. pat…

《offer 来了:Java 面试核心知识点精讲 -- 框架篇》(附资源)

继上篇文章介绍了《offer 来了:Java 面试核心知识点精讲 -- 原理篇》书后,本文章再给大家推荐兄弟篇 《offer来了:Java面试核心知识点精讲--框架篇》, 简直就是为Java开发者量身定制的面试神器。 本书是对Java程序员面试中常见的…

iOS 权限管理:同时请求相机和麦克风权限的最佳实践

引言 在开发视频类应用时,我们常常会遇到需要同时请求相机和麦克风权限的场景。比如,在用户发布视频动态时,相机用于捕捉画面,麦克风用于录制声音;又或者在直播功能中,只有获得这两项权限,用户…

docker Ubuntu实战

目录 Ubuntu系统环境说明 一、如何安装docker 二、发布.netcore应用到docker中 Ubuntu系统环境说明 cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.5 LTS" NAME"Ubuntu" VERSION_ID"22.04" VERSION"22.04.5 LTS (Jammy Jellyfish)&quo…

线上突发:MySQL 自增 ID 用完,怎么办?

线上突发:MySQL 自增 ID 用完,怎么办? 1. 问题背景2. 场景复现3. 自增id用完怎么办?4. 总结 1. 问题背景 最近,我们在数据库巡检的时候发现了一个问题:线上的地址表自增主键用的是int类型。随着业务越做越…

Golang之Context详解

引言 之前对context的了解比较浅薄,只知道它是用来传递上下文信息的对象; 对于Context本身的存储、类型认识比较少。 最近又正好在业务代码中发现一种用法:在每个协程中都会复制一份新的局部context对象,想探究下这种写法在性能…

从桌面到前端:效率与渲染优化的技术进化20250122

从桌面到前端:效率与渲染优化的技术进化 在应用开发的广袤天地中,我们见证了从传统桌面开发(如 MFC、PyQt)向现代 Web 前端框架(如 React、Vue)的华丽转变。这一变革犹如一场技术革命,带来了开…

web服务器 网站部署的架构

WEB服务器工作原理 Web web是WWW(World Wide Web)的简称,基本原理是:请求(客户端)与响应(服务器端)原理,由遍布在互联网中的Web服务器和安装了Web浏览器的计算机组成 客户端发出请求的方式:地址栏请求、超链接请求、表单请求 …

快速构建springboot+vue后台管理系统

项目介绍 1.需求定义:外包项目如雨后春笋,开发工期被迫压缩,为了开发人员专注开发项目业务,早点下班能陪老婆、孩子。 2.产品定位: 简约后台管理系统 3.项目特点:此项目代码清晰、界面简洁、springboot layuiadmin 构…

C语言--数据在内存中的存储

数据在内存中的存储 主要研究整型和浮点型在内存中的存储。 1. 整数在内存中的存储 在学习操作符的时候,就了解过了下面的内容: 整数的2进制表示方法有三种,即原码、反码和补码。 有符号的整数,三种表示方法均有符号位和数值…

HTB:Sauna[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用nmap对靶机…

wireshark工具简介

目录 1 wireshark介绍 2 wireshark抓包流程 2.1 选择网卡 2.2 停止抓包 2.3 保存数据 3 wireshark过滤器设置 3.1 显示过滤器的设置 3.2 抓包过滤器 4 wireshark的封包列表与封包详情 4.1 封包列表 4.2 封包详情 参考文献 1 wireshark介绍 wireshark是非常流行的网络…

2025.1.20——一、[RCTF2015]EasySQL1 二次注入|报错注入|代码审计

题目来源:buuctf [RCTF2015]EasySQL1 目录 一、打开靶机,整理信息 二、解题思路 step 1:初步思路为二次注入,在页面进行操作 step 2:尝试二次注入 step 3:已知双引号类型的字符型注入,构造…

kong 网关和spring cloud gateway网关性能测试对比

该测试只是简单在同一台机器设备对spring cloud gateway网关和kong网关进行对比,受限于笔者所拥有的资源,此处仅做简单评测。 一、使用spring boot 的auth-service作为服务提供者 该服务提供了一个/health接口,接口返回"OK"&…

winfrom项目,引用EPPlus.dll实现将DataTable 中的数据保存到Excel文件

最近研究不安装office也可以保存Excel文件,在网上查询资料找到这个方法。 第一步:下载EPPlus.dll文件(自行去网上搜索下载) 第二步:引用到需要用的项目中,如图所示: 第三步:写代码…

框架层实现cpu高负载(cpuload)的检测方案

摘要 这是2018年在小厂的老方案了,现在看方案已经过时了也不太合理,仅供参考,上层框架开启一个5分钟定时器,检测5分钟内总cpu负载和每个线程cpu负载情况,当检测到cpu负载大于绿盟性能或功耗定义的阈值时,结…

Android BitmapShader简洁实现马赛克,Kotlin(一)

Android BitmapShader简洁实现马赛克,Kotlin(一) 这一篇, Android使用PorterDuffXfermode模式PorterDuff.Mode.SRC_OUT橡皮擦实现马赛克效果,Kotlin(3)-CSDN博客 基于PorterDuffXfermode实现马…

人工智能在数字化转型中的角色:从数据分析到智能决策

引言 在数字化转型浪潮中,人工智能(AI)正迅速崛起,成为推动企业创新和变革的关键力量。面对日益复杂的市场环境和激烈的行业竞争,企业亟需借助技术手段提高运营效率、优化决策过程,并增强市场竞争力。而AI…

「全网最细 + 实战源码案例」设计模式——工厂方法模式

核心思想 简单工厂模式是一种创建者模式,它通过一个工厂类负责创建不同类型的对象,根据传入的参数决定实例化的具体类,也被称为“静态工厂方法”模式,因为工厂方法通常是静态的。 结构 1. 工厂类: 提供一个静态方法…

我的图形布局 组织结构图布局

组织结构图布局,有的人也叫它树状布局,在图形中是经常用到的布局算法.形成类似如下图的图形布局方式 首先创建一个类, public class TreeLayouter {private int m_space 40;/// <summary>/// 空间间隔/// </summary>public int Space{get { return m_space; }se…