开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 15391|回复: 159
收起左侧

[易语言纯源码] 【易IDE视觉库 插件】小助手插件集成工具箱和皮肤预览

[复制链接]
结帖率:100% (1/1)
发表于 2021-9-10 19:34:35 | 显示全部楼层 |阅读模式   江苏省连云港市
分享源码
界面截图:
是否带模块: 纯源码
备注说明: -
关于皮肤预览功能,初版见这篇帖子,存在不少问题 【易IDE视觉库 插件】Skin#窗口设计预览插件及源码分享

优化皮肤箱功能(解决初版问题如下)

1、皮肤过多在菜单显示不友好问题(使用窗口代替,增加了皮肤文类)
2、补全皮肤功能功能
3、优化Hook功能,初版中Hook非常粗暴,干扰了IDE正常功能,会造成一些闪退的情况(文末会重点说一下这点的解决方式)

新增工具箱功能(需要注意以下几点)

1、乱七八糟的程序放到指定目录,文件夹分好类,然后启动插件后会自动遍历exe文件
2、对于扫描出来的一些乱七八糟的exe(如 set.exe up.exe等等)可以右键加入黑名单,一劳永逸
3、分类纯粹依靠文件夹名的排序,手动排序暂未实现,视觉库对于tree view的拖拽功能没有重绘,凑活用吧


技术探讨

下面说下如何能在一个进程中精准Hook指定模块(dll)对API的调用,

拿皮肤预览功能来说, 我只需要Hook Skin_EL.dllIsMenu EnumThreadWindows 的调用,这样便可以实现不干扰IDE正常功能,Hook类原理参考了OD,对ESP地址进行判断调用者所属模块(虽然实现了对调用者的判断,奈何不懂汇编,代码中蹩脚的几句汇编指令纯粹个人不成熟的想法,有懂汇编的大佬希望能不吝赐教是否有更好的办法),多说无益,详细实现方法见代码:


  
窗口程序集名保 留  保 留备 注
InlineHook   
变量名类 型数组备 注
m_ProcAddress整数型  
m_OldProtect整数型  
m_Newdata字节集  
m_Olddata字节集  
m_DataLen整数型  
m_CurrentProcessId整数型  
m_IsHook逻辑型  
m_EspAddress整数型  

子程序名返回值类型公开备 注
_初始化 当基于本类的对象被创建后,此方法会被自动调用
m_IsHook = 假
m_CurrentProcessId = GetCurrentProcessId ()
子程序名返回值类型公开备 注
_销毁 当基于本类的对象被销毁前,此方法会被自动调用
UnInstall ()
释放内存 (m_EspAddress)
子程序名返回值类型公开备 注
IsInstall逻辑型 是否已安装HOOK
返回 (m_IsHook)
子程序名返回值类型公开备 注
GetAddress整数型 取原函数地址
返回 (m_ProcAddress)
子程序名返回值类型公开备 注
GetCaller文本型 返回调用者模块完整路径
变量名类 型静态数组备 注
hModule整数型 
sModule文本型 
mbiMEMORY_BASIC_INFORMATION 
' GetModuleHandleExA (位或 (#GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, #GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT), 到文本 (m_EspAddress), hModule)
如果真 (m_EspAddress > 0)
如果真 (VirtualQuery (m_EspAddress, mbi, 28) ≠ 0)
hModule = mbi.AllocationBase
sModule = 取空白文本 (256)
如果真 (GetModuleFileNameA (hModule, sModule, 256) = 0)
sModule = “”


返回 (sModule)
子程序名返回值类型公开备 注
Install逻辑型 根据函数名安装APIHOOK
参数名类 型参考可空数组备 注
sModuleName文本型如:user32.dll
sProcName文本型如:FindWindowA
hCallback子程序指针如:&myFindWindowA
变量名类 型静态数组备 注
hMod整数型 
hAddress整数型 
如果真 (m_IsHook)
返回 ()
hMod = GetModuleHandleA (sModuleName)  ' 取模块句柄
如果真 (hMod = 0)
hMod = LoadLibraryA (sModuleName)

如果真 (hMod ≠ 0)
hAddress = GetProcAddress (hMod, sProcName)
返回 (InstallAddress (hAddress, hCallback))
返回 ()
子程序名返回值类型公开备 注
InstallAddress逻辑型 根据函数地址安装APIHOOK
参数名类 型参考可空数组备 注
hAddress整数型
hCallback子程序指针如:&myFindWindowA
如果真 (m_IsHook)
返回 ()

