开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

楼主: 笨来无一悟
收起左侧

[易语言纯源码] 【蠢新学汇编】截取 子程序代码 字节集片段 终版

[复制链接]
结帖率:100% (4/4)
发表于 2025-4-2 08:10:56 | 显示全部楼层   山东省淄博市
感谢分享
回复 支持 反对

使用道具 举报

签到天数: 17 天

发表于 2025-4-2 07:56:14 | 显示全部楼层   湖北省武汉市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:99% (109/110)

签到天数: 21 天

发表于 2025-4-2 07:15:37 | 显示全部楼层   山东省青岛市
感谢您对论坛的支持!
回复 支持 反对

使用道具 举报

结帖率:98% (53/54)

签到天数: 20 天

发表于 2025-4-2 07:11:21 | 显示全部楼层   山东省青岛市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 10 天

发表于 2025-4-1 22:43:37 | 显示全部楼层   浙江省杭州市
感谢大神分享~!
回复 支持 反对

使用道具 举报

签到天数: 15 天

发表于 2025-4-1 20:48:09 | 显示全部楼层   江苏省连云港市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:80% (4/5)

签到天数: 3 天

发表于 2025-4-1 19:07:56 | 显示全部楼层   山东省潍坊市
感谢解答,原来是用来分析的。
回复 支持 反对

使用道具 举报

结帖率:73% (8/11)

签到天数: 6 天

发表于 2025-4-1 18:14:37 | 显示全部楼层   河南省郑州市
本帖最后由 神行 于 2025-4-1 18:17 编辑

不好意思,之前提的意见,我没注意到你对汇编特别感兴趣。我对你的代码进行了改进。你看看如何。主要增加内存安全验证,优化搜索算法(函数头+函数尾双阶段搜索),添加安全计数(头100字节 尾500字节限制),多重失败检查点,无效长度处理,内存分配失败处理,减少不必要的内存访问,优化跳转逻辑,新增内存属性检查,安全长度限制4KB,独立内存分配复制,错误状态返回
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
变量名类 型静态数组备 注
机器码字节集 
长度整数型 
' 安全获取子程序机器码
机器码 = 取函数机器码_增强版 (&子程序, 长度)
如果真 (取字节集长度 (机器码) = 0)
信息框 ("获取机器码失败!", 0, "错误", )
调试输出 ("获取成功,长度:" + 到文本 (长度), 机器码)

子程序名返回值类型公开备 注
子程序双精度小数型 
参数名类 型参考可空数组备 注
参数一整数型
参数二双精度小数型
返回 (参数一 + 参数二)
子程序名返回值类型公开备 注
取函数机器码_增强版字节集 
参数名类 型参考可空数组备 注
函数指针整数型要获取机器码的函数地址
返回长度整数型返回获取的机器码长度
变量名类 型静态数组备 注
起始偏移整数型 
结束偏移整数型 
安全计数器整数型 
内存保护整数型 
' ================ 安全验证 ================
如果真 (函数指针 = 0 是否可读内存 (函数指针, 1))
返回 ({ })

