最近写一款软件 想搞个UI 就用了花名和精易的皮肤模块 他们里面自带了SHE皮肤。
观察:那些she皮肤会把 信息框也就是 MessageBox这个窗口渲染的好XX.... ,其他的组件都挺好看 就是这个信息框XXX
思考:能不能不要他SHE皮肤渲染的信息框呢,就用原生的?!在线程里面操作 就会弹出原生的信息框, 但是主进程还是被渲染!凑合也能用,但是写代码的有几个不是强迫症
假设:把整个信息框给替换了那不就好了,哦豁!福仔大佬的:最牛逼信息框 从福仔开源的代码来看是支持多线程的....
实验:写代码发现福仔信息框和SHE皮肤有冲突!会导致程序卡死!
思考2:应该是福仔信息框Hook的点和she皮肤需要监测的点引起内存检测冲突。。。但是这样要么就不能使用福仔自绘的信息框,要么就不能使用she皮肤。怎么可能就这么算了?!
实验2:福仔信息框这边源码确实没什么好改的!!分析了一下精易皮肤模块源码调用了 SkinH_EL.dll,通过IDA和OD分析:皮肤模块的组件都是根据类类型去渲染的 -->这就导致信息框的确定 取消按钮都是一个色!
调试发现只要让它恒返回1就不会渲染了,因此我们就可以在皮肤渲染完成后 替换这个函数的头部字节就可以避免SkinH_EL再去检测了。同样我们就可以愉快的使用福仔信息框和SHE皮肤融合!
成品展示:
用福仔皮肤设计器自行设计想要的样式
代码展示:
m_CommonAddr = 进程_取模块句柄 (“SkinH_EL.dll”)如果 (m_CommonAddr = 0 )调试输出 (“初始SEL失败。”)调试输出 (m_CommonAddr )Install_SHE_hook ()变量名 | 类 型 | 静态 | 数组 | 备 注 | 偏移 | 整数型 | | | code | 字节集 | | |
偏移 = m_CommonAddr + 十六进制 (“1A030”) code = { 184, 1, 0, 0, 0, 194, 8, 0, 144, 144, 144 }如果真 (内存_修改内存 (偏移, code, 取字节集长度 (code )) )调试输出 (“修改内存成功。”)
----------------------
后记:这是一个抛砖引玉的思路,大家可以简单的东西直接用皮肤模块,不好的可以自己写自绘组件替换掉(当然原生肯定最稳啦,人靠衣装,XXX)
还有就是以前裤衩大佬写的框架你们写插件的时候用皮肤会卡死就是这个道理:他某些组件自绘已经提前hook了某些函数你再去用she去检测就会卡死,同样你们可以应用到自己的各种框架自己自绘好,不让插件的皮肤模块修改主程序的界面样式,等等等等
论坛大佬的源码看起来还是挺有收获的...
|