精易论坛

标题: 大家别想希望易语言复活了!不可能的!! [打印本页]

作者: 呵呵仙    时间: 2025-6-11 20:16
标题: 大家别想希望易语言复活了!不可能的!!
大家别想希望易语言复活了!
1,要知道,易语言的代码是依靠32位的DLL(动态库文件)和32位的lib(静态库文件)提供出代码的!要想支持64位.得先把海量C语言源码!升级改为能生成64位的DLL和lib!
2,好了!有了64位的DLL和lib.易语言IDE就要改造.如:像火山PC一样.造出一个变整数出来!+等等复杂的解释判断!
3,可视化设计窗口也要改吧!不然W组件如何得来?
总结以上,想想都会尿急!!^_^


作者: 易团雪    时间: 2025-6-11 20:25


来吧. 整起来整起来整起来整起来整起来整起来把酷宝贝大佬的整起来
黑月界面类模块https://gitee.com/ftuan/BlackMoonUI
作者: shaohuacg    时间: 2025-6-11 20:42
懂这种无奈,易语言陪着咱写过代码、折腾过小软件,承载了很多回忆。看这复活的工作量和门槛,像 32 位转 64 位要改一堆底层,IDE 也得大动,真跟重建一套差不多。虽然盼着它能复活,但也明白这太难了。不过没关系,它在咱这代人手里发光发热过,留下的那些日夜和作品,就是最好的结局啦,把这份念想揣心里,也算和易语言好好告过别了~ 哦不对,我还在用易语言赚零花钱,感谢它丰富了我得业余生活,我却白嫖了它十几年,深感惭愧啊哈哈,只要还能运行,我应该不会放弃使用它的~~~
作者: webyezi    时间: 2025-6-11 20:50
会有大神出一套中文编程,易语言是开始并不是结束
作者: 你不丑    时间: 2025-6-11 21:08
别个几年前通过插件的 方式都已经实现了 易语言编译x64  用源码改难道比 逆向改还难  不至于易语言64位很快就会到来的 不信你看
作者: 〞剑舞长空    时间: 2025-6-11 21:12
就AI的分析来看,不要纠结X64
要纠结 那就直接上 AST转


这段 MicroLoader.cpp 代码是一个非常典型的 32位易语言程序加载器或运行环境的简化实现。它的核心功能是:



  1. 解析PE结构: 获取当前可执行文件(EXE)的PE头信息,遍历节表,找到易语言编译后嵌入的特定数据节(通常名为 .ecode)。

  2. 定位易语言数据:.ecode 节中,根据 APP_HEADER_INFO 结构找到常量段、窗体段、辅助函数段、代码段、变量段等的偏移。

  3. 加载支持库 (FNE/FNR):

    • 从易语言数据中读取需要加载的支持库列表(DLL名称和GUID)。

    • 使用 LoadLibrary 加载这些支持库。

    • 调用支持库导出的 GetNewSock(一个特殊的、可能与核心库初始化相关的函数)或 GetLibInfo 函数。

    • 通过 GetLibInfo 获取 LIB_INFO 结构,其中包含支持库的命令、数据类型等信息。

    • 向支持库注册一个回调函数 ThisNotifySys,以便支持库可以与加载器通信(例如请求内存分配、获取路径等)。


  4. 重定位: 遍历易语言数据段中的重定位信息,修正代码和数据中的地址引用,使其指向正确的内存位置(例如,将常量、全局变量、代码段内跳转的相对地址转换为绝对地址)。

  5. 初始化服务函数表: InitServerPointTableUpdataServerPointTable 将加载器内部实现的一系列服务函数(如内存分配、错误处理、基本位运算命令)的地址写入到易语言代码可以调用的一个表中(位于辅助函数段)。

  6. 执行易语言代码: 调用 ECodeStart,即易语言编译后代码的入口点,将控制权转交给易语言程序。

  7. 清理: 程序结束时,调用 Exit 函数,通知所有加载的支持库释放资源,并销毁加载器创建的堆。


将其转化为 X64 的可行性和挑战:


