云外归鸟工作室网站

标题: 黑月的使用说明 [打印本页]

作者: 云外归鸟    时间: 2010-10-7 17:48
标题: 黑月的使用说明
本帖最后由 云外归鸟 于 2010-10-7 17:48 编辑

一、黑月工具的安装和使用:
  为了方便使用,黑月工具是以易语言编辑器的插件形式使用,出现在易编辑器的工具菜单里,与易IDE融合。在易语言编译生成EXE和DLL文件之后,随即自动加工处理,重新编译转化成黑月程序,不用自己选择程序文件(这个自动处理功能,可以通过黑月设置关闭,变为手动选择处理)。
  1、下载黑月安装程序之后,双击运行按提示说明,黑月必须安装在易语言安装目录。比如:C:\Program Files\e (e目录下的BlackMoon为黑月主目录,以及LIB里的BlackMoon.fne为支持库插件)
  2、安装黑月工具之后,需要在易编辑器菜单->工具->支持库配置,勾选“黑月编译器插件”支持库,如图:

[attach]11[/attach]
如果没有什么意外,就会立即启动并运行黑月工具
[attach]12[/attach]
工具菜单出现“黑月工具”和“黑月资源编辑器”菜单选项。
[attach]13[/attach]
注意:如果勾选“黑月编译器插件”支持库时,易编辑器出错退出。这说明你的系统不支持黑月自动加工处理功能(部份原因是使用了破解版易语言)。


  遇到这种情况请自行编辑配置文件,比如:C:\Program Files\e\BlackMoon\BlackMoon.ini
修改配置内容:
[BlackMoon]
Run=0
  将禁止自动处理功能,这时再重新启动易编辑器,再次勾选“黑月编译器插件”支持库。但没有自动处理功能很不方便,而且如果要同时编译资源,RC脚本文件路径和名称也需要相应变化,这以后再详细了解。

  3、关闭自动处理功能和手动选择处理。易编辑器菜单->工具->黑月工具,将出现黑月的设置窗口,如图:
[attach]14[/attach]

  “启动黑月编译器”选择框决定是否在易语言生成程序之后,自动处理成黑月程序。如果关闭,将不自动加工处理成黑月程序,恢复易编辑器原来的状态和功能。如果上系统不支持自动处理的,勾选这个功能将导致易编辑器出错。
  关闭开启这个功能,在易编辑器的输出窗口都有提示:
[attach]15[/attach]

  4、使用和产生PE资源。易编辑器菜单->工具->黑月资源编辑器,将运行资源脚本编辑工具软件,如果当前源码已经保存到文件路径,并且没有与源码相配套的RC文件,将询问你是否创建同名的RC文件。
[attach]16[/attach]

  如果已经创建有了,就会直接打开与源码相关的RC文件,编译时会自动编译RC脚本为PE资源,源码中使用专用API访问PE标准资源。
黑月资源编辑器主要的功能菜单如图所示:

[attach]17[/attach]
  5、黑月程序编写的注意事项:
  (1)黑月兼容大部分的斩月程序,斩月源码若在黑月编译后上无法运行,请仔细排查。
  (2)黑月程序若使用链接静态库和使用__cdecl调用方式的DLL函数时,则不能调试运行(按F5),只能编译后才能运行(用信息框插入代替断点)。
  (3)请将易编辑器的“花指令插入级别”和“编译结果打乱码”关闭(设置为0),这两个功能影响黑月对易程序的分析。
  (4)如果使用4.13版本,请将版本信息功能关闭,菜单->程序->配置->(最底下选项)去掉选勾。使用黑月自己的资源脚本添加版本信息。否则会破坏生成的黑月程序,出现“不是有效的 Win32 应用程序。”的提示框。
  (5)黑月程序只能使用支持的核心库命令和API,不能使用易的窗口及组件和其它支持库,窗体界面用代码和资源对话框生成。
  (6)编写非控制台的黑月程序,可以在程序新建内先选择控制台程序(用_启动子程序),然后在“菜单->程序->配置”改成“Windows窗口程序”。

作者: 云外归鸟    时间: 2010-10-7 17:58
二、使用__cdecl调用方式的函数和链接静态库编译

(一)、__cdecl调用方式

  常用的调用方式有__stdcall__cdecl,易语言和大部分的API使用的是__stdcall,C语言默认使用的是__cdecl。所以实现__cdecl调用方式,可以调用更多的外部模块的函数。
  比如例程里的,API文本格式化函数wsprintf,微软C语言函数库msvcrt.dll,里面有比如:控制台格式化文本输出函数printf,字符串处理,文件操作,底层I/O操作等等函数,利用这些C语言的函数,可以方便直接的转译C语言的代码。