如果真 (IsBadCodePtr (hAddress))
' m_Newdata = { 184 } + 到字节集 (到整数 (hCallback)) + { 255, 224 }
' mov eax, hCallback
' jmp eax
m_Newdata = { 139, 4, 36, 163 }到字节集 (取变量数据地址 (m_EspAddress)) + { 184 }到字节集 (到整数 (hCallback)) + { 255, 224 }
' mov eax, dword ptr [esp]
' mov dword ptr [address], eax
' mov eax, hCallback
' jmp eax
m_DataLen = 取字节集长度 (m_Newdata)
如果真 (VirtualProtect (hAddress, m_DataLen, 64, m_OldProtect))  ' 修改内存属性
m_Olddata = 指针到字节集 (hAddress, m_DataLen)
m_ProcAddress = hAddress
写到内存 (m_Newdata, m_ProcAddress, m_DataLen)
m_IsHook = 真

返回 (m_IsHook)
子程序名返回值类型公开备 注
Pause逻辑型 停止HOOKAPI
如果 (m_IsHook)
写到内存 (m_Olddata, m_ProcAddress, m_DataLen)
返回 ()
返回 ()

子程序名返回值类型公开备 注
Resume逻辑型 开始HOOKAPI
如果 (m_IsHook)
写到内存 (m_Newdata, m_ProcAddress, m_DataLen)
返回 ()
返回 ()

子程序名返回值类型公开备 注
UnInstall逻辑型 卸载APIHOOK
如果 (m_IsHook)
写到内存 (m_Olddata, m_ProcAddress, m_DataLen)
VirtualProtect (m_ProcAddress, m_DataLen, m_OldProtect, 0)  ' 修改回原内存保护值
连续赋值 (0, m_ProcAddress, m_OldProtect, m_DataLen)
连续赋值 ({  }, m_Newdata, m_Olddata)
m_IsHook = 假
返回 ()
返回 ()


i支持库列表   支持库注释   
spec特殊功能支持库


插件安装方法


1、安装IDE视觉库
2、解压压缩包至易语言安装目录
3、放置皮肤文件至 易语言安装目录\assistant\skins
4、放置程序文件至 易语言安装目录\assistant\tools


源码及插件下载
  1. iDraw_Assistant.dll
  2. iDraw_Assistant.e
复制代码
回复可见
iDraw_Assistant.zip (689.53 KB, 下载次数: 460)

评分

参与人数 3好评 +3 精币 +10 收起 理由
350246356 + 1 + 2 新技能已get√
冰点 + 1 + 5 感谢分享,很给力!~
易语言资源网 + 1 + 3 支持开源~!感谢分享

查看全部评分


本帖被以下淘专辑推荐:

结帖率:100% (1/1)

签到天数: 10 天

 楼主| 发表于 2021-11-7 22:32:41 | 显示全部楼层   江苏省连云港市
更新:修复一处BUG:IDraw_UnInterface函数内误用iDraw_img_destroy销毁图片导致的崩溃问题,应该使用iDraw_FreeResourceReturn
上面说的那个BUG虽然没有任何提示,但是会导致IDE修改的系统配置不会保存,成为万恶之源,好气啊,最新源码见置顶楼
请自行编译然后替换插件!!!!!!!!!!!!



iDraw_Assistant.e (317 KB, 下载次数: 146)
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 2024-3-12 21:42:28 | 显示全部楼层   山东省菏泽市
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)

签到天数: 9 天

发表于 2024-1-17 11:33:47 | 显示全部楼层   北京市北京市
支持开源~!感谢分享
回复 支持 反对

使用道具 举报

结帖率:83% (5/6)

签到天数: 5 天

发表于 2024-1-11 15:17:02 | 显示全部楼层   江苏省苏州市
sadamu999 发表于 2022-12-23 23:27
好象只能预览,调试界面时不行,编译肯定更不行了,或者我不会用?如果所见即所得,那这个插件还是不错的! ...

那有啥卵用~
回复 支持 反对

使用道具 举报

签到天数: 17 天

发表于 2023-12-27 11:00:11 | 显示全部楼层   山东省潍坊市
上的胜多负少大师傅地方
回复 支持 反对

使用道具 举报

签到天数: 5 天

发表于 2023-12-26 21:42:39 | 显示全部楼层   浙江省绍兴市
回复 支持 反对

使用道具 举报

签到天数: 5 天

发表于 2023-12-26 21:41:51 | 显示全部楼层   浙江省绍兴市
回复 支持 反对

使用道具 举报

发表于 2023-12-20 14:34:31 | 显示全部楼层   山东省日照市
飞驰V行帮支持
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 2023-10-1 16:08:34 | 显示全部楼层   广东省深圳市
        支持开源~!感谢分享
回复 支持 反对

使用道具 举报

发表于 2023-8-21 21:30:07 | 显示全部楼层   天津市天津市
运行不起来 不能用
回复 支持 反对

使用道具 举报

发表于 2023-8-21 21:27:07 | 显示全部楼层   天津市天津市
来看看 别人的皮肤不会用  试试大佬你的
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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