易语言程序脱离支持库的利器——黑月编译器插件
一、黑月用途:黑月是类似于斩月,目的是将易语言程序小型化,脱离支持库运行的工具。但实现原理和方法又与斩月不同,不需要类似的斩月壳,而是分析并转化易程序为对象文件obj,再用链接器LINK.EXE重新编译链接。这样生成的黑月程序,具有更规范更优化的PE程序文件结构,并且带来更多的功能扩展(比如使用RC资源脚本生成PE标准资源),以及带来下好处:
1、具有正常的PE可执行文件结构,经过反编译后生成的易程序代码清晰可见,完全呈现。汇编代码可分析可用专用软件跟踪调试,不会再产生误报。
2、在脱离核心支持库的同时,又不废除原有核心库命令,而是转向调用功能类似的黑月核心库。就是说,黑月可以使用大部分的原核心库命令(非窗口操作),并且黑月核心库为本人模仿原核心库功能,再重新编写的静态库。由于黑月先天优势,可以静态库抽取代码片段合成编译,就是用到的命令函数才提取相应部分代码。不用到命令不合成到目标程序。这样的好处是既保持原有功能不变,又不使程序文件大小增加,附带冗余代码。
易友们一直梦想的静态库抽取合成编译,今天在黑月已经实现了!
4、黑月可以使用PE标准资源,用RC脚本编译生成。比如使用资源对话框模板创建窗口,并配合可视化的黑月RC脚本编辑器,比斩月又多一种更方便的界面设计功能,而且与汇编和C语言的RC脚本兼容通用,使黑月程序更接近于常规程序。
5、黑月的DLL可以使用类似其它语言DLLMAIN入口函数(黑月为“Dll入口函数”),可以通过DLL的模块句柄访问DLL的PE资源、注入进程、多线程应用等等优点。
6、黑月可以突破易语言自身的限制,实现对__cdecl调用方式函数的支持,并且可以在编译时链接其它由C语言或MASM32汇编语言编写的静态库,这又大大的增强了功能扩展,对众多C语言代码资源的利用,和软件工程的协作开发创造了便利条件。
二、黑月工具的安装和使用:
为了方便使用,黑月工具是以易语言编辑器的插件形式使用,出现在易编辑器的工具菜单里,与易IDE融合。在易语言编译生成EXE和DLL文件之后,随即自动加工处理,重新编译转化成黑月程序,不用自己选择程序文件(这个自动处理功能,可以通过黑月设置关闭,变为手动选择处理)。
1、下载黑月安装程序之后,双击运行按提示说明,黑月必须安装在易语言安装目录。比如:C:\Program Files\e (e目录下的BlackMoon为黑月主目录,以及LIB里的BlackMoon.fne为支持库插件)
2、安装黑月工具之后,需要在易编辑器菜单->工具->支持库配置,勾选“黑月编译器插件”支持库,如图:
http://www.basic8.com.cn/upload/200908081856334417.jpg
如果没有什么意外,就会立即启动并运行黑月工具
http://www.basic8.com.cn/upload/200908081857098643.jpg
工具菜单出现“黑月工具”和“黑月资源编辑器”菜单选项。
http://www.basic8.com.cn/upload/200908081857310133.jpg
注意:如果勾选“黑月编译器插件”支持库时,易编辑器出错退出。这说明你的系统不支持黑月自动加工处理功能(部份原因是使用了破解版易语言)。
遇到这种情况请自行编辑配置文件,比如:C:\Program Files\e\BlackMoon\BlackMoon.ini
修改配置内容:
Run=0
将禁止自动处理功能,这时再重新启动易编辑器,再次勾选“黑月编译器插件”支持库。但没有自动处理功能很不方便,而且如果要同时编译资源,RC脚本文件路径和名称也需要相应变化,这以后再详细了解。
3、关闭自动处理功能和手动选择处理。易编辑器菜单->工具->黑月工具,将出现黑月的设置窗口,如图:
http://www.basic8.com.cn/upload/200908082234154337.jpg
“启动黑月编译器”选择框决定是否在易语言生成程序之后,自动处理成黑月程序。如果关闭,将不自动加工处理成黑月程序,恢复易编辑器原来的状态和功能。如果上系统不支持自动处理的,勾选这个功能将导致易编辑器出错。
关闭开启这个功能,在易编辑器的输出窗口都有提示:
http://www.basic8.com.cn/upload/200908081859208138.jpg
4、使用和产生PE资源。易编辑器菜单->工具->黑月资源编辑器,将运行资源脚本编辑工具软件,如果当前源码已经保存到文件路径,并且没有与源码相配套的RC文件,将询问你是否创建同名的RC文件。
http://www.basic8.com.cn/upload/200908081859378230.jpg
如果已经创建有了,就会直接打开与源码相关的RC文件,编译时会自动编译RC脚本为PE资源,源码中使用专用API访问PE标准资源。
黑月资源编辑器主要的功能菜单如图所示:
http://www.basic8.com.cn/upload/200908081900043604.jpg
5、黑月程序编写的注意事项:
(1)黑月兼容大部分的斩月程序,斩月源码若在黑月编译后上无法运行,请仔细排查。
(2)黑月程序若使用链接静态库和使用__cdecl调用方式的DLL函数时,则不能调试运行(按F5),只能编译后才能运行(用信息框插入代替断点)。
(3)请将易编辑器的“花指令插入级别”和“编译结果打乱码”关闭(设置为0),这两个功能影响黑月对易程序的分析。
(4)如果使用4.13版本,请将版本信息功能关闭,菜单->程序->配置->(最底下选项)去掉选勾。使用黑月自己的资源脚本添加版本信息。否则会破坏生成的黑月程序,出现“不是有效的 Win32 应用程序。”的提示框。
(5)黑月程序只能使用支持的核心库命令和API,不能使用易的窗口及组件和其它支持库,窗体界面用代码和资源对话框生成。
(6)编写非控制台的黑月程序,可以在程序新建内先选择控制台程序(用_启动子程序),然后在“菜单->程序->配置”改成“Windows窗口程序”。
三、使用__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方式,黑月分析程序时就会认别出并做相应处理。@@后面的值就是参数栈内存大小值,与参数数目和类型有关。
计算这个值很简单,首先来了解一下数据类型所占内存的大小。
http://www.basic8.com.cn/upload/200908081919488227.jpg
(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命令后检查堆栈错误”关闭了)
http://www.basic8.com.cn/upload/200908081920237122.jpg
用错调用方式也是这个提示,比如不是__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函数的调用
http://www.basic8.com.cn/upload/200908081920444778.jpg
仍在DLL命令里声明函数,不同的是在DLL库文件名里不要填DLL文件名,全部都写上“静态库”三个字。黑月分析程序遇到时就会将这个函数做为静态库函数来链接编译。
命令名仍用上方面讲到的名称加栈大小的格式。
2、静态库的__stdcall函数的调用
也是在DLL文件名写上“静态库”三个字。不同DLL调用的是,静态库的__stdcall函数也要类似调用__cdecl方法,需要把参数栈大小写上(即使没有参数也要写上“@0”)。不同于__cdecl的是,黑月约定为一个“@”,注意__cdecl是“@@”,__stdcall是“@”,这是有区别的,也是为了区分种两种调用方式。如图:
http://www.basic8.com.cn/upload/200908081921020385.jpg
3、静态库文件名
上面的DLL文件名已经填写“静态库”,那么怎么指示黑月编译器应该调用哪个静态库?
这就需要自己来编写编译参数的配置文件,以“水波特效演示”为例,它的编译配置文件为“水波特效演示.ini”,必须与源码同目录同名的。(如果是手动处理的,就与欲处理的易程序EXE或DLL同名同目录)
打开后可见内容为:
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”:
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,其它相关文件名就不用改变了,全部名称都统一,这样交流源码就方便了。
这就是手动处理不方便的地方。
下载地址:
云下载
千脑下载
华为下载
119G下载 看看吧 这个黑月是编译器还是什么 有下载地址吗?? 这个东西貌似很强大啊! 死死死死死死死死死死死死死死死死死死死死死死死死 sdfasdfsfd 不错不错 顶 好东西,多谢分享{:2_27:}
页:
[1]