以及用C语言编写的函数为__cdecl调用方式的DLL,比如著名的轻量级数据库驱动sqlite3.dll。
实现这种调用方式,将大大扩展黑月的功能和应用范围。
1、黑月如何实现__cdecl调用
  所谓的调用方式,就是对参数入栈顺序和传递参数用的堆栈内存的平栈处理方式,参数用栈内存的大小就与参数数目和类型有关。我们要实现__cdecl就必须计算出参数栈内存大小值,然后加上平栈代码。本来这是编译器做的事,但易语言的编译器没有提供这个功能,所以我们要手动计算并填值。下面来学习参数栈内存大小的计算:
  这是例程里__cdecl方式的DLL子程序声明,DLL库命令名里有“wsprintfA@@12”字样,wsprintfA是函数原名称,两个@是黑月自己的约定,表示这个函数是__cdecl方式,黑月分析程序时就会认别出并做相应处理。@@后面的值就是参数栈内存大小值,与参数数目和类型有关。
  计算这个值很简单,首先来了解一下数据类型所占内存的大小。
[attach]18[/attach]
(1)4字节类型,因为是WIN32系统,大多数都是4字节32位数据的。
  字节型(BYTE)、字符型(char)、短整数型(short)、整数型(int)、小数型(float)等等
  以及所有的指针型,包括字符串指针(char*)、双精浮点小数型指针(double*)、长整数型指针(INT64*)等等。后面跟有*号的。
(2)8字节类型
  双精浮点小数型(double)、长整数型(INT64)以及日期时间型(DATE实际上是double型)。
  用这些数据类型大小乘于相应的参数数目,就是参数占用栈内存大小值。
  比如图例的,两个文本型(char*)和一个整数型(int)。三个参数都是4字节的,栈大小 = 3 × 4 = 12
  图中的@@12就是这么来的。
  如果再多出一个双精浮点小数型(double)参数的。计算式就是 3 × 4 + 8 = 20
将这个计算值以“函数名@@栈大小值”格式填写入DLL声明,在黑月处理后,就能实现__cdecl调用方式。
(3)计算该值错误会发生事情?
  这个不用担心,只是弹出以下错误提示,这个提示会帮助你直到填写正确的值并学会计算参数所用栈内存大小(注意:不要把易语言系统配置的“调用DLL命令后检查堆栈错误”关闭了)
[attach]19[/attach]
  用错调用方式也是这个提示,比如不是__cdecl的(比如__stdcall),而用__cdecl的,反之亦然。
(二)、使用静态库
  如果说上面实现__cdecl可以调用C语言标准函数库msvcrt的函数,这还需要从C语言源码转译到易源码。但实现编译时链接静态库,直接将C语言编译的静态库,拿来黑月所用。那就不用转译C语言的源码了,先把C语言源码在C的IDE里编译成静态库(LIB),黑月编译时再合成静态库功能代码,那就省了很多事情。而且C语言的内联汇编功能比易的置入代码()更专业更方便出错率又低。
  使用从网上下载别人编写好的静态库,或用C语言或汇编为黑月编写静态库(相当于易的模块),这又进一步提高了黑月的功能扩展。
注意:静态库必须是标准C语言或MASM32编译的,库文件为COFF格式的(OMF格式的需要转换成COFF),VC++编写的也可以,但不能带有用MFC类,接口函数名要用C语言风格修饰符(加 extern "C")。
1、静态库的__cdecl函数的调用
[attach]20[/attach]
  仍在DLL命令里声明函数,不同的是在DLL库文件名里不要填DLL文件名,全部都写上“静态库”三个字。黑月分析程序遇到时就会将这个函数做为静态库函数来链接编译。
  命令名仍用上方面讲到的名称加栈大小的格式。
2、静态库的__stdcall函数的调用
  也是在DLL文件名写上“静态库”三个字。不同DLL调用的是,静态库的__stdcall函数也要类似调用__cdecl方法,需要把参数栈大小写上(即使没有参数也要写上“@0”)。不同于__cdecl的是,黑月约定为一个“@”,注意__cdecl是“@@”,__stdcall是“@”,这是有区别的,也是为了区分种两种调用方式。如图:
[attach]21[/attach]
3、静态库文件名
  上面的DLL文件名已经填写“静态库”,那么怎么指示黑月编译器应该调用哪个静态库?
  这就需要自己来编写编译参数的配置文件,以“水波特效演示”为例,它的编译配置文件为“水波特效演示.ini”,必须与源码同目录同名的。(如果是手动处理的,就与欲处理的易程序EXE或DLL同名同目录)
  打开后可见内容为:

