win32汇编环境,网络编程入门之十一

;win32汇编环境,网络编程入门之十一
;在上一教程里,我们学习了如何读取大容量的网页内容,在这一教程里,我们学习一下如何在wininet或winhttp机制中提取网页中的超链接
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
include kernel32.inc
include wininet.inc ;需要添加的wininet头文件
includelib user32.lib
includelib kernel32.lib
includelib wininet.lib ;需要添加的wininet库文件
; 自定义函数声明
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD ;对话框窗口函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MAINDIALOG equ 1
ICO_MAIN equ 1000 ;图标
ID_BUTTON01 equ 41
ID_EDIT01 equ 11
ID_EDIT02 equ 12
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
szMsg db "提示",0
szFrm db "%d",0
szErr db "错误",0
szEnter db 13,10,0 ;回车换行符
szAgent db "Microsoft Internet Explorer",0 ;骗网站说自已是IE浏览器
szHostName db "www.kepai2023.cn",0 ;要访问的主机域名
szUrlPath db "/",0 ;要访问的主页,写成/index.html 也可以
szVerb db "GET",0 ;GET方法访问
szAccept db "Accept: text/html",0 ;只接受text或html文件返回
.data?
hInstance HINSTANCE ?
hEdithwnd01 HWND ?
hEdithwnd02 HWND ?
hInternet dd ?
hHttpSession dd ?
hHttpRequest dd ?
hHttp dd ?
.const
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke DialogBoxParam, hInstance, MAINDIALOG,NULL, addr DlgProc, NULL
invoke ExitProcess,eax
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;处理接收到的字符串,把链接内容提取出来
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_HandleData proc _lpData,_dwSize
LOCAL hSign ;用来当记号,当发现有链接开始,即<a 字符时定为1,当a>字符时定为2,没有情况时为0
LOCAL szBuffer[256]:byte
LOCAL szSaveBuffer[1024]:byte
LOCAL @stCR:CHARRANGE
mov esi,_lpData
mov hSign,0
invoke RtlZeroMemory,addr szBuffer,sizeof szBuffer
invoke RtlZeroMemory,addr szSaveBuffer,sizeof szSaveBuffer
invoke SendMessage,hEdithwnd02,WM_SETTEXT,0,0 ;清空编辑框
mov ebx,0
mov edx,0
.while TRUE
.break .if ebx == _dwSize
.if byte ptr [esi+ebx] == "<" && byte ptr [esi+ebx+1] == "a"
mov hSign,1
.endif
.if byte ptr [esi+ebx] == ">" && byte ptr [esi+ebx-1] == "a"
mov hSign,2
mov byte ptr [szBuffer+edx],">"
.endif
.if hSign == 1
mov al,byte ptr [esi+ebx]
mov byte ptr [szBuffer+edx],al
inc edx
.endif
.if hSign == 2
invoke GetWindowTextLength,hEdithwnd02
mov @stCR.cpMin,eax
mov @stCR.cpMax,eax
invoke MultiByteToWideChar,65001,0,addr szBuffer,256,addr szSaveBuffer,1024
invoke SendMessageW,hEdithwnd02,EM_EXSETSEL,0,addr @stCR
invoke SendMessageW,hEdithwnd02,EM_REPLACESEL,FALSE,addr szSaveBuffer
invoke SendMessage,hEdithwnd02,EM_REPLACESEL,FALSE,addr szEnter ;加上回车换行符
mov hSign,0
mov edx,0
.endif
inc ebx
.endw
ret
_HandleData endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WorkThread proc _lParam
LOCAL @dwBytesReaded
LOCAL @szBuffer[256]:byte
LOCAL @szRecBuffer[1024]:byte
LOCAL @szSaveBuffer[1024]:byte
LOCAL @stCR:CHARRANGE
invoke InternetOpen,addr szAgent,INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0 ;初始化应用程序的 WinINet 函数的使用
mov hInternet,eax
invoke InternetConnect,hInternet,addr szHostName,80,NULL,NULL,INTERNET_SERVICE_HTTP,0,0 ;为给定站点打开文件传输协议(FTP)或 HTTP 会话,80是http的端口
mov hHttpSession,eax
.if eax == NULL
invoke MessageBox,NULL,addr szErr,addr szMsg,MB_OK
.endif
invoke HttpOpenRequest,hHttpSession,addr szVerb,addr szUrlPath,NULL,addr szAccept,0,0,0 ;创建 HTTP 请求句柄
mov hHttpRequest,eax
invoke HttpSendRequest,hHttpRequest,NULL,0,NULL,0 ;将指定的请求发送到 HTTP 服务器,可以附加数据,后面再说,先实现基本效果先
.if eax == NULL
invoke MessageBox,NULL,addr szErr,addr szMsg,MB_OK
.endif
invoke SendMessageW,hEdithwnd01,WM_SETTEXT,0,0
.while TRUE ;通过循环反复读取,直到读到0字节为止
invoke RtlZeroMemory,addr @szRecBuffer,sizeof @szRecBuffer
invoke RtlZeroMemory,addr @szSaveBuffer,sizeof @szSaveBuffer
mov @dwBytesReaded,0
invoke InternetReadFile,hHttpRequest,addr @szRecBuffer,1024,addr @dwBytesReaded ;从打开的句柄读取数据,
.break .if @dwBytesReaded == 0
invoke _HandleData,addr @szRecBuffer,1024 ;这里不能按字符串的长度赋值,因为服务器返回的数据里面可能很多0,而一般字符串以0为结束符
invoke MultiByteToWideChar,65001,0,addr @szRecBuffer,1024,addr @szSaveBuffer,1024 ;将UTF8编码数据转为UNICODE编码
invoke GetWindowTextLength,hEdithwnd01 ;从后面添加内容,防止覆盖上去
mov @stCR.cpMin,eax
mov @stCR.cpMax,eax
invoke SendMessageW,hEdithwnd01,EM_EXSETSEL,0,addr @stCR
invoke SendMessageW,hEdithwnd01,EM_REPLACESEL,FALSE,addr @szSaveBuffer
.endw
ret
_WorkThread endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL @stWsa:WSADATA
.if uMsg == WM_INITDIALOG
invoke LoadIcon,hInstance,ICO_MAIN
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
invoke GetDlgItem,hWnd,ID_EDIT01
mov hEdithwnd01,eax
invoke GetDlgItem,hWnd,ID_EDIT02
mov hEdithwnd02,eax
.elseif uMsg == WM_COMMAND
mov ebx,wParam
.if bx == ID_BUTTON01
invoke CreateThread,NULL,0,offset _WorkThread,0,NULL,0 ;启动连接线程,用线程的原因是不让网络等待卡住主进程
.endif
.elseif uMsg == WM_CLOSE
invoke InternetCloseHandle,hHttpRequest ;反向清除各类HINTERNET 句柄,即先生成的后清除,后生成的先清除
invoke InternetCloseHandle,hHttpSession
invoke InternetCloseHandle,hInternet
invoke EndDialog,hWnd,NULL
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp
end start
;下面为rc文件内容
#include "resource.h" //提示缺少该文件,可以在资源里下载
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define MAINDIALOG 1
#define ICO_MAIN 1000 //图标
#define ID_BUTTON01 41
#define ID_EDIT01 11 //编辑框标识符
#define ID_EDIT02 12
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN ICON "Main.ico"
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//定义对话框
MAINDIALOG DIALOG 10, 10, 210, 250
STYLE DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "对话框程序模版"
FONT 11, "方正姚体"
BEGIN
PUSHBUTTON "连接网站", ID_BUTTON01, 150,20,50,12
CONTROL "这里显示的是服务器返回的信息",ID_EDIT01,"Edit",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP|ES_MULTILINE|ES_WANTRETURN|ES_AUTOVSCROLL|WS_VSCROLL,10, 60, 190, 180,WS_EX_CLIENTEDGE //设置成多行编辑框,按回车时加回车符
CONTROL "这里是提取到的链接地址",ID_EDIT02,"Edit",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP|ES_MULTILINE|ES_WANTRETURN|ES_AUTOVSCROLL|WS_VSCROLL,10, 10, 130, 40,WS_EX_CLIENTEDGE
END
相关文章:
win32汇编环境,网络编程入门之十一
;win32汇编环境,网络编程入门之十一 ;在上一教程里,我们学习了如何读取大容量的网页内容,在这一教程里,我们学习一下如何在wininet或winhttp机制中提取网页中的超链接 ;>>>>>>>>>>>>>>>>>…...
穿越之程序员周树人的狂人日记Part3__人机共生纪元
穿越之程序员周树人的狂人日记Part3__人机共生纪元 代码知识点:协程、内存管理、版本控制 故事一【协程陷阱】择偶标准的多核运算 故事二【内存泄漏】中产幻觉的垃圾回收 故事三【版本控制】人设仓库的强制推送 故事四【容器化生存】:员工生存之现状 静夜…...
后端——AOP异步日志
需求分析 在SpringBoot系统中,一般会对访问系统的请求做日志记录的需求,确保系统的安全维护以及查看接口的调用情况,可以使用AOP对controller层的接口进行增强,作日志记录。日志保存在数据库当中,为了避免影响接口的响…...
【C#语言】深入理解C#多线程编程:从基础到高性能实践
文章目录 ⭐前言⭐一、多线程的本质价值🌟1、现代计算需求🌟2、C#线程演进史 ⭐二、线程实现方案对比🌟1、传统线程模型🌟2、现代任务模型(推荐)🌟3、异步编程范式 ⭐三、线程安全深度解析&…...
第十四章:模板实例化_《C++ Templates》notes
模板实例化 核心知识点解析多选题设计题关键点总结 核心知识点解析 两阶段查找(Two-Phase Lookup) 原理: 模板在编译时分两个阶段处理: 第一阶段(定义时):检查模板语法和非依赖名称࿰…...
循环查询指定服务器开放端口(Python)
循环查询指定服务器开放端口列表 # Time : 2025/3/22 # Author : cookie # Desc :import socket import concurrent.futures from datetime import datetime# 设置目标IP和端口范围 target_ip input("请输入目标IP地址: ") start_port int(input("请输入…...
算法 | 蜣螂优化算法原理,引言,公式,算法改进综述,应用场景及matlab完整代码
蜣螂优化算法(Dung Beetle Optimizer, DBO)详解 1. 算法原理 蜣螂优化算法(DBO)是一种基于自然界蜣螂行为的元启发式优化算法,灵感来源于蜣螂的滚球、繁殖、觅食和偷窃行为。其核心思想是通过模拟蜣螂在复杂环境中的协作与竞争机制,解决全局优化问题。关键行为模拟: 滚球…...
排序复习_代码纯享
头文件 #pragma once #include<iostream> #include<vector> #include<utility> using std::vector; using std::cout; using std::cin; using std::endl; using std::swap;//插入排序 //1、直接插入排序(稳定) void InsertSort(vecto…...
【STM32】第一个工程的创建
目录 1、获取 KEIL5 安装包2、开始安装 KEIL52.1、 激活2.2、安装DFP库 3、工程创建4、搭建框架5、开始编写代码 1、获取 KEIL5 安装包 要想获得 KEIL5 的安装包,在百度里面搜索“KEIL5 下载”即可找到很多网友提供的下载文件,或者到 KEIL 的官网下载&a…...
SpringBoot+策略模式+枚举类,优雅消除if-else
需求分析 公司做物联网系统的,使用nettry进行设备连接,对设备进行数据采集,根据设备的协议对数据进行解析,解析完成之后存放数据库,但是不同厂家的设备协议不同。公司系统使用了使用了函数式编程的去写了一个解析类&am…...
前端框架学习路径与注意事项
学习前端框架是一个系统化的过程,需要结合理论、实践和工具链的综合掌握。以下是学习路径的关键方面和注意事项: 一、学习路径的核心方面 1. 基础概念与核心思想 组件化开发:理解组件的作用(复用性、隔离性)、组件通信…...
kubeval结合kube-score实现k8s yaml文件校验
一、工具定位与互补性 工具核心能力检查范围kubeval校验 YAML 语法和 API 版本兼容性确保资源配置符合 Kubernetes 版本规范kube-score检查安全配置与最佳实践识别资源限制缺失、权限过高等问题 协同作用: kubeval 确保配置文件的语法正确性,避免低级错…...
Linux驱动开发-①platform平台②MISC字符驱动框架③input框架
Linux驱动开发-①platform平台②MISC字符驱动框架③input框架 一,platform1.1 platform框架(设备树下)1.2 platform框架(配置设备函数) 二,MISC字符驱动框架三,input框架 一,platfor…...
【mysql】唯一性约束unique
文章目录 唯一性约束 1. 作用2. 关键字3. 特点4. 添加唯一约束5. 关于复合唯一约束 唯一性约束 1. 作用 用来限制某个字段/某列的值不能重复。 2. 关键字 UNIQUE3. 特点 同一个表可以有多个唯一约束。唯一约束可以是某一个列的值唯一,也可以多个列组合的值唯…...
pytest的测试报告allure
1、安装jdk,安装allure、下载allure,配置环境变量 1.1、下载地址:https://repo.maven.apache.org/maven2/io/qameta/allure/allurecommandline 找到最新版本下载即可 【下载zip包】解压到任意目录,建议目录不要在C盘 不要太深 最好不要有中文;进入allure解压后的目录,找到…...
常见中间件漏洞:Jboss篇
CVE-2015-7501 环境搭建 cd vulhub-master/jboss/JMXInvokerServlet-deserialization docker-compose up -d 过程 访问网址,存在页面说明接口存在且存在反序列化漏洞 http://8.130.17.222:8080/invoker/JMXInvokerServlet 2.下载 ysoserial ⼯具进⾏漏洞利⽤…...
2025年优化算法:龙卷风优化算法(Tornado optimizer with Coriolis force,TOC)
龙卷风优化算法(Tornado optimizer with Coriolis force)是发表在中科院二区期刊“ARTIFICIAL INTELLIGENCE REVIEW”(IF:11.7)的2025年智能优化算法 01.引言 当自然界的狂暴之力,化身数字世界的智慧引擎&…...
3.24-3 接口测试断言
一.postman 断言 1.断言再test中 #状态码是否等于200 tests["Status code is 200"] responseCode.code 200; #断言响应时间小于200ms tests["Response time is less than 200ms"] responseTime < 200; #断言响应体包含内容 tests["Body…...
DeepSeek面试——模型架构和主要创新点
本文将介绍DeepSeek的模型架构多头潜在注意力(MLA)技术,混合专家(MoE)架构, 无辅助损失负载均衡技术,多Token 预测(MTP)策略。 一、模型架构 DeepSeek-R1的基本架构沿用…...
【PostgreSQL】pg各版本选用取舍逻辑与docker安装postgres:15
企业常用 PostgreSQL 版本推荐 1. PostgreSQL 14(最常见,稳定) 目前许多企业仍在使用 PostgreSQL 14,因为它在性能、并发处理、JSON 支持等方面做了较多优化,同时又非常稳定。官方支持时间:2026 年 11 月…...
Python----计算机视觉处理(Opencv:图像亮度变换)
一、图像亮度变换 亮度调整:图像像素强度整体变高或者变低。 对比度调整:图像暗处像素强度变低,图像亮处像素强度变高,从而拉大中间某个区域范围的显示精 度。 A:原图 …...
无人机动平衡-如何在螺旋桨上添加或移除材料
平衡无人机螺旋桨是一项精细的工作,直接影响飞行稳定性和组件寿命。不同的方法适用于不同的情况,螺旋桨的材料和尺寸以及所需调整的幅度都会影响选择的方法。 本文将深入探讨添加如胶水和胶带等材料的方法,以及通过打磨和修剪来移除质量的方…...
基于python的租房网站-房屋出租租赁系统(python+django+vue)源码+运行步骤
该项目是基于python/django/vue开发的房屋租赁系统/租房平台,作为本学期的课程作业作品。欢迎大家提出宝贵建议。给师弟开发的课程作业,技术学习可以留言哦 功能介绍 平台采用B/S结构,后端采用主流的PythonDjango进行开发,前端采…...
C++ 的 if-constexpr
1 if-constexpr 语法 1.1 基本语法 if-constexpr 语法是 C 17 引入的新语法特性,也被称为常量 if 表达式或静态 if(static if)。引入这个语言特性的目的是将 C 在编译期计算和求值的能力进一步扩展,更方便地实现编译期的分支…...
涨薪技术|k8s设计原理
01k8s介绍 Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化 工作负载和服务,有助于实现声明性配置和自动化。它有一个庞大、快速增长的生态系统。Kubernetes 服务、支持和工具广泛可用。Kubernetes 这个名字起源于希腊语,意思是舵…...
基于FPGA的16QAM+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR
目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 16QAM调制解调原理 2.2 帧同步 3.Verilog核心程序 4.完整算法代码文件获得 1.算法仿真效果 vivado2019.2仿真结果如下(完整代码运行后无水印): 设置SNR12db 将FPGA数据导入到MATLAB显…...
QuecPython 外设接口之GPIO应用指南
基础知识 了解GPIO基础知识更有益于我们使用它。 框图 GPIO(通用输入输出)是指一种通用的数字输入/输出接口,用于与外部电子元件或设备进行通信。它通常存在于微处理器、微控制器和其他嵌入式系统中。 物理电路结构如下图所示:…...
Spring Boot 整合 Nacos 注册中心终极指南
在微服务架构中,配置管理和动态路由是核心需求。Nacos 作为阿里巴巴开源的动态服务发现、配置管理和服务管理平台,能够帮助开发者实现配置热更新、多环境共享配置以及动态路由管理。本文将结合 Spring Boot 和 Spring Cloud Gateway,手把手教…...
清晰易懂的 Maven 彻底卸载与清理教程
一、Windows 系统卸载 Maven 步骤 1:删除 Maven 安装目录 找到 Maven 的安装路径(默认可能为 C:\Program Files\apache-maven-3.x.x 或自定义路径)。直接删除整个 Maven 文件夹(如 apache-maven-3.x.x)。 步骤 2&am…...
光流 | 基于KLT算法的人脸检测与跟踪原理及公式,算法改进,matlab代码
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 人脸检测与跟踪 一、KLT算法原理与分析1. 核心思想2. 数学模型二、人脸…...
