-
-
[原创]易语言程序分析笔记
-
发表于:
2022-9-22 17:52
22547
-
易语言静态编译由于是静态地址,所以已经有工具可以分析了;但是非静态的因为是动态加载库,分析起来还是有点小麻烦的。这个笔记是我之前分析一个易样本时总结的,可能有些地方也不对,凑合看吧。
要点
易语言程序依赖于自实现的库(.fnr)执行,针对易语言的编译模式有静态编译
、非静态编译
和独立编译
,如下图:
由于易语言是自写的框架,类似于MFC,因此如果未处理编译后的程序,程序中将存在一些固定的字符串。
静态编译是直接将库文件与程序合并。
该种编译模式会将库文件存放在程序中,在WinMain
入口会获取读取自身的内容,然后释放出库文件。
随后加载库文件,并调用一个固定函数GetNewSock
。
最后调用函数
进入该函数后,会看到call eax,eax为函数入口。
黑月编译器是网友针对易语言程序编写的一款编译器,他直接会优化掉前期的初始化代码,包括clr(c library runtime)
初始化,直接进入到易语言的标准入口。
易语言的函数大致分有三种,分别为窗体控件的消息函数、用户自定义函数、库函数和组件属性函数。
消息函数都是通过固定代码段调用,代码段定位流程如下:
找到如图特征
进入函数后找到最后一call 局部变量,该位置调用的就是消息函数
将函数对应到IDA中可直接定位到流程。
找到 case 2008
:
用户自定义的函数调用与通常的函数调用方式一致。
库函数为易语言自写支持库里的函数,类似Windows的DLL文件。函数原型如下。
该函数是一个变参函数,参数一为欲调用欲调用函数的参数个数,然后其余的以三个参数为一组表示参数的信息。忽略参数的值为布尔值,0表示不可以忽略,1表示可忽略;其参数类型可参考的值如下(可能不完整):
值
类型
0x80000004
文本型
0x80000101
文本型
0x80000000
通用型
0x80000002
逻辑型
0x80000005
字节集
0x80000006
子程序指针
0x80000301
数值型
0x80000601
数值型
0x10001
窗体
由于易语言的编译模式不同,库函数调用代码也会产生差异。接下来分别解释静态编译
与非静态编译
下,函数代码的差异。
非静态编译的程序,在调用库函数时不再通过静态地址的方式调用,而是通过传入库文件序号
和欲调用对应函数的偏移
到寄存器中,然后调用。
库文件序号指的是库文件是程序中加载的第几个文件。序号从0开始,易语言程序在运行初期最先加载的库文件为该库文件,记加载序号为0;如果再加载一个库文件的话则加载新加载的库文件序号为1。对于调用krnln.fnr库文件的函数,易语言程序以隐式形式传递序号,因此在信息框函数调用的反汇编代码中并未看到传入0序号。常用库文件的函数偏移在附录中贴出。
函数分为两种,一种是对组件的属性修改,另一种是组件的自带函数。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2022-9-22 17:54
被PlaneJun编辑
,原因: