开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 236|回复: 7
打印 上一主题 下一主题
收起左侧

[易源码分享] hex2bin汇编版

[复制链接]
结帖率:100% (3/3)
跳转到指定楼层
楼主
发表于 9 小时前 | 只看该作者 回帖奖励 |正序浏览 |阅读模式   福建省厦门市
分享源码
界面截图: -
是否带模块: 纯源码
备注说明: -
  
子程序名返回值类型公开备 注
hextobin字节集 把十六进制字符还原为原始字节集
参数名类 型参考可空数组备 注
hex通用型支持文本型和文本型指针
len整数型可选参数(传指针时可能会用到)
变量名类 型静态数组备 注
dwBytes整数型 
' __asm{
' mov eax,[ebp+08h]; EAX=hex参考参数地址
' mov ecx,[ebp+0Ch]; ECX=len参数
' mov eax,[eax]; EAX=十六进制文本指针
' test eax,eax ; 判断文本指针是否为空
' jz 返回空字节集 ; 为空则直接返回
' test ecx,ecx ; 判断是否提供了len
' cmovne eax,ecx   ; len非零时EAX=len
' jnz 长度已经取得; 已提供长度则跳过扫描
' mov edx,eax  ; EDX=输入文本地址
' pxor mm0,mm0 ; 将MM0清零
' and edx,0FFFFFFF8h   ; 地址向下按8字节对齐
' mov ecx,eax  ; ECX保存原始文本地址
' pcmpeqb mm0,[edx]; 检查8字节中的零字节
' and ecx,7; 计算文本在对齐块内的偏移
' pmovmskb eax,mm0 ; 将比较结果转换为位掩码
' add edx,8; EDX指向下一个8字节块
' shr eax,cl   ; 忽略文本地址之前的比较位
' pxor mm0,mm0 ; 再次将MM0清零
' bsf eax,eax  ; 查找第一个零字节位置
' jnz 字符串长度计算完成  ; 找到字符串结尾则结束扫描
' mov eax,edx  ; EAX=后续扫描地址
' add edx,ecx  ; 构造长度计算基准
' 字符串长度扫描循环: ; 每次扫描8字节
' pcmpeqb mm0,[eax]; 检查当前块中的零字节
' add eax,8; EAX指向下一个8字节块
' pmovmskb ecx,mm0 ; 提取零字节位置掩码
' test ecx,ecx ; 判断是否存在零字节
' jz 字符串长度扫描循环   ; 没找到则继续扫描
' bsf ecx,ecx  ; ECX=第一个零字节位置
' sub ecx,edx  ; 根据起始地址修正长度
' add eax,ecx  ; EAX=最终文本字符数
' 字符串长度计算完成: ; 字符串长度扫描完成
' emms ; 清除MMX状态
' 长度已经取得:   ; EAX=十六进制字符数量
' shr eax,1; 两个字符转换为一个字节
' jz 返回空字节集 ; 输出长度为0则返回
' add eax,8; 加上字节集的8字节头部
' jmp 保存分配大小; 跳转保存分配长度
' 返回空字节集:   ; 空输入返回位置
' leave; 恢复ESP和EBP
' ret 0Ch  ; 返回并清理参数
' 保存分配大小:   ; 保存需要分配的总长度
' mov [ebp-04h],eax; dwBytes=输出长度+8
' }
申请内存 (dwBytes, )
' __asm{
' test eax,eax ; 判断HeapAlloc是否成功
' jz 函数返回 ; EAX为0则直接返回
' call 取得当前代码地址   ; 将下一条指令地址压栈
' 取得当前代码地址:   ; 当前代码地址位于栈顶
' mov ebx,[ebp-04h]; EBX=dwBytes
' mov edi,eax  ; EDI=分配到的内存地址
' mov esp,[esp]; ESP=当前代码地址
' lea ecx,[ebx-8]  ; ECX=实际输出字节数
' mov dword [edi],1; 写入字节集头部字段
' mov esi,[ebp+08h]; ESI=hex参考参数地址
' mov [ebp+08h],eax; 暂存最终返回地址
' mov esi,[esi]; ESI=输入文本地址
' mov [edi+4],ecx  ; 写入字节集数据长度
' add esp,0xBF ; ESP调整为查找表基址
' add edi,8; EDI指向输出数据区
' and ecx,0FFFFFFFCh   ; 取得4字节整数倍部分
' jz 处理两字节尾部   ; 不足4字节则处理尾部
' lea ebx,[edi+ecx]; EBX=主循环结束地址
' 八字符转换循环: ; 8个字符转换为4字节
' mov eax,[esi+4]  ; EAX=后4个输入字符
' add esi,4; ESI移动到后4个字符
' movzx edx,al ; EDX=第5个字符ASCII码
' mov cl,[esp+edx] ; CL=第5个字符对应数值
' movzx edx,ah ; EDX=第6个字符ASCII码
' shl cl,4 ; 第5个字符移到高4位
' mov dl,[esp+edx] ; DL=第6个字符对应数值
' shr eax,16   ; 第7、8个字符进入AL、AH
' or cl,dl ; 合并第5、6个字符
' movzx edx,al ; EDX=第7个字符ASCII码
' movzx eax,ah ; EAX=第8个字符ASCII码
' mov ch,[esp+edx] ; CH=第7个字符对应数值
' mov dl,[esp+eax] ; DL=第8个字符对应数值
' shl ch,4 ; 第7个字符移到高4位
' mov eax,[esi-4]  ; EAX=前4个输入字符
' or ch,dl ; 合并第7、8个字符
' movzx edx,al ; EDX=第1个字符ASCII码
' shl ecx,16   ; 后两个输出字节移至高16位
' add esi,4; ESI移动到下一组输入
' mov cl,[esp+edx] ; CL=第1个字符对应数值
' movzx edx,ah ; EDX=第2个字符ASCII码
' shl cl,4 ; 第1个字符移到高4位
' mov dl,[esp+edx] ; DL=第2个字符对应数值
' shr eax,16   ; 第3、4个字符进入AL、AH
' or cl,dl ; 合并第1、2个字符
' movzx edx,al ; EDX=第3个字符ASCII码
' movzx eax,ah ; EAX=第4个字符ASCII码
' mov ch,[esp+edx] ; CH=第3个字符对应数值
' mov dl,[esp+eax] ; DL=第4个字符对应数值
' shl ch,4 ; 第3个字符移到高4位
' or ch,dl ; 合并第3、4个字符
' mov [edi],ecx; 写入4个输出字节
' add edi,4; EDI移动到下一输出位置
' cmp edi,ebx  ; 判断是否到达结束地址
' jne 八字符转换循环  ; 未结束则继续处理
' mov ebx,[ebp-04h]; EBX重新取得dwBytes
' 处理两字节尾部: ; 检查是否剩余2字节
' test ebx,2   ; 检查输出长度第1位
' jz 处理一字节尾部   ; 没有则检查1字节尾部
' mov eax,[esi]; EAX=剩余4个输入字符
' add esi,4; ESI越过这4个字符
' movzx edx,al ; EDX=第1个字符ASCII码
' mov cl,[esp+edx] ; CL=第1个字符对应数值
' movzx edx,ah ; EDX=第2个字符ASCII码
' shl cl,4 ; 第1个字符移到高4位
' mov dl,[esp+edx] ; DL=第2个字符对应数值
' shr eax,16   ; 第3、4个字符进入AL、AH
' or cl,dl ; 合并第1、2个字符
' movzx edx,al ; EDX=第3个字符ASCII码
' movzx eax,ah ; EAX=第4个字符ASCII码
' mov ch,[esp+edx] ; CH=第3个字符对应数值
' mov dl,[esp+eax] ; DL=第4个字符对应数值
' shl ch,4 ; 第3个字符移到高4位
' or ch,dl ; 合并第3、4个字符
' mov [edi],cx ; 写入2个输出字节
' add edi,2; EDI向后移动2字节
' 处理一字节尾部: ; 检查是否剩余1字节
' test ebx,1   ; 检查输出长度最低位
' jz 转换完成 ; 没有剩余则结束
' mov ax,[esi] ; AX=最后两个输入字符
' movzx edx,al ; EDX=第1个字符ASCII码
' mov cl,[esp+edx] ; CL=第1个字符对应数值
' movzx edx,ah ; EDX=第2个字符ASCII码
' shl cl,4 ; 第1个字符移到高4位
' mov dl,[esp+edx] ; DL=第2个字符对应数值
' or cl,dl ; 合并最后两个字符
' mov [edi],cl ; 写入最后1个输出字节
' 转换完成:   ; 全部字符转换完成
' mov eax,[ebp+08h]; EAX=最终字节集地址
' 函数返回:   ; 函数返回位置
' leave; 恢复ESP和EBP
' ret 0Ch  ; 返回并清理参数
' 字符转换查找表: ; ASCII字符转换数据
' db 0,1,2,3,4,5,6,7,8,9  ; 字符0到9
' times 7 db 0 ; 字符冒号到@
' db 10,11,12,13,14,15; 字符A到F
' times 29 db 0; 原机器码中的29个零
' db 10,11,12,13,14,15; 原机器码末尾第二组数值
' }
返回 ({  })


