开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 587|回复: 16
收起左侧

[其它源码] 次元门已经开启,易语言无缝转换为其他语言

[复制链接]
结帖率:100% (1/1)
发表于 2024-5-12 14:00:29 | 显示全部楼层 |阅读模式   江苏省南通市
分享源码
界面截图: -
是否带模块: -
备注说明: -
机器   汇编->C->高级语言->提示词->母语->图形化可视化   人

人机交互的鸿沟已经逐渐被抹平,语言障碍再也不会成为编程的障碍了。

希望易友有什么好东西分享给大家,毕竟易语言这个小圈子是易友的后院,是其他人进不来的。
我们来看一个热门源码:
R3保护自己的代码段不被修改,直接废掉WriteMemory
https://bbs.125.la/thread-14748601-1-2.html

代码如下:
  
子程序名返回值类型公开备 注
AddNoChange_File 添加NoChange标识
参数名类 型参考可空数组备 注
BaseAddress整数型限于IMAGE映射处理
变量名类 型静态数组备 注
l_Offset整数型 
l_SectionMEMORY_BASIC_INFORMATION0需要处理的节
l_ImageSize长整数型映像大小
l_SectionHandle整数型节句柄
l_pViewBase整数型映射到的新基址
l_ViewSize整数型映射大小
l_SectionOffset长整数型节偏移
l_Status整数型 
MEMORY_BASIC_INFORMATIONMEMORY_BASIC_INFORMATION 
i整数型 
l_Offset = 0
循环判断首 ()  ' 将节内存信息全部枚举出来
NtQueryVirtualMemory (-1, BaseAddress + l_Offset, 0, MEMORY_BASIC_INFORMATION, 28, 0)
如果真 (MEMORY_BASIC_INFORMATION.lType ≠ #TYPE_MEM_IMAGE )  ' 只要IMAGE部分
跳出循环 ()
加入成员 (l_Section, MEMORY_BASIC_INFORMATION)
l_Offset = l_Offset + MEMORY_BASIC_INFORMATION.RegionSize
循环判断尾 (MEMORY_BASIC_INFORMATION.lType = #TYPE_MEM_IMAGE )
l_ImageSize = l_Offset
l_SectionHandle = 0
l_Status = NtCreateSection (l_SectionHandle, 位或 ( #SECTION_QUERY, #SECTION_MAP_WRITE, #SECTION_MAP_READ, #SECTION_MAP_EXECUTE, #SECTION_EXTEND_SIZE, #SECTION_MAP_EXECUTE_EXPLICIT ), 0, l_ImageSize, #PAGE_EXECUTE_READWRITE, #SEC_COMMIT, 0)  ' 根据原SECTION大小创建一块相同大小的SECTION
如果真 (l_Status ≠ 0)
输出调试文本 (“NtCreateSection创建节对象失败!”)
返回 ()
l_Status = NtMapViewOfSection (l_SectionHandle, -1, l_pViewBase, 0, 0, 0, l_ViewSize, 1, 0, #PAGE_EXECUTE_READWRITE )  ' 将其映射到内存
如果真 (l_Status ≠ 0)
NtClose (l_SectionHandle)
输出调试文本 (“NtMapViewOfSection映射节对象失败!”)
返回 ()
RtlMoveMemory (l_pViewBase, BaseAddress, l_Offset)  ' 将需要原数据拷贝到新区段
l_Status = NtUnmapViewOfSection (-1, l_pViewBase)  ' 解除新区段的映射
如果真 (l_Status ≠ 0)
NtClose (l_SectionHandle)
输出调试文本 (“NtUnmapViewOfSection解除当前失败!”)
返回 ()
l_Status = NtUnmapViewOfSection (-1, BaseAddress)  ' 解除原IMAGE的映射
如果真 (l_Status ≠ 0)
NtClose (l_SectionHandle)
输出调试文本 (“NtUnmapViewOfSection解除原映射失败!”)
返回 ()
l_pViewBase = l_Section [1].BaseAddress  ' 计算新的pViewBase
计次循环首 (取数组成员数 (l_Section), i)
如果真 (l_Section [i].Protect = #PAGE_READWRITE l_Section [i].Protect = #PAGE_WRITECOPY l_Section [i].Protect = #PAGE_EXECUTE_READWRITE l_Section [i].Protect = #PAGE_EXECUTE_WRITECOPY )
l_ViewSize = l_Section [i].BaseAddress - l_Section [1].BaseAddress
跳出循环 ()

计次循环尾 ()
l_ViewSize = 65536 × 到整数 (l_ViewSize ÷ 65536)  ' NtMapViewOfSection强制要求64KB对其,所以可能会有部分的READONLY区段获得EXECUTE_READWRITE的保护,但是问题不大,大部分代码仍然是PAGE_EXECUTE保护,且具有SEC_NO_CHANGE属性
如果真 (l_ViewSize ≠ 0)
l_Status = NtMapViewOfSection (l_SectionHandle, -1, l_pViewBase, 0, 0, 0, l_ViewSize, 1, #SEC_NO_CHANGE, #PAGE_EXECUTE )
l_Status = NtMapViewOfSection (l_SectionHandle, -1, l_pViewBase + l_ViewSize, 0, 0, l_ViewSize, l_ImageSize - l_ViewSize, 1, #SEC_NO_CHANGE, #PAGE_EXECUTE_READWRITE )
NtClose (l_SectionHandle)



现在使用大模型转换成C语言,并且要求变量名和函数名使用中文,以及添加注释:

  
// 添加NoChange标识的子程序
void 添加NoChange标识 (PVOID 基址) {
ULONG 偏移 = 0;
MEMORY_BASIC_INFORMATION 内存基本信息;
LARGE_INTEGER 映像大小;
HANDLE 节句柄 = NULL;
PVOID 新基址 = NULL;
SIZE_T 新映射大小;
LARGE_INTEGER 节偏移;
NTSTATUS 状态;
int i;
// 将节内存信息全部枚举出来
while (TRUE) {
状态 = NtQueryVirtualMemory (NtCurrentProcess (), 基址 + 偏移, MemoryBasicInformation, &内存基本信息, sizeof (MEMORY_BASIC_INFORMATION), NULL);
if (内存基本信息.Type != MEM_IMAGE) { // 只要IMAGE部分
break;
}
偏移 += 内存基本信息.RegionSize;
}
映像大小.QuadPart = 偏移;
// 根据原SECTION大小创建一块相同大小的SECTION
状态 = NtCreateSection (&节句柄, SECTION_ALL_ACCESS, NULL, &映像大小, PAGE_EXECUTE_READWRITE, SEC_COMMIT, NULL);
if (状态 != 0) {
DbgPrint ("NtCreateSection创建节对象失败!");
return;
}
// 将其映射到内存
状态 = NtMapViewOfSection (节句柄, NtCurrentProcess (), &新基址, 0, 0, NULL, &新映射大小, ViewShare, 0, PAGE_EXECUTE_READWRITE);
if (状态 != 0) {
NtClose (节句柄);
DbgPrint ("NtMapViewOfSection映射节对象失败!");
return;
}
// 将需要原数据拷贝到新区段
RtlCopyMemory (新基址, 基址, 偏移);
// 解除新区段的映射
状态 = NtUnmapViewOfSection (NtCurrentProcess (), 新基址);
if (状态 != 0) {
NtClose (节句柄);
DbgPrint ("NtUnmapViewOfSection解除当前失败!");
return;
}
// 解除原IMAGE的映射
状态 = NtUnmapViewOfSection (NtCurrentProcess (), 基址);
if (状态 != 0) {
NtClose (节句柄);
DbgPrint ("NtUnmapViewOfSection解除原映射失败!");
return;
}
// 计算新的新基址
新基址 = 内存基本信息.BaseAddress;
// 计算新映射大小并进行64KB对齐
for (i = 0; i < 内存基本信息.RegionCount; i++) {
if (内存基本信息.RegionEntry[i].Protect == PAGE_READWRITE ||
内存基本信息.RegionEntry[i].Protect == PAGE_WRITECOPY ||
内存基本信息.RegionEntry[i].Protect == PAGE_EXECUTE_READWRITE ||
内存基本信息.RegionEntry[i].Protect == PAGE_EXECUTE_WRITECOPY) {
新映射大小 = 内存基本信息.RegionEntry[i].BaseAddress - 内存基本信息.BaseAddress;
break;
}
}
新映射大小 = (新映射大小 + 0xFFFF) & ~0xFFFF; // 64KB对齐
// 分两步映射新区域
if (新映射大小 != 0) {
状态 = NtMapViewOfSection (节句柄, NtCurrentProcess (), 新基址, 0, 0, NULL, 新映射大小, ViewShare, SEC_NO_CHANGE, PAGE_EXECUTE);
}
状态 = NtMapViewOfSection (节句柄, NtCurrentProcess (), 新基址 + 新映射大小, 0, 0, (PSIZE_T)新映射大小, 映像大小.QuadPart - 新映射大小, ViewShare, SEC_NO_CHANGE, PAGE_EXECUTE_READWRITE);
NtClose (节句柄);
}


再试一下转换成C++

  
// .版本 2
// .子程序 AddNoChange_File, , 公开, 添加NoChange标识
void 添加NoChange标识 (PVOID 基址) {
// .参数 BaseAddress, 整数型, , 限于IMAGE映射处理

// .局部变量 l_Offset, 整数型
ULONG 偏移 = 0;
// .局部变量 l_Section, MEMORY_BASIC_INFORMATION, , "0", 需要处理的节
MEMORY_BASIC_INFORMATION 内存基本信息[1024]; // 假设最多有1024个内存区域
// .局部变量 l_ImageSize, 长整数型, , , 映像大小
SIZE_T 映像大小;
// .局部变量 l_SectionHandle, 整数型, , , 节句柄
HANDLE 节句柄 = NULL;
// .局部变量 l_pViewBase, 整数型, , , 映射到的新基址
PVOID 新基址 = NULL;
// .局部变量 l_ViewSize, 整数型, , , 映射大小
SIZE_T 映射大小;
// .局部变量 l_SectionOffset, 长整数型, , , 节偏移
ULONG_PTR 节偏移;
// .局部变量 l_Status, 整数型
NTSTATUS 状态;
// .局部变量 MEMORY_BASIC_INFORMATION, MEMORY_BASIC_INFORMATION
// .局部变量 i, 整数型
ULONG i;
// l_Offset = 0
// .循环判断首 ()  ' 将节内存信息全部枚举出来
for (偏移 = 0; ; 偏移 += 内存基本信息[0].RegionSize) {
// NtQueryVirtualMemory (-1, BaseAddress + l_Offset, 0, MEMORY_BASIC_INFORMATION, 28, 0)
状态 = NtQueryVirtualMemory (GetCurrentProcess (), 基址 + 偏移, MemoryBasicInformation, 内存基本信息, sizeof (MEMORY_BASIC_INFORMATION), NULL);
if (!NT_SUCCESS (状态)) {
// 输出调试文本 ("NtQueryVirtualMemory查询内存信息失败!")
break;
}

// .如果真 (MEMORY_BASIC_INFORMATION.lType ≠ #TYPE_MEM_IMAGE )  ' 只要IMAGE部分
if (内存基本信息[0].Type != MEM_IMAGE) {
// 跳出循环 ()
break;
}
// .如果真结束
}
// .循环判断尾 (MEMORY_BASIC_INFORMATION.lType = #TYPE_MEM_IMAGE )
映像大小 = 偏移;
// l_SectionHandle = 0
// l_Status = NtCreateSection (l_SectionHandle, 位或 ( #SECTION_QUERY, #SECTION_MAP_WRITE, #SECTION_MAP_READ, #SECTION_MAP_EXECUTE, #SECTION_EXTEND_SIZE, #SECTION_MAP_EXECUTE_EXPLICIT ), 0, l_ImageSize, #PAGE_EXECUTE_READWRITE, #SEC_COMMIT, 0)  ' 根据原SECTION大小创建一块相同大小的SECTION
状态 = NtCreateSection (&节句柄, SECTION_ALL_ACCESS, NULL, NULL, PAGE_EXECUTE_READWRITE, SEC_COMMIT, NULL);
if (!NT_SUCCESS (状态)) {
// 输出调试文本 ("NtCreateSection创建节对象失败!")
return;
}

// .如果真 (l_Status ≠ 0)
//     输出调试文本 ("NtCreateSection创建节对象失败!")
//     返回 ()
// .如果真结束

// l_Status = NtMapViewOfSection (l_SectionHandle, -1, l_pViewBase, 0, 0, 0, l_ViewSize, 1, 0, #PAGE_EXECUTE_READWRITE )  ' 将其映射到内存
状态 = NtMapViewOfSection (节句柄, GetCurrentProcess (), &新基址, 0, 0, NULL, 0, ViewShare, 0, PAGE_READWRITE);
if (!NT_SUCCESS (状态)) {
// NtClose (l_SectionHandle)
NtClose (节句柄);
// 输出调试文本 ("NtMapViewOfSection映射节对象失败!")
return;
}
// .如果真结束

// RtlMoveMemory (l_pViewBase, BaseAddress, l_Offset)  ' 将需要原数据拷贝到新区段
RtlMoveMemory (新基址, 基址, 映像大小);

// l_Status = NtUnmapViewOfSection (-1, l_pViewBase)  ' 解除新区段的映射
状态 = NtUnmapViewOfSection (GetCurrentProcess (), 新基址);
if (!NT_SUCCESS (状态)) {
// NtClose (l_SectionHandle)
NtClose (节句柄);
// 输出调试文本 ("NtUnmapViewOfSection解除当前失败!")
return;
}
// .如果真结束

// l_Status = NtUnmapViewOfSection (-1, BaseAddress)  ' 解除原IMAGE的映射
状态 = NtUnmapViewOfSection (GetCurrentProcess (), 基址);
if (!NT_SUCCESS (状态)) {
// NtClose (l_SectionHandle)
NtClose (节句柄);
// 输出调试文本 ("NtUnmapViewOfSection解除原映射失败!")
return;
}
// .如果真结束

// l_pViewBase = l_Section [1].BaseAddress  ' 计算新的pViewBase
新基址 = 内存基本信息[0].BaseAddress;

// .计次循环首 (取数组成员数 (l_Section), i)
for (i = 0; i < (sizeof (内存基本信息) / sizeof (MEMORY_BASIC_INFORMATION)); i++) {
// .如果真 (l_Section [i].Protect = #PAGE_READWRITE l_Section [i].Protect = #PAGE_WRITECOPY l_Section [i].Protect = #PAGE_EXECUTE_READWRITE l_Section [i].Protect = #PAGE_EXECUTE_WRITECOPY )
if (内存基本信息[i].Protect == PAGE_READWRITE || 内存基本信息[i].Protect == PAGE_WRITECOPY || 内存基本信息[i].Protect == PAGE_EXECUTE_READWRITE || 内存基本信息[i].Protect == PAGE_EXECUTE_WRITECOPY) {
// l_ViewSize = l_Section [i].BaseAddress - l_Section [1].BaseAddress
映射大小 = 内存基本信息[i].BaseAddress - 内存基本信息[0].BaseAddress;
// 跳出循环 ()
break;
}
// .如果真结束
}
// .计次循环尾 ()

// l_ViewSize = 65536 × 到整数 (l_ViewSize ÷ 65536)  ' NtMapViewOfSection强制要求64KB对其,所以可能会有部分的READONLY区段获得EXECUTE_READWRITE的保护,但是问题不大,大部分代码仍然是PAGE_EXECUTE保护,且具有SEC_NO_CHANGE属性
映射大小 = (映射大小 + 0xFFFF) & ~0xFFFF; // 64KB对齐

// .如果真 (l_ViewSize ≠ 0)
if (映射大小 != 0) {
// l_Status = NtMapViewOfSection (l_SectionHandle, -1, l_pViewBase, 0, 0, 0, l_ViewSize, 1, #SEC_NO_CHANGE, #PAGE_EXECUTE )
状态 = NtMapViewOfSection (节句柄, GetCurrentProcess (), 新基址, 0, 0, NULL, 映射大小, ViewShare, SEC_NO_CHANGE, PAGE_EXECUTE);
if (!NT_SUCCESS (状态)) {
NtClose (节句柄);
return;
}
}
// .如果真结束

// l_Status = NtMapViewOfSection (l_SectionHandle, -1, l_pViewBase + l_ViewSize, 0, 0, l_ViewSize, l_ImageSize - l_ViewSize, 1, #SEC_NO_CHANGE, #PAGE_EXECUTE_READWRITE )
状态 = NtMapViewOfSection (节句柄, GetCurrentProcess (), (PVOID) ( (ULONG_PTR)新基址 + 映射大小), 0, 0, (PSIZE_T)映射大小, 映像大小 - 映射大小, ViewShare, SEC_NO_CHANGE, PAGE_EXECUTE_READWRITE);
if (!NT_SUCCESS (状态)) {
NtUnmapViewOfSection (GetCurrentProcess (), 新基址);
NtClose (节句柄);
return;
}

// NtClose (l_SectionHandle)
NtClose (节句柄);
}


还给出了解释
这段代码的作用是为一个已经加载到内存中的可执行映像文件添加 SEC_NO_CHANGE 标识。它通过以下步骤实现:

枚举映像在内存中占用的所有内存区域。
根据映像的总大小创建一个新的内存区域(Section)。
将原映像数据复制到新创建的内存区域中。
解除原映像的内存映射。
重新映射新创建的内存区域,并为其添加 SEC_NO_CHANGE 标识。
代码中有一些重要的逻辑流程:

使用循环来枚举映像占用的所有内存区域。
根据内存区域的属性来判断是否为映像的一部分。
计算新映射区域的大小并进行64KB对齐。
分两步映射新区域,第一步映射只读部分,第二步映射可读写部分。

这段代码涉及到的API比较多,所以汉化程度还不够高,换一个RC4的加密算法来体会一下:
  
/* RC4加密算法 */
#include
#include
typedef unsigned char 文本型;
typedef int 整数型;
/* 密钥调度算法 */
void 密钥初始化 (文本型 *密钥,文本型 *状态向量,整数型 密钥长度)
{
整数型 计数器; /* 循环计数器 */
文本型 临时交换值; /* 用于交换状态向量值的临时变量 */

/* 初始化状态向量 */
for (计数器 = 0; 计数器 < 256; 计数器++)
状态向量[计数器] = 计数器;

/* 使用密钥初始化状态向量 */
for (计数器 = 0; 计数器 < 256; 计数器++)
{
临时交换值 = 状态向量[计数器];
状态向量[计数器] = 状态向量[ (密钥[计数器 % 密钥长度] + 状态向量[计数器]) % 256];
状态向量[ (密钥[计数器 % 密钥长度] + 状态向量[计数器]) % 256] = 临时交换值;
}
}
/* RC4加密/解密算法 */
void RC4 (文本型 *输入,文本型 *输出,整数型 输入长度,文本型 *状态向量)
{
整数型 计数器1 = 0, 计数器2 = 0, 计数器3; /* 循环计数器 */
文本型 临时交换值; /* 用于交换状态向量值的临时变量 */

for (计数器3 = 0; 计数器3 < 输入长度; 计数器3++)
{
计数器1 = (计数器1 + 1) % 256;
计数器2 = (状态向量[计数器1] + 计数器2) % 256;
临时交换值 = 状态向量[计数器1];
状态向量[计数器1] = 状态向量[计数器2];
状态向量[计数器2] = 临时交换值;
输出[计数器3] = 输入[计数器3] ^ 状态向量[ (状态向量[计数器1] + 状态向量[计数器2]) % 256];
}
}
整数型 main ()
{
文本型 密钥[] = "密钥"; /* 加密密钥 */
文本型 输入[] = "明文"; /* 待加密数据 */
文本型 输出[sizeof (输入)]; /* 加密后的数据 */
文本型 状态向量[256]; /* 状态向量 */

/* 调用密钥调度算法 */
密钥初始化 (密钥,状态向量,sizeof (密钥));

/* 调用RC4加密算法 */
RC4 (输入,输出,sizeof (输入),状态向量);

printf ("加密后的数据: ");
for (int i = 0; i < sizeof (输出); i++)
printf ("%02X",输出[i]);
printf ("\n");

return 0;
}






评分

参与人数 1精币 +2 收起 理由
光影魔术 + 2 开源精神必须支持~

查看全部评分


发表于 2024-5-20 10:44:20 | 显示全部楼层   山东省聊城市
感谢讲解!很多时候断网运行,我都是尽量使用本地大模型~!所以首先想到的是本地运行!

点评

你有很强的安全意识   江苏省南通市  发表于 2024-5-20 18:50
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 1 天

发表于 2024-5-17 06:30:05 | 显示全部楼层   福建省泉州市
收藏了,以后肯定用得到。
回复 支持 反对

使用道具 举报

发表于 2024-5-16 22:40:41 | 显示全部楼层   北京市北京市
本帖最后由 ANormalUser 于 2024-5-16 23:40 编辑

你在想什么?
易语言实现的例子就没有其他语言找不到的,这份代码还是我从C那边翻译过来的……

点评

有啊,自己写的代码。   江苏省南通市  发表于 2024-5-20 18:48
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 1 天

发表于 2024-5-16 18:30:05 | 显示全部楼层   福建省泉州市
详细易懂,对我帮助很大。
回复 支持 反对

使用道具 举报

发表于 2024-5-16 10:08:41 | 显示全部楼层   山东省聊城市
感谢回复。我找找试试!因为我需要脱机的!所以只能实验下本地~!

点评

脱机推荐ollama本地部署,有docker一键版   江苏省南通市  发表于 2024-5-16 19:16
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
 楼主| 发表于 2024-5-15 00:11:29 | 显示全部楼层   江苏省南通市
源码转成其他语言再编译,不再受到X64、Unicode、误报等各种限制
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
 楼主| 发表于 2024-5-14 23:46:55 | 显示全部楼层   江苏省南通市
目前virtual studio上没有免费好用的AI插件

开源大模型日新月异,但是真正好用的VScode上基本都有插件,可以从VScode插件的更新关注编程大模型。
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 1 天

发表于 2024-5-14 14:24:44 | 显示全部楼层   广西壮族自治区柳州市
感谢分享源码

点评

源码只是样品,重要的是趋势   江苏省南通市  发表于 2024-5-14 23:40
回复 支持 反对

使用道具 举报

结帖率:80% (4/5)
发表于 2024-5-14 13:08:26 | 显示全部楼层   山东省潍坊市
请问使用的那个大模型转变的呢?直接发个关键词或者链接吧

点评

vscode+Cody AI,国产的通义灵码、CodeGeeX、aiXcoder测试下来都还可以   江苏省南通市  发表于 2024-5-14 23:35
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表