直接将这段 32 位 C++ 代码编译为 X64 并期望它能加载和运行原始的 32 位易语言编译产物是不可能的,原因如下:




  1. 指针大小和数据类型大小差异 (核心问题):



    • 所有指针: 在 32 位代码中,指针是 4 字节;在 X64 代码中,指针是 8 字节。这意味着所有依赖指针大小的结构体(如 PIMAGE_NT_HEADERS, PSECTION_HEADER, PAPP_HEADER_INFO, PRELOCATION_INF, PDLLCMD, PLIBINFO, PMDATA_INF, PFN_EXECUTE_CMD**)在 X64 环境下会有不同的内存布局。

    • UINT32 用于地址: 代码中大量使用 UINT32 来存储和计算地址(例如 ESectionVA, (* ptemp) = (* ptemp) + (UINT32)ECodeHeaderInfo + ...)。在 X64 环境中,地址是 64 位的,使用 UINT32 会导致地址截断,从而访问错误的内存位置。

    • 结构体偏移: 结构体中字段的偏移会因为指针大小的变化而改变。例如,APP_HEADER_INFO 中存储的各种 m_n...Offset 如果是基于 32 位布局计算的,在 X64 环境中直接使用会导致错误。

    • 函数指针: PFN_EXECUTE_CMD, ECODESTART, PFN_GET_LIB_INFO, PFN_NOTIFY_LIB, UNKNOWFUN 这些函数指针在 X64 下也是 8 字节。

    • ServerPointTable[zxsq-anti-bbcode-ESERVERCOUNT] 存储的是 UINT32 函数地址,在 X64 下应该是 UINT64uintptr_t




  2. 32位 vs 64位进程空间:



    • 一个 X64 进程不能直接加载和执行 32 位 DLL(即原始的 FNE/FNR 支持库)。

    • 易语言编译的 .ecode 节中的机器码是 32 位的 x86 指令,无法在 X64 CPU 的 64 位模式下直接执行。




  3. PE 文件格式的差异(虽然不大,但需注意):



    • IMAGE_NT_HEADERS 结构在 32 位 (IMAGE_NT_HEADERS32) 和 64 位 (IMAGE_NT_HEADERS64) 下的 OptionalHeader 部分是不同的。代码中直接使用 PIMAGE_NT_HEADERS,它通常被宏定义为特定位数版本。如果编译为 X64,它会是 PIMAGE_NT_HEADERS64,但它尝试解析的是一个 32 位 PE 文件的头(如果当前EXE是32位的易语言程序)。




  4. 调用约定:



    • 代码中使用了 __stdcall_cdecl。在 X64 Windows 上,主要的调用约定是 __fastcall 的变体(通常是默认的,前四个整数/指针参数在 RCX, RDX, R8, R9)。虽然编译器可能会做一些转换,但如果支持库的导出函数严格依赖于 32 位的 __stdcall,直接用 X64 的调用约定去调用(如果能加载的话)会有问题。




  5. 内联汇编 (__asm__declspec(naked)):



    • 所有 __asm 块和 __declspec(naked) 函数中的汇编指令都是 32 位的 x86 指令。这些在 X64 编译器下完全不兼容,无法编译。X64 有自己的一套指令集和寄存器。

    • 例如 mov ebp, esp, push eax, call dword ptr ds:[zxsq-anti-bbcode-ebx] 等都需要用 X64 等效指令替换。

    • __declspec(naked) 通常用于手动管理栈帧,在 X64 下栈帧布局和管理方式也不同。




要使类似 MicroLoader 的功能在 X64 环境下工作,并能运行(某种形式的)易语言程序,需要进行大规模的重构和重新设计,而不是简单的编译转换。可能有以下几种方向(难度递增):


方向 A:创建一个纯 X64 的易语言运行时和加载器(不兼容旧的32位编译产物)



方向 B:在 X64 加载器中模拟一个 32 位环境来运行旧的 32 位易语言代码(极其复杂,类似于 Wine 或 x86 模拟器)



方向 C:将易语言代码转译为 X64 C++ (类似你之前的项目思路)