i支持库列表   支持库注释   
spec特殊功能支持库






  
子程序名返回值类型公开备 注
hex2bin字节集 十六进制文本转字节集(不能带空格&前缀,大小写不影响!)  By:白银
参数名类 型参考可空数组备 注
hex通用型支持文本型  或 文本型指针
len整数型可选参数(传指针时可能会用到)
变量名类 型静态数组备 注
dwBytes整数型 
置入代码 ({ 139, 69, 8, 139, 77, 12, 139, 0, 133, 192, 116, 74, 133, 201, 15, 69, 193, 117, 58, 137, 194, 15, 239, 192, 131, 226, 248, 137, 193, 15, 116, 2, 131, 225, 7, 15, 215, 192, 131, 194, 8, 211, 232, 15, 239, 192, 15, 188, 192, 117, 24, 137, 208, 1, 202, 15, 116, 0, 131, 192, 8, 15, 215, 200, 133, 201, 116, 243, 15, 188, 201, 41, 209, 1, 200, 15, 119, 209, 232, 116, 5, 131, 192, 8, 235, 4, 201, 194, 12, 0, 137, 69, 252 })
HeapAlloc (ProcessHeap, 0, dwBytes)
置入代码 ({ 133, 192, 15, 132, 240, 0, 0, 0, 232, 0, 0, 0, 0, 139, 93, 252, 137, 199, 139, 36, 36, 141, 75, 248, 199, 7, 1, 0, 0, 0, 139, 117, 8, 137, 69, 8, 139, 54, 137, 79, 4, 129, 196, 191, 0, 0, 0, 131, 199, 8, 131, 225, 252, 116, 104, 141, 28, 15, 139, 70, 4, 131, 198, 4, 15, 182, 208, 138, 12, 20, 15, 182, 212, 192, 225, 4, 138, 20, 20, 193, 232, 16, 8, 209, 15, 182, 208, 15, 182, 196, 138, 44, 20, 138, 20, 4, 192, 229, 4, 139, 70, 252, 8, 213, 15, 182, 208, 193, 225, 16, 131, 198, 4, 138, 12, 20, 15, 182, 212, 192, 225, 4, 138, 20, 20, 193, 232, 16, 8, 209, 15, 182, 208, 15, 182, 196, 138, 44, 20, 138, 20, 4, 192, 229, 4, 8, 213, 137, 15, 131, 199, 4, 57, 223, 117, 158, 139, 93, 252, 247, 195, 2, 0, 0, 0, 116, 48, 139, 6, 131, 198, 4, 15, 182, 208, 138, 12, 20, 15, 182, 212, 192, 225, 4, 138, 20, 20, 193, 232, 16, 8, 209, 15, 182, 208, 15, 182, 196, 138, 44, 20, 138, 20, 4, 192, 229, 4, 8, 213, 102, 137, 15, 131, 199, 2, 247, 195, 1, 0, 0, 0, 116, 22, 102, 139, 6, 15, 182, 208, 138, 12, 20, 15, 182, 212, 192, 225, 4, 138, 20, 20, 8, 209, 136, 15, 139, 69, 8, 201, 194, 12, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 14, 15 })
返回 ({  })




签到天数: 10 天

8
发表于 1 小时前 | 只看该作者   山东省青岛市
汇编版啊,速度应该很快呢。不过这参数设计有点简略哈,len传指针的时候具体咋用的能说下吗?好奇。
回复 支持 反对

使用道具 举报

签到天数: 6 天

7
发表于 2 小时前 | 只看该作者   湖南省*
感谢分享
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)

签到天数: 7 天

6
发表于 2 小时前 | 只看该作者   广东省汕头市

感谢大神分享~!
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 10 天

地下
发表于 3 小时前 | 只看该作者   内蒙古自治区兴安盟
回复 支持 反对

使用道具 举报

结帖率:96% (505/524)

签到天数: 4 天

地板
发表于 4 小时前 | 只看该作者   内蒙古自治区乌海市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:57% (13/23)

签到天数: 7 天

板凳
发表于 4 小时前 | 只看该作者   江苏省徐州市
感谢分享辛苦了
回复 支持 反对

使用道具 举报

签到天数: 8 天

沙发
发表于 6 小时前 | 只看该作者   辽宁省丹东市
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备2025452707号) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表