[Link]
Opt = WaveObjectLib.lib gdi32.lib

  Opt=后面跟着的就是要加入的编译参数,可以看到静态库名:WaveObjectLib.lib,而gdi32.lib是这个静态库用到的系统API导入库,如果静态库编写得不规范,没有在编写时注明引用到哪些静态库,就需要我们在这里也同时再加上。库名要用空格分隔开。
  黑月已经默认加入kernel32.lib、user32.lib和msvcrt.lib。其它的可看情况添加,不然会出现链接时失败提示,是一大串英文,中间提示有找不到库的函数名。

(三)、编译参数
  黑月的编译参数是保存与源码文件或目标程序同目录同名的INI文件里的,黑月处理编译时就读取这个文件并添加到链接器的参数里,这些参数可以指示链接器生成特定的程序。
  所以这个编译参数的配置文件,不只是用来写静态库名的,还可以写更专业的LINK选项,以“远程注入进程”为例。
  它的原理就是将自身克隆到IE浏览器进程的内存里,再用远程线程启动这个打入IE内部的“克隆体”的子程序,但通常EXE可执行文件的基址都是0x400000,如果直接复制过去,地址是一样的、重叠了,肯定会失败。
所以要产生可以嵌入其它进程空间的特别程序,这个程序的基址就不能为0x400000。
通过编译参数,我们就可产生这样的程序。看“下载器.ini”:
[Link]
Opt =/BASE:0x13140000 /INCREMENTAL:NO /OPT:NOWIN98 /SECTION:.text,EWR /IGNORE:4078 /FILEALIGN:0x200 /MERGE:.rdata=.text /MERGE:.data=.text
其中重要的参数(颜色对应):
1、就是将EXE的基址设为0x13140000,错开0x400000
2、节并节到.text段
这样生成的下载器程序就能顺利的植入IE进程空间,并且逃避防火墙的检查,因为所有网络下载或其它操作都是以IE浏览器的名义进行,是合法的。
(四)、黑月处理程序路径
  随着黑月程序的各种相关文件增多(资源脚本RC文件、编译参数INI文件和静态库LIB文件等等),有必要规范一下黑月程序的文件分布,最好同一个工程项目放在一个目录里,这样发布源码时连带所有文件一起打包。不能再像易源码那样,一个文件就包括全部,所有源码都放在同一个目录。
  并且黑月处理时要寻找相关文件是有特定规则的。与源码文件或目标程序同名同目录。
1、自动处理时(推荐)
  是以源码文件所在的目录为工程目录的,所用到的资源脚本RC文件、编译参数INI文件和静态库LIB都是从这个目录读取,并且RC文件和INI文件是必须与源码文件同名的。比如:
源码文件
黑月程序.e
那么相关工程文件就为
黑月程序.rc
黑月程序.ini
  特别是INI文件是自己编写和命名,文件名要与源码文件统一。
2、手动处理时(系统不支持自动处理时用到的)
  是以欲处理的易程序(EXE和DLL)的目录为工程目录,而不是以源码文件了,这点要注意,其它相关文件也要做相应改变。比如:
源码文件
C:\黑月程序.e
易编译后为
F:\BlackMoon.exe
那么相关工程文件就应变为
F:\BlackMoon.rc
F:\BlackMoon.ini
  与源码文件无关了,因为手动选择的程序不一定就是当前编辑器里的源码文件生成的。所以为了工程项目编写方便,你就要把易程序编译到源码同目录,并且与源码同名。像上面的,编译到C:\黑月程序.exe,其它相关文件名就不用改变了,全部名称都统一,这样交流源码就方便了。
  这就是手动处理不方便的地方。

作者: 云外归鸟    时间: 2010-10-7 18:00
本帖最后由 云外归鸟 于 2010-12-17 01:50 编辑

三、黑月的支持核心库命令列表


同时支持变体型和对象型。
流程控制
-----------------------
如果
如果真
判断
判断循环首
判断循环尾
循环判断首
循环判断尾
计次循环首
计次循环尾
变量循环首
变量循环尾
到循环尾
跳出循环
返回
结束


算术运算
-----------------------
相乘
相除
整除
求余数
相加
相减

取符号
取绝对值
取整
绝对取整
四舍五入
求次方
求平方根
求正弦
求余弦
求正切
求反正切
求自然对数
求反对数
置随机数种子
取随机数


逻辑比较
-----------------------
等于
不等于
小于
大于
小于或等于
大于或等于
近似等于
并且
或者
取反


位运算
-----------------------
位取反
位与
位或
位异或
左移
右移
合并整数
合并短整数


变量操作
-----------------------
赋值
连续赋值


数组操作
-----------------------
重定义数组
取数组成员数
取数组下标
复制数组
加入成员
插入成员
删除成员
清除数组
数组清零


环境存取
-----------------------
取命令行
取运行目录
取执行文件名
读环境变量
写环境变量


文本操作
-----------------------
取文本长度
取文本左边
取文本右边
取文本中间
字符
取代码
寻找文本
倒找文本
到大写
到小写
到全角
到半角
到文本
删首空
删尾空
删首尾空
删全部空
文本替换
子文本替换
取空白文本
取重复文本
文本比较
分割文本
指针到文本


字节集操作
-----------------------
取字节集长度
到字节集
取字节集数据
取字节集左边
取字节集右边
取字节集中间
寻找字节集
倒找字节集
字节集替换
子字节集替换
取空白字节集
取重复字节集
分割字节集
指针到字节集


数值转换
-----------------------
到数值
数值到大写
数值到金额
数值到格式文本
取十六进制文本
取八进制文本
到字节
到短整数
到整数
到长整数
到小数


时间操作
-----------------------
到时间
增减时间
取时间间隔
取某月天数
时间到文本
取时间部分
取年份
取月份
取日
取星期几
取小时
取分钟
取秒
指定时间
取现行时间
置现行时间
取日期
取时间


磁盘操作
-----------------------
取磁盘总空间
取磁盘剩余空间
取磁盘卷标
置磁盘卷标
改变驱动器
改变目录
取当前目录
创建目录
删除目录
复制文件
移动文件
删除文件
文件更名
文件是否存在
寻找文件
取文件时间
取文件尺寸
取文件属性
置文件属性
取临时文件名
读入文件
写到文件


文件读写
-----------------------
打开文件
打开内存文件
关闭文件
关闭所有文件
锁住文件
解锁文件
移动读写位置
移到文件首
移到文件尾
读入字节集
写出字节集
读入文本
写出文本
读入一行
写文本行
读入数据
写出数据
是否在文件尾
取读写位置
取文件长度
插入字节集
插入文本
插入文本行
删除数据


系统处理
-----------------------
运行
取剪辑板文本
置剪辑板文本
剪辑板中可有文本
清除剪辑板
取屏幕宽度
取屏幕高度
取鼠标水平位置
取鼠标垂直位置
取颜色数
信息框
鸣叫
取启动时间
置等待鼠标
恢复鼠标
延时
取文本注册项
取数值注册项
取字节集注册项
写注册项
删除注册项
注册项是否存在
取默认底色
快照
读配置项
写配置项
取配置节名
取操作系统类别
多文件对话框


媒体播放
-----------------------
播放音乐
停止播放
播放MID (1.1版增加支持)


其他
-----------------------
选择
多项选择
是否为空
取数据类型尺寸
取颜色值
处理事件
写到内存
置入代码


网络通信
-----------------------
取主机名
通信测试
转换为主机名
转换为IP地址


控制台操作
-----------------------
标准输出
标准输入


对于易语言5.0版静态库支持情况:
多线程支持库      
位图操作支持库        
网络通讯支持库

网络通讯支持库二         
XML解析支持库   
图像格式转换支持库  
Sqlite3数据库支持库  
MySQL支持库      
数据结构支持库         
数值计算支持库         
通用对象支持库         
文字编码转换支持库     
数据操作支持库一      
文字编码转换支持库     
XP风格支持库           
特殊功能支持库         
远程服务支持库         
控制台操作支持库      
端口访问支持库         
编码转换支持库         
保密通讯支持库         
正则表达式支持库         
互联网服务支持库         
操作系统界面功能支持库         
可执行文件数据转换支持库           
邮件接收支持库            
网络传送支持库  
互联网支持库
应用接口支持库

(以下支持库在黑月1.7.0已经支持编译)
BT下载支持库         
Java支持库      
进程通讯支持库         
局域网操作支持库      
OPenGL支持库        

现在暂不支持编译,有待解决的支持库:
DirectX3D支持库          (使用MFC类库,调用nafxcw.lib可以编译)


第三方支持库:
本人编写的支持库,黑月可以使用的:
ADODB数据驱动操作支持库
云外归鸟的线程池支持库
云外归鸟图像处理支持库 (伪静态库编译,发布时需要带上独立的支持库,已经发布,自己下载)
云外归鸟女声朗读支持库  (已经发布,自己下载)