' ================ 内存属性检查 ================
内存保护 = 取内存保护属性 (函数指针)
如果真 (位与 (内存保护, #PAGE_EXECUTE_READ ) = 0)
返回 ({ })

' ================ 汇编实现 ================
置入代码 ({ 139, 69, 8, 137, 69, 252, 51, 210, 137, 85, 248 })
' MOV EAX, [EBP+8]    ; 获取函数指针
' MOV [EBP-4], EAX    ; 起始偏移 = 函数地址
' XOR EDX, EDX        ; EDX = 0 (安全计数器)
' MOV [EBP-8], EDX    ; 结束偏移 = 0
' ================ 查找函数头 ================
置入代码 ({ 139, 77, 252, 138, 1, 60, 85, 117, 3, 235, 16, 144 })
' HEADER_SEARCH:
' MOV ECX, [EBP-4]    ; ECX = 当前地址
' MOV AL, [ECX]       ; 读取字节
' CMP AL, 0x55        ; 检查PUSH EBP
' JNE NOT_HEADER
' JMP HEADER_FOUND
' NOT_HEADER:
' NOP
置入代码 ({ 255, 69, 252, 255, 69, 244, 131, 125, 244, 100, 124, 229 })
' INC DWORD [EBP-4]   ; 地址+1
' INC DWORD [EBP-12]  ; 安全计数器+1
' CMP DWORD [EBP-12], 100 ; 最多检查100字节
' JL HEADER_SEARCH
置入代码 ({ 233, 88, 0, 0, 0 })
' JMP FAIL_EXIT       ; 未找到函数头
置入代码 ({ 131, 193, 1, 137, 77, 252 })
' HEADER_FOUND:
' ADD ECX, 1          ; 跳过函数头
' MOV [EBP-4], ECX    ; 更新起始地址
' ================ 查找函数尾 ================
置入代码 ({ 139, 85, 252, 137, 85, 248, 51, 210, 137, 85, 244 })
' MOV EDX, [EBP-4]    ; EDX = 起始地址
' MOV [EBP-8], EDX    ; 初始化结束地址
' XOR EDX, EDX        ; 清空EDX
' MOV [EBP-12], EDX   ; 重置安全计数器
置入代码 ({ 139, 117, 248, 138, 6, 60, 139, 117, 19 })
' TAIL_SEARCH:
' MOV ESI, [EBP-8]    ; ESI = 当前地址
' MOV AL, [ESI]       ; 读取字节
' CMP AL, 0x8B        ; 检查MOV EBP,ESP
' JNE NEXT_BYTE
置入代码 ({ 128, 126, 1, 229, 117, 12, 128, 126, 2, 93, 117, 8 })
' CMP BYTE [ESI+1], 0xE5 ; 检查完整指令
' JNE NEXT_BYTE
' CMP BYTE [ESI+2], 0x5D ; 检查POP EBP
' JNE NEXT_BYTE
置入代码 ({ 128, 126, 3, 194, 116, 8, 128, 126, 3, 195, 116, 4 })
' CMP BYTE [ESI+3], 0xC2 ; RETN xxxx
' JE TAIL_FOUND
' CMP BYTE [ESI+3], 0xC3 ; RETN
' JE TAIL_FOUND
置入代码 ({ 255, 69, 248, 255, 69, 244, 131, 125, 244, 500, 124, 204 })
' NEXT_BYTE:
' INC DWORD [EBP-8]   ; 地址+1
' INC DWORD [EBP-12]  ; 计数器+1
' CMP DWORD [EBP-12], 500 ; 最多检查500字节
' JL TAIL_SEARCH
置入代码 ({ 139, 77, 252, 43, 77, 248, 137, 77, 240 })
' TAIL_FOUND:
' MOV ECX, [EBP-8]    ; 结束地址
' SUB ECX, [EBP-4]    ; 计算长度
' MOV [EBP-16], ECX   ; 保存长度
' ================ 长度验证 ================
置入代码 ({ 131, 249, 0, 126, 29, 129, 249, 0, 16, 0, 0, 127, 22 })
' CMP ECX, 0          ; 检查长度有效性
' JLE INVALID_LEN
' CMP ECX, 4096       ; 最大4KB
' JG INVALID_LEN
置入代码 ({ 139, 85, 252, 139, 77, 248, 43, 202, 137, 77, 240, 233, 5, 0, 0, 0 })
' MOV EDX, [EBP-4]    ; 起始地址
' MOV ECX, [EBP-8]    ; 结束地址
' SUB ECX, EDX        ; 计算实际长度
' MOV [EBP-16], ECX   ; 保存长度
' JMP COPY_CODE
置入代码 ({ 51, 201, 137, 77, 240 })
' INVALID_LEN:
' XOR ECX, ECX        ; 长度置0
' MOV [EBP-16], ECX
' ================ 复制机器码 ================
置入代码 ({ 139, 117, 252, 139, 125, 240, 133, 255, 116, 19 })
' COPY_CODE:
' MOV ESI, [EBP-4]    ; 源地址
' MOV EDI, [EBP-16]   ; 长度
' TEST EDI, EDI       ; 检查长度
' JZ FAIL_EXIT
置入代码 ({ 106, 0, 255, 117, 240, 232, 40, 0, 0, 0, 137, 69, 232 })
' PUSH 0              ; 内存属性
' PUSH [EBP-16]       ; 长度
' CALL AllocMem       ; 调用内存分配
' MOV [EBP-24], EAX   ; 保存分配的内存地址
置入代码 ({ 139, 77, 240, 139, 117, 252, 139, 125, 232, 243, 164 })
' MOV ECX, [EBP-16]   ; 长度
' MOV ESI, [EBP-4]    ; 源地址
' MOV EDI, [EBP-24]   ; 目标地址
' REP MOVSB           ; 复制机器码
' ================ 返回结果 ================
置入代码 ({ 139, 69, 232, 233, 10, 0, 0, 0 })
' MOV EAX, [EBP-24]   ; 返回内存地址
' JMP SUCCESS_EXIT
置入代码 ({ 51, 192 })
' FAIL_EXIT:
' XOR EAX, EAX        ; 返回0表示失败
置入代码 ({ 139, 77, 240, 137, 77, 236 })
' SUCCESS_EXIT:
' MOV ECX, [EBP-16]   ; 获取长度
' MOV [EBP-20], ECX   ; 保存到局部变量
如果真 (是否为空 (返回长度))
返回长度 = 取变量数据地址_整数 (取变量地址 (起始偏移)取变量地址 (结束偏移))

返回 (指针到字节集 (取变量数据地址_整数 (起始偏移), 取变量数据地址_整数 (结束偏移 - 起始偏移)))

点评

安全+1   贵州省毕节市  发表于 2025-4-1 18:42
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)

签到天数: 16 天

发表于 2025-4-1 17:03:55 | 显示全部楼层   广东省汕头市
请教大神:为什么使用置入代码命令运行 这个程序里“调试输出 (截取)” 获得的字节集,会没有反应?
(我把子程序的内容改为调试输出(“aaaaaaaaa”))
该怎样执行截取到的代码?

点评

又比如 你执行一个类的方法 就可以扣代码分析出 类方法的指针这么获取的 类方法的那个也是这样抠出来的   贵州省毕节市  发表于 2025-4-1 19:02
截取代码一般是拿来这么用的 比如易语言写的比较函数 扣汇编出来会发现多了两个不必要的分支 于是就可以手动改得更高效 又避免了从0全程敲汇编   贵州省毕节市  发表于 2025-4-1 19:01
你把你截取之前的代码发出来看看咋回事 涉及跳转的地方 要修改跳转的位置   贵州省毕节市  发表于 2025-4-1 18:41
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)

签到天数: 16 天

发表于 2025-4-1 16:56:36 | 显示全部楼层   广东省汕头市

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

使用道具 举报

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

本版积分规则 致发广告者

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

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

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