针对 MicroLoader.cpp 代码的具体 X64 转换点(如果目标是方向 A 或 C 的辅助):



  1. 所有 UINT32 用于地址的地方改为 uintptr_tuint64_t

  2. 所有指针类型(如 PIMAGE_DOS_HEADER, PDLLCMD)在 X64 下自然会是 8 字节。

  3. 重新实现所有 __asm__declspec(naked) 函数:

    • ServerFunction_01(DLL命令调用):需要用 X64 调用约定和 API(如 GetProcAddress 返回的是 64 位地址)重写。直接 jmp UnKnowFun 的方式在 X64 下的参数传递和栈管理需要非常小心。

    • ServerFunction_02ServerFunction_03(支持库命令调用):参数传递(PMDATA_INF 结构在栈上的布局)和对 m_pCmdsFunc 的调用都需要适配 X64。它们内部的内联汇编用于准备参数栈并调用支持库函数,这需要完全用 X64 汇编或 C++ 调用重写。

    • ServerFunction_06, ServerFunction_07 (内存分配):虽然核心是调用 HeapAlloc/HeapReAlloc,但它们的 naked 和简单汇编需要用纯 C++ 或 X64 兼容方式重写。

    • ServerFunction_09 (退出程序):可以简化为纯 C++。


  4. ThisNotifySys

    • 返回值和参数类型需要检查。dwParam1, dwParam2 如果是地址或指针,应为 uintptr_t

    • 内部对 PMDATA_INF 的转换和访问需要注意该结构在 X64 下的布局。


  5. InitServerPointTableUpdataServerPointTable ServerPointTable 应为 uintptr_t 数组。

  6. PE 解析: NtHeader 应为 PIMAGE_NT_HEADERS64。遍历节表等逻辑基本不变,但所有地址计算都要用 64 位进行。

  7. 重定位逻辑 (UpdataRelocationInfoWinMain 中):

    • ptemp 应为 uintptr_t*uint64_t*

    • 所有地址相加 ((* ptemp) = (* ptemp) + (UINT32)ECodeHeaderInfo + ...) 都需要是 64 位运算。

    • 如果 .ecode 节中的重定位项本身存储的是 32 位偏移,那么在 X64 加载器中读取它们时没有问题,但在应用重定位(写入修正后的地址)时,写入的目标内存位置(*ptemp)应该能容纳 64 位地址。



总结:


MicroLoader.cpp 本身无法直接编译为 X64 来运行 32 位易语言程序。但是,它的代码揭示了易语言程序加载、运行和与支持库交互的许多底层机制。



JUMPOUT_ / sub_121D20 / sub_507E10 这些函数与 MicroLoader.cpp 的关系在于:MicroLoader.cpp 负责搭建一个能让易语言代码(包括那些混淆函数)运行起来的“架子”,提供它们可能依赖的底层服务和支持库接口。而那些混淆函数本身是易语言程序逻辑的一部分,运行在这个“架子”之上。



作者: static101    时间: 2025-6-11 21:58
确实,一直不搞64位,真没了
作者: 凌云啊    时间: 2025-6-11 22:06
根本就不是64位的原因
作者: Zixue    时间: 2025-6-11 22:17
没有想象中那么复杂 , 但是很明显吴涛根本没有心思花在易语言身上了
作者: opphk    时间: 2025-6-11 22:30
已经不指望复活易语言,现在直接指望重构了。
作者: ale99    时间: 2025-6-11 22:33
我来看看,学习一下!
作者: alinaini    时间: 2025-6-11 23:51
那以后还有易语言么?

作者: 万象梦境    时间: 2025-6-12 03:47
等64不如学炫彩、火山。甚至不如直接学C++
作者: 〞剑舞长空    时间: 2025-6-12 06:11
怎么这么喜欢审核审核的 闲的
作者: 1101469226    时间: 2025-6-12 06:25
那你还在易语言论坛干什么,赶紧注销账号吧
作者: う网淅乄    时间: 2025-6-12 08:18
alinaini 发表于 2025-6-11 23:51
那以后还有易语言么?

软件可以一直用 就不用想更新了
作者: 夜黑如歌    时间: 2025-6-12 08:23
不是说易语言的版权不在吴涛手上吗
之前精易想买来着,开价太高。。。
作者: ai12207745    时间: 2025-6-12 08:43
那你还在易语言论坛干什么,赶紧注销账号吧
作者: superhoo    时间: 2025-6-12 09:18
看看。。。。。。。。。。
作者: 风一样存在    时间: 2025-6-20 15:07
你应该说 易快点淘汰  旧的不去 新的就不会来  只有一个淘汰了 下一个才能接上




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4