作者: 囧囧有神经    时间: 2010-10-7 21:16
来顶咯
作者: 三强工作室    时间: 2010-10-7 21:43
板 凳~
作者: superren    时间: 2010-10-7 22:29
首页支持
作者: 888888    时间: 2010-10-8 18:58
首页支持
作者: qujinlin    时间: 2010-10-8 20:31
首页顶一个
作者: 传-奇    时间: 2010-10-10 21:36
首页顶大鸟
作者: lukeigun    时间: 2010-10-11 23:37
首页支持

作者: 笑浪    时间: 2010-10-19 09:40
有没有详细的视频教程呢?
作者: hzblznzysh    时间: 2010-10-19 23:42
先顶 在慢慢看
作者: zas    时间: 2010-10-21 12:17
好的很!
作者: erui    时间: 2010-10-21 17:36
太棒了,谢谢楼主!
作者: 易能者    时间: 2010-10-23 17:48
上帝啊,你很厉害,我也想变的那么厉害~  呵呵~
作者: 小熊宝宝    时间: 2010-11-14 12:29
总算是到家了 不容易啊
作者: 小熊宝宝    时间: 2010-11-16 12:05
还不是太会用 不过支持
作者: sex    时间: 2010-11-29 08:53

作者: seshomaru    时间: 2010-12-6 10:24
谢谢楼主分享,收藏备用了!
作者: seshomaru    时间: 2010-12-6 10:25
老大,你写的第三方支持库在哪有下载的啊。。
作者: woyaodwn    时间: 2010-12-9 13:15
有没有更详细的说明啊

作者: qmcg    时间: 2010-12-23 15:20
顶大鸟,支持个
作者: dyzjzb    时间: 2010-12-28 23:05
大鸟好人!对易语言付出太多了。作为一个易语言爱好者,感谢您!!!
作者: lukeigun    时间: 2011-1-12 16:50
顶一个!
作者: 南极    时间: 2011-1-26 17:53
真的很强悍,在调用资源方面能和主流编译软件调用资源方法相接轨了。
作者: anjili    时间: 2011-1-28 17:55
顶一个
作者: lhd888888    时间: 2011-2-7 19:37
来顶咯

作者: hmy100    时间: 2011-2-27 14:56
必须要顶作者
作者: zhou2x    时间: 2011-2-28 20:32
支持,学习!!!
作者: 61607ye    时间: 2011-3-8 15:29
顶力支持下
作者: 61607ye    时间: 2011-3-15 23:23
学习了,说不定以后会用上的
作者: 鱼叼猫    时间: 2011-4-2 22:11
强烈支持
作者: cbqandlws    时间: 2011-5-7 00:29
非常感谢,下载了
作者: cbqandlws    时间: 2011-5-11 09:03
看看还不错啊
作者: likoo    时间: 2011-6-12 11:00
太感谢了,支持
作者: laoshu52014    时间: 2012-10-18 12:59
支持支持!!绝对支持
作者: 忧郁之子    时间: 2012-10-25 22:16
支持了
作者: 我爱创新    时间: 2013-7-4 17:59
有木有视频语音教程啊,看不懂啊。
作者: yuan71058    时间: 2013-8-2 08:12
太支持了


作者: ximengxuan    时间: 2013-9-12 01:13
本帖最后由 ximengxuan 于 2013-9-12 01:15 编辑

我想请教下,黑月插件如何编译exe文件哪?下面一段,怎么看就是看不懂、

update.exe 是易语言编写 黑月插件编译

如果你要修改或者调试源码  请安装并开启黑月编译插件

把update.exe和你的原程序放一起并正确传递命令行参数即可实现自动下载自动更新

正确的格式是[update.exe 下载地址|升级公告|原程序进程名|是否网盘地址|下载类型]

以下解释一下相关参数
1.下载地址 该地址可以是两种地址 一种是直接的exe下载地址  另一种则是百度网盘地址
           注意:百度网盘的该地址中必须是共享单独一个文件。

2.升级公告 显示在编辑框中的内容

3.原程序进程名  旧程序的进程名 必须全名 如 "123.exe"

4.是否网盘地址  如果是直接的EXE下载地址 则写0 百度网盘则写1

5.下载类型   如果写1则启动更新程序 则自动开始下载  如果写0则需要手动点击更新按钮

作者: liriyu    时间: 2014-8-22 07:37
黑月编译插件可以静态编译吗?有谁回答?




欢迎光临 云外归鸟工作室网站 (http://www.ywgn.net/) Powered by Discuz! X3