想写个简单外挂,WPF,QT感觉开发太慢了,想起了以前学过的易语言,东西不记下来很容易就会忘记。
易语言的编译速度十分的快,构造组件也非常容易,功能蛮强大的, 编译的软件非常小。
基础
易语言按空格出现提示或者确认
按Ctrl + L创造局部变量, 全局变量在全局变量表里面
易语言的数组下标是从1开始的
程序集变量
在易语里面可以创建多个窗口, 程序集变量仅在那个窗口生效
在5.9加密狗版本有11种数据类型
字节型。可容纳 0 到 255 之间的数值。
整数型。可容纳 -2,147,483,648 到 2,147,483,647 之间的数值,长度为 4 个字节。
小数型。可容纳 3.4E +/- 38 (7位小数) 之间的数值,尺寸为 4 个字节。
逻辑型。值只可能为“真”或“假”,尺寸为 4 个字节。“真”和“假”为系统预定义常量,其对应的英文常量名称为“true”和“false”。
字节集。用作记录一段字节型数据。
文本型。用作记录一段文本,文本由以字节 0 结束的一系列字符组成。
短整数型。可容纳 -32,768 到 32,767 之间的数值,长度为 2 个字节。
长整数型。可容纳 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 之间的数值,长度为 8 个字节。
日期时间型。用作记录日期及时间,尺寸为 8 个字节。
子程序指针。用作指向一个子程序,尺寸为 4 个字节。
双精度小数型。可容纳 1.7E +/- 308 (15位小数) 之间的数值,尺寸为 8 个字节。
数据转换
打开数值转换,易语言的文档格式是这样的
返回值 <函数名称> 参数1,参数2,...
最常用的
到文本 将数据换成字符串
到字节 将数据转换成字节
到整数 将数据成整数
最常用的操作字符串
取文本长度 〈整数型〉 取文本长度 (文本型 文本数据)
取文本中间 〈文本型〉 取文本中间 (文本型 欲取其部分的文本,整数型 起始取出位置,整数型 欲取出字符的数目)
到大写 〈文本型〉 到大写 (文本型 欲变换的文本)
到小写 〈文本型〉 到小写 (文本型 欲变换的文本)
寻找文本〈整数型〉 寻找文本 (文本型 被搜寻的文本,文本型 欲寻找的文本,[整数型 起始搜寻位置],逻辑型是否不区分大小写)
找到返回0,没找到返回-1
文本替换 〈文本型〉 文本替换 (文本型 欲被替换的文本,整数型起始替换位置,整数型替换长度,[文本型 用作替换的文本])
子文本替换 〈文本型〉 子文本替换 (文本型 欲被替换的文本,文本型 欲被替换的子文本,[文本型 用作替换的子文本],[整数型 进行替换的起始位置],[整数型 替换进行的次数],逻辑型 是否区分大小写)
这个函数我感觉用的有点糊涂,这替换起始位置貌似无效
字节集数组
数据最原始的存储方式。在易语言里面叫字节集,相当于于其它语言的byte[]数组。
函数
写一个函数名称换行,易语言就会提示创建一个子程序集。在返回值类型里面填写返回值
return 使用 返回 代替
取整和四舍五入
取整 〈日期时间型〉 到时间 (通用型 欲转换的文本)
四舍五入 (双精度小数型〉 四舍五入 (双精度小数型 欲被四舍五入的数值,[整数型 被舍入的位置])
四舍五入可以用来保留指定小数位
判断与循环
如果 = if
如果真 = if(1)
判断 = switch(易语言里面貌似没有case
判断循环首 = while (必须配合判断循环尾使用,类似结束大括号)
计次循环首 = for(i–), 第二个参数就是次数
变量循环首 = 几次循环首的升级版,可以设参数i的i的开始值和结束值
到循环尾 = break
跳出循环 = continue
随机数
取随机数(1,100)取范围1-100的随机数
在取随机数之前,要调用置随机数种子,否则第二次调用随机数,随机数将不会改变
数组
定义1: 变量名 = {参数1,参数2,…}
定义2: 在数组里面写好大小,然后a[下标] = 参数1
重定义数组
它的功能是提供动态调整数组的方式。
加入和删除会自动扩容。
dll与ec和fne
dll的建立
易语言在创建程序的时候选择windows动态链接库, 编写函数。
1.写好的函数选择公开,按Ctrl+3进行导出为dll文件。
2.易语言新建window窗口程序,在程序里面引入新的dll文件,指定dll名词和函数名称即可调用
ec的建立
选择windows易语言模块,在程序>配置里面,补全程序说明信息
fne的导入
把支持库文件复制到\安装目录\lib\的下面,然后工具>支持库配置勾选就可以了
DLL是一个包含可由多个程序,同时使用的代码和数据的库。
易语言使用dll需要先声明,添加新dll命令
ec是易语言的模块,相当于dll的升级版,引入一个新函数的时候不需要像dll那样麻烦声明
引用只需要在程序模块表里面导入所需的模块
fne是易语言的库支持,一次引入永久使用
内存修改
修改windows内存需要了解两个概念。
PID
pid是大多数操作系统的内核用于唯一标识进程的一个数值。(简言之,就是进程的绰号。)
这一数值可以作为许多函数调用的参数,以使调整进程优先级、
kill(命令)进程之类的进程控制行为成为可能。
句柄(Handle)
句柄是一个序号, 它不是一个内存地址,用于操作系统查询内核对象的地址,PID是进程号,
是操作系统分配给进程的ID号。句柄用于管理Windows内核对象,比如用户打开一个文件,
Windows即会建立一个文件内核对象,所谓内核对象就是一块内存结构,
里面有文件路径,文件大小,当前文件指针等等信息。
Windows通过建立一个叫做句柄表的东西,用于记录内核对象的地址。
表中每一个元素,都是一个内核对象的起始地址,
然后给每一个对象对应一个序号,此序号即为句柄。
通常有了pid才能得到句柄,有了句柄才能修改内存
基地址和偏移
基地址相当于始祖地址,每次程序打开,它的位置都是固定的。
偏移:两个地址的距离
计算植物大战僵尸阳光的偏移
已知基址:mov ecx, [0755E0C]
偏移1: mov eax,[ecx+00000868]
偏移2: add [eax+00005578],ecx
阳光 = [0755E0C] + [868] + [5578]
window的dll文件提供了根据地址获取内存值的函数
WriteProcessMemory
ReadProcessMemory
错误的算阳光的算法
直接累加地址, 0755E0C + 868 + 5578 ,然后使用ReadProcessMemory一次读取,这是错误的
正确的计算方法
先使用ReadProcessMemory读出 0755E0C的值
再使用0755E0C的值加上868,再读取
再使用上一次的值加上+5578, 读取到阳光的地址
一共要读三次
召唤僵尸
这个是参考https://blog.csdn.net/qq_33958297/article/details/82816985这篇文章
使用易语言执行指定的汇编代码需要用到超级模块。
当我疑问汇编代码如何调用呢?超级模块提供了参考方案,在汇编类里面有个调用函数的源码
windows提供了
VirtualAllocEx(根据指定进程的id在它的进程里面申请内存)
CreateRemoteThread(根据指定进程的id,在它的进程里面申请一个线程)
有了这两个函数就可以在指定进程里面执行代码,太牛掰了。这可能就类似dll注入。
植物大战僵尸外挂
僵尸博士在怎么call好像也只能召唤一个,召唤一次血量好像会重置。