开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 6682|回复: 10
收起左侧

[已回应] 程序_取数据大小、程序_取数据成员数、程序_取变量类型...

[复制链接]
结帖率:80% (24/30)
发表于 2022-1-3 15:35:09 | 显示全部楼层 |阅读模式   广西壮族自治区北海市
  
子程序名返回值类型公开备 注
程序_取数据大小整数型 常用于Windows Api结构体中的cbsize成员,它总是固定的(小风明SS)
参数名类 型参考可空数组备 注
数据整数型传入指针
变量名类 型静态数组备 注
a整数型 
‘小风明SS
RtlMoveMemory (取指针_通用型 (a), 数据, 4)
返回 (LocalSize (a))
子程序名返回值类型公开备 注
程序_取数据成员数整数型 常用于Windows Api结构易语言中为4字节对齐(小风明SS)
参数名类 型参考可空数组备 注
数据整数型传入指针
变量名类 型静态数组备 注
a整数型 
‘小风明SS
RtlMoveMemory (取指针_通用型 (a), 数据, 4)
返回 (LocalSize (a) ÷ 4)
子程序名返回值类型公开备 注
程序_取变量类型整数型 返回变量的实际类型,注:该子程序判断不是很准确(返回值:0.自定义类型 1.数值类型 2.文本型 3.字节集 4.数组 5.子程序指针)
参数名类 型参考可空数组备 注
变量通用型自定义类型和子程序指针判断的比较准确,因为内存中特征较多
变量名类 型静态数组备 注
m整数型 
c整数型 
置入代码 ({ 139, 69, 8, 137, 69, 252, 80 })
' mov eax, dword [ebp+0x08]
' mov dword [ebp-0x04], eax
' push eax
如果真 (IsBadReadPtr (m, 4))
返回 (1)
置入代码 ({ 88, 139, 0, 137, 69, 248 })
' pop eax
' mov eax, dword [eax]
' mov dword [ebp-0x08], eax
如果真 (c ≠ 1)
c = GlobalSize (m)
如果真 (c = 0)
置入代码 ({ 139, 69, 252, 139, 0, 129, 224, 255, 255, 255, 0, 137, 69, 248 })
' mov eax, dword [ebp-0x04]
' mov eax, dword [eax]
' and eax, 0x00FFFFFF
' mov dword [ebp-0x08], eax
返回 (选择 (c = 5461846 c = 15042901, 5, 2))
返回 (0)
c = GlobalSize (m)
如果真 (c ≠ 0)
置入代码 ({ 139, 69, 252, 139, 64, 4, 137, 69, 252 })
' mov eax, dword [ebp-0x04]
' mov eax, dword [eax+0x04]
' mov dword [ebp-0x04], eax
c = c - 8
返回 (选择 (m = c, 3, 4))
返回 (3)
子程序名返回值类型公开备 注
强制转换整数型 返回目的变量原数据地址。本质是将源数据的值写入目标变量,源数据不是基本类型的时候就是传指针了(注意如果源数据与目标变量类型不能兼容的话,程序就会崩溃)
参数名类 型参考可空数组备 注
转换到的变量通用型
欲转换的变量通用型
置入代码 ({ 139, 69, 8, 255, 48, 255, 117, 12, 143, 0, 88, 201, 194, 4, 0 })
' mov eax, dword [ebp+0x08]
' push dword [eax]
' push dword [ebp+0x0C]
' pop dword [eax]
' pop eax
' leave
' retn 0x0004
返回 (0)
子程序名返回值类型公开备 注
程序_调试输出 本命令仅在易程序的调试版本中被执行,在发布版本中将被直接跳过。类似于易语言核心库中的“输出调试文本()”命令,向输出面板输出一行调试文本。本命令可接受任意通用型(整数,文本,字节集,子程序指针)参数,形如:“字节集:n{101,121,117,121,97,110,...}”,其中n为字节集长度,{}之间为字节集数据。
参数名类 型参考可空数组备 注
输出内容通用型
变量名类 型静态数组备 注
type整数型 
int整数型 
string文本型 
binary字节集 
如果真 (IsDebuggerPresent ())
返回 ()
type = 程序_取变量类型 (输出内容)
判断 (type = 0)
输出调试文本 (“(自定义数据类型”“|成员数:”到文本 (程序_取数据成员数 (取指针_通用型 (输出内容)))“)”)
判断 (type = 1)
强制转换 (int, 输出内容)
输出调试文本 (int)
判断 (type = 2)
强制转换 (string, 输出内容)
如果 (到字节集 (string){ 80, 254, 25 })
输出调试文本 (“(空)”)
输出调试文本 ( #左引号 + string + #右引号 )

判断 (type = 3 type = 4)
强制转换 (binary, 输出内容)
输出调试文本 (“数组:”到文本 (取字节集长度 (binary)) + 字节集_字节集转文本 (binary))
' 未被实际使用
判断 (type = 5)
强制转换 (int, 输出内容)
输出调试文本 (“(子程序指针:”到文本 (int)“)”)
输出调试文本 (“(?未知?)”)



注:通用型使用较多,请粘贴时注意转换

评分

参与人数 1好评 +1 精币 +5 收起 理由
项目部004 + 1 + 5 感谢你的支持,精易有你更精彩

查看全部评分

发表于 2023-9-28 11:59:34 | 显示全部楼层   江苏省徐州市
1111111111111111111
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 2022-5-7 22:19:06 | 显示全部楼层   天津市天津市
#在这里快速回复#666666666666666666666
回复 支持 反对

使用道具 举报

结帖率:100% (8/8)

签到天数: 23 天

发表于 2022-1-3 22:34:06 | 显示全部楼层   广西壮族自治区崇左市
htpidk 发表于 2022-1-3 16:16
他的RtlMoveMemory这个API的第二个参数应该是参考的,所以RtlMoveMemory (取指针_通用型 (a), 数据, 4)  ...

要是第二个参数是参考的话, 那确实可以跑, 如果第二个参数不是参考的话, 那a就是 cbSize了....
一般cbSize不会大于0xFFFF, 一般小于0x8000的都不会被当成一个地址
回复 支持 反对

使用道具 举报

结帖率:100% (8/8)

签到天数: 23 天

发表于 2022-1-3 22:32:41 | 显示全部楼层   广西壮族自治区崇左市
1185384801 发表于 2022-1-3 16:21
实际上RtlMoveMemory+LocalSize这种写法我之前也用过,但是后来我发现这东西有坑,在计算嵌套数据类型的 ...

易语言里所有的数据类型, 只要不是数值型, 逻辑型, 日期时间, 子程序指针 其他都是存放指针
所以你嵌套的那个成员只占用4个字节, 不管这个结构有多少个成员
数组也是占用4个字节, 反正不是基础数据类型的, 都是4个字节
回复 支持 反对

使用道具 举报

结帖率:80% (24/30)
 楼主| 发表于 2022-1-3 20:58:25 | 显示全部楼层   广西壮族自治区北海市
sinewtec 发表于 2022-1-3 17:54
程序_取变量类型 在某种情况下是不准确的!慎用。

是的已经注明
回复 支持 反对

使用道具 举报

签到天数: 18 天

发表于 2022-1-3 17:54:50 | 显示全部楼层   广东省广州市
程序_取变量类型 在某种情况下是不准确的!慎用。
回复 支持 反对

使用道具 举报

结帖率:100% (4/4)

签到天数: 21 天

发表于 2022-1-3 16:23:55 | 显示全部楼层   北京市北京市
第一个命令这样使用其实是有 坑 的,不建议这样玩
回复 支持 反对

使用道具 举报

结帖率:100% (4/4)

签到天数: 21 天

发表于 2022-1-3 16:21:04 | 显示全部楼层   北京市北京市
福仔 发表于 2022-1-3 15:47
第一第二个是什么鬼?
如果说是读cbSize的话, RtlMoveMemory 就已经读到了啊, 为什么还要用 LocalSize?
你要 ...

实际上RtlMoveMemory+LocalSize这种写法我之前也用过,但是后来我发现这东西有坑,在计算嵌套数据类型的时候算出来的结果是错的

点评

易语言里所有的数据类型, 只要不是数值型, 逻辑型, 日期时间, 子程序指针 其他都是存放指针 所以你嵌套的那个成员只占用4个字节, 不管这个结构有多少个成员 数组也是占用4个字节, 反正不是基础数据类型的, 都是4个字   广西壮族自治区崇左市  详情 回复 发表于 2022-1-3 22:32
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 23 天

发表于 2022-1-3 16:16:49 | 显示全部楼层   广东省深圳市
福仔 发表于 2022-1-3 15:47
第一第二个是什么鬼?
如果说是读cbSize的话, RtlMoveMemory 就已经读到了啊, 为什么还要用 LocalSize?
你要 ...

他的RtlMoveMemory这个API的第二个参数应该是参考的,所以RtlMoveMemory (取指针_通用型 (a), 数据, 4) 后a=数据,也就是a是结构体的指针,localsize(a)可以取到结构体大小,不过既然这样用localsize(数据)不是更好,看不到他的API声明只能这样去推测。

点评

要是第二个参数是参考的话, 那确实可以跑, 如果第二个参数不是参考的话, 那a就是 cbSize了.... 一般cbSize不会大于0xFFFF, 一般小于0x8000的都不会被当成一个地址   广西壮族自治区崇左市  详情 回复 发表于 2022-1-3 22:34
回复 支持 反对

使用道具 举报

结帖率:100% (8/8)

签到天数: 23 天

发表于 2022-1-3 15:47:15 | 显示全部楼层   广西壮族自治区崇左市
第一第二个是什么鬼?
如果说是读cbSize的话, RtlMoveMemory 就已经读到了啊, 为什么还要用 LocalSize?
你要是这么写的话, 那传递进去的指针, 第一个成员必须是指针了, 不然LocalSize不是要返回0?

RtlMoveMemory (取指针_通用型 (a), 数据, 4)
返回 (LocalSize (a))

比如我要传递 PROCESSENTRY32 这个结构的指针进去
那 RtlMoveMemory (取指针_通用型 (a), 数据, 4) 执行这一句代码之后, a = cbSize, W版的话是586个字节
那 返回 (LocalSize (a)) 这个翻译过来不就是  返回 (LocalSize (586)), 这个不是会返回0?

没拿来跑, 只是心算了一下, 如果有说错的地方, 欢迎提出
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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