|
分享源码
界面截图: |
|
是否带模块: |
纯源码 |
备注说明: |
- |
关于皮肤预览功能,初版见这篇帖子,存在不少问题 【易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.dll 对 IsMenu 和 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 )返回 (m_IsHook )返回 (m_ProcAddress )变量名 | 类 型 | 静态 | 数组 | 备 注 | hModule | 整数型 | | | sModule | 文本型 | | | mbi | MEMORY_BASIC_INFORMATION | | | 如果真 (m_EspAddress > 0 )如果真 (VirtualQuery (m_EspAddress, mbi, 28 ) ≠ 0 )hModule = mbi.AllocationBase sModule = 取空白文本 (256 )如果真 (GetModuleFileNameA (hModule, sModule, 256 ) = 0 )sModule = “”返回 (sModule)|
Install | 逻辑型 | | |
sModuleName | 文本型 | | | | sProcName | 文本型 | | | | hCallback | 子程序指针 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | hMod | 整数型 | | | hAddress | 整数型 | | | 如果真 (m_IsHook )返回 (真)hMod = GetModuleHandleA (sModuleName) 如果真 (hMod = 0 )hMod = LoadLibraryA (sModuleName )如果真 (hMod ≠ 0 )hAddress = GetProcAddress (hMod, sProcName )返回 (InstallAddress (hAddress, hCallback )) 返回 (假)|
InstallAddress | 逻辑型 | | |
hAddress | 整数型 | | | | hCallback | 子程序指针 | | | | 如果真 (m_IsHook )返回 (真)如果真 (IsBadCodePtr (hAddress ) = 假) m_Newdata = { 139, 4, 36, 163 } + 到字节集 (取变量数据地址 (m_EspAddress )) + { 184 } + 到字节集 (到整数 (hCallback )) + { 255, 224 } 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)如果 (m_IsHook )写到内存 (m_Olddata, m_ProcAddress, m_DataLen )返回 (真)返回 (假)如果 (m_IsHook )写到内存 (m_Newdata, m_ProcAddress, m_DataLen )返回 (真)返回 (假)如果 (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 = 假 返回 (真)返回 (假)
插件安装方法
1、安装IDE视觉库
2、解压压缩包至易语言安装目录
3、放置皮肤文件至 易语言安装目录\assistant\skins
4、放置程序文件至 易语言安装目录\assistant\tools
源码及插件下载
- iDraw_Assistant.dll
- iDraw_Assistant.e
复制代码 回复可见
iDraw_Assistant.zip
(689.53 KB, 下载次数: 504)
|
评分
-
查看全部评分
|