- 博客(120)
- 收藏
- 关注

原创 Java 代码编译和解析方法信息
Javassist 是一个强大的字节码操作工具,它提供了在运行时编辑 Java 字节码的能力。通过Javassist,开发人员可以动态地创建和修改 Java 类。这使得在不重新编译整个程序的情况下,能够对类进行动态修改和增强。Java 文件路径!!!!// 打印结果// 打印返回类型} else {= null) {')).trim();break;
2025-01-02 15:55:57
293

原创 使用 JavaParser 解析代码
要判断 Java 代码文本中一个方法的输入参数个数和类型,可以借助 JavaParser 这样的第三方库来解析 Java 代码并获取方法的参数信息。对于局部变量的个数和类型,也可以通过类似的方法来解析语句中的局部变量信息。上面的代码中,我们使用 JavaParser 加载 Java 文件并创建 CompilationUnit 对象,然后遍历所有的方法声明,获取方法的参数信息和局部变量信息。2)编写 Java 代码,使用 JavaParser 解析 Java 代码并获取方法参数以及局部变量信息。
2024-05-25 12:40:14
1021

原创 Soot 安装和简单使用
Soot 是 McGill 大学的 Sable 研究小组自 1996 年开始开发的 Java 字节码分析工具,它提供了多种字节码分析和变换功能。通过它可以进行过程内和过程间的分析优化,以及程序流图的生成;还能通过图形化的方式输出,让用户对程序有个直观的了解。尤其是做单元测试的时候,可以很方便的通过这个生成控制流图然后进行测试用例的覆盖,显著提高效率。Soot 项目已经不再继续维护,其最高支持到 Java 9 版本。如果要在更新的项目中使用,请配置项目组最新开发和维护的 SootUp 项目(
2024-03-25 07:15:00
2660

原创 实现桌面动态壁纸(一)
本文章以在 Windows 桌面管理层窗口(桌面图标后面)嵌入第三方窗口为主题,主要针对动态壁纸实现原理进行讲解。
2023-10-09 02:43:21
6235
28
原创 ImGui 学习笔记(六)—— 高 DPI 缩放
字体和高 DPI 处理,可以看这几个:https://github.com/ocornut/imgui/discussions/3925https://note.stalomeow.com/p/imgui-handle-high-dpi/https://github.com/ocornut/imgui/blob/master/docs/FONTS.md
2025-03-17 19:56:43
261
原创 ImGui 学习笔记(五) —— 字体文件加载问题
这个好解决,在加载函数前面加上一些路径检查和转换的代码,比如转为绝对路径(程序目录+文件名),然后检查权限,权限不够就改用 COM 或者提权(我这里不考虑跨平台,所以没关系,如果考虑跨平台,可能需要更多修改)。当参数中包含中文字符时,ImGui 内部将字符转换为宽字符字符集时候,采用的 MultiByteToWideChar API 参数不太对,应该改为 CP_ACP 才对,原本它使用的是 CP_UTF8。修改前,字体加载失败,然后我发现它处理相对路径的方式也不好。明显路径中中文编码出现了乱码?
2025-03-17 18:27:06
314
原创 ImGui 学习笔记(四)—— 实现每窗口背景色
这里的 ImU32 bg_col = GetColorU32(GetWindowBgColorIdx(window));就是窗口要设置的背景颜色,想办法改成跟窗口 id,name 或者 hash 绑定的数值即可。
2025-03-14 14:35:05
258
原创 Windows 小记 21 —— dumpbin 命令查看模块依赖项
dumpbin 命令可以用来看动态库导出了哪些函数 dumpbin /EXPORTS a.dll ,exe 加载了哪些动态库 dumpbin /IMPORTS a.exe,查看静态链接库中包含哪些函数 dumpbin /ALL /RAWDATA:none a.lib。这个命令默认是不在 cmd 里,安装了 VS 的话需要在 VS 的开发者命令提示 Developer Command Prompt 里运行才能找到这个命令。
2025-02-28 12:15:28
261
原创 Windows 小记 22 —— 在 Windows 上排查 DLL 依赖问题
缺失导入的模块将会在左侧依赖树形图中显示为粉色高亮的图标,并在光标悬停在模块标签上时,显示 “ xx 模块缺失导入条目” 的提示信息。双击模块标签,可以在右侧的依赖信息视图中看到模块的导入依赖,它显示所有需要的函数的列表。缺失或不匹配的函数将在 PI 列显示为红色突出的图标。注意:导入缺失表明所需模块与本机上实际加载的模块不匹配,这是版本问题导致的。具体到系统模块,比如这里的 comctl32.dll 有多个版本共存,出现导入不匹配,则可能是因为程序的清单文件中 SxS 加载配置存在错误。
2025-02-28 10:48:05
439
原创 Windows 小记 20 —— 模块依赖项的类型
(也称为加载时依赖,有时被错误地称为静态依赖):模块 A 在编译/链接时与模块 B 的 LIB 文件隐式链接,模块 A 的源代码实际上调用模块 B 中的一个或多个函数。模块 B 是模块 A 的加载时依赖,无论模块 A 是否在运行时实际调用模块 B,模块 B 都将被加载到内存中。:模块 A 在编译/链接时与模块 B 的 LIB 文件链接在一起,并且模块 A 的源代码实际上调用了模块 B 中的一个或多个函数。模块 B 和模块 C 都是模块 A 的依赖项,但只有模块 B 会列在模块 A 的导入表中。
2025-02-28 10:22:53
310
原创 Windows 小记 19 —— 在调试时使用加载器快照日志输出
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\目标进程名.exe]调试一些进程启动相关的错误时,可以尝试开启系统的加载器快照选项。这将允许调试目标进程时候由系统加载器向调试器提供更多的日志信息。在调试时,需要注意可能因为系统的进程缓解策略或者安全软件而产生中断,这一点得仔细检查。调试器将在下一次启动调试实例或者附加到进程时获取到加载器输出的信息。
2025-02-28 10:20:56
244
原创 Windows 小记 18 —— 子窗口继承父窗口的样式
指定所有者窗口时,子窗口将从父窗口/所有者窗口拷贝部分样式和扩展样式。此问题发生在 ImGui 的 win32 后端逻辑中,作者错误地设置所有者窗口,导致当 win32 平台窗口设置 WS_EX_TOPMOST 样式时,无法控制在多视口种的新窗口的样式。所以,当你发现你的 WS_POPUP 样式的窗口默认具有 WS_EX_TOPMOST 时候,不要觉得奇怪。可能是你设置了所有者窗口。例如,当所有者窗口具有 WS_EX_TOPMOST 样式时候,其创建的子窗口将具有 WS_EX_TOPMOST 样式。
2025-02-21 22:33:09
232
原创 ImGui 学习笔记(三)—— 隐藏主窗口&窗口关闭检测
另一种隐藏平台窗口的实现是使用分层透明,这里我也介绍一下,就是在 Win32 窗口创建时使用纯色画刷,然后使用 SetLayeredWindowAttribute 将背景色去除,将平台窗口设置为无边框全屏窗口(注意不是独占显示器的窗口),然后给窗口添加 WS_EX_TRANSPARENT 样式,这将允许在窗口完全透明的位置穿透鼠标、键盘消息。我们最好在窗口透明的基础上隐藏平台窗口。然后,我们在平台窗口创建时候,指定 WS_POPUP WS_EX_TOOLWINDOW 以便于不在任务栏显示平台窗口的图标。
2025-02-21 20:12:14
928
原创 Detours 中几个比较重要的 API
如果目标进程的大小与父进程不同,Detours 将自动在路径名中将"32"替换为"64"或"64"替换为"32"。更新的导入表将包含对从目标 DLL 导出的函数序号 #1 的引用。如果目标进程是 32 位且父进程是 64 位,或者如果目标进程是 64 位且父进程是 32 位,当执行恢复时,Windows 进程加载器将首先加载目标 DLL,然后加载应用程序导入表中的任何其他 DLL,最后调用应用程序入口点。将 DLL 载入一个临时匹配目标进程的辅助进程,以便用正确的 DLL 更新目标进程的导入表。
2025-02-21 17:17:15
681
原创 Windows 小记 17 —— TLS 回调中使用 CRT 函数导致崩溃
PE 格式包含一个可选标头,其中有一个名为“AddressOfEntryPoint”的插槽,该插槽调用一个函数,该函数将调用 _DllMainCRTStartup,从而触发初始化链。所以,在静态链接选项(对于 MSVC 是 /MT 编译选项)启用时,TLS 中如果执行了 CRT 函数,将因为尚未初始化资源,而导致访问非法内存而导致崩溃。首先我们需要知道 TLS 回调的执行在程序入口点之前,而在静态链接时,CRT 的初始化在入口函数执行时才会进行。
2025-02-08 13:57:15
275
原创 ImGui 学习笔记(二)—— 多视口
其基本原理是当检测到 ImGui 窗口超出平台窗口的客户区边界时,自动创建新的平台窗口,并在新的平台窗口下渲染该 ImGui 窗口。此处的“窗口”并非窗口管理器里的视窗,而是借用窗户进行类比,因为它能够限制你所能够观察到的场景的范围。借助多视口,Dear ImGui 能够根据需要创建新的操作系统平台窗口和图形上下文,以托管已移出主操作系统平台窗口边界的 Dear ImGui。使用 ImGui 的 docking (停靠)分支,将支持多视口和停靠功能,这个分支目前受到良好的维护和测试,相对稳定。
2025-02-05 13:25:16
547
原创 ImGui 学习笔记(一)—— 创建窗口
谈谈学习了几天 imgui 代码后的感觉(暂时还不能说感受或者感悟),这里的窗口并不是真正意义上的平台窗口(平台窗口的实现需要根据具体的平台来决定,通过调用平台的 API 创建一个存根窗口,然后调用后端在根窗口上进行渲染。一个视口中可以有多个窗口元素,当一个窗口元素从主视口中移出时,ImGui 会隐式地创建新的平台上下文和一个新的平台窗口,将元素从原来的视口结构中移动到新的视口结构中(此时窗口就独立出来了)。后续的元素将在新的窗口下生成(会和前面的分离开来)。
2025-02-05 02:03:34
406
转载 【转载】通过 GetMessageExtraInfo 方法判断当前收到的鼠标消息是否来自触控板和 Pen
根据 GetMessageExtraInfo 方法获取到的 LPARAM 进行 Mask 一下 0xFFFFFF80 值,即可通过返回的结果判断鼠标消息的来源,如返回的结果是 0xFF515780 则判断是 Touch 触摸消息过来的,通过返回结果是 0xFF515700 则判断是 Pen 笔过来的。如果此时应用程序想要根据消息循环里面接收到的 Win32 消息判断一个鼠标消息的来源是否来自于触摸框触摸屏或者是 Pen 笔等,可以通过 GetMessageExtraInfo 方法获取更多的信息。
2025-01-31 11:40:48
46
转载 [转载] 理解 SetCapture、ReleaseCapture、GetCapture
很多时候,窗口或控件在鼠标按下后,需要知道鼠标移动和放开的情况,例如按钮在鼠标按下后会变为“按下”状态,鼠标移出按钮区域时“弹起”,所以按钮控件需要在鼠标按下时SetCapture,鼠标放开后ReleaseCapture。当你在浏览本日志的时候,你会拉动右手边的滑动条来调整内容上下位置,那么当你按下左键的时候,移动鼠标到非滚动条处,你会发现上下移动鼠标滚动条仍然后控制,对,这就是俘获鼠标函数SetCapture的作用。函数功能:该函数在属于当前线程的指定窗口里设置鼠标捕获。
2025-01-29 20:33:26
54
原创 Microsoft Visual Studio 2022 主题修改(补充)
之前一直用的2019,现在换电脑了下的2022,想自定义背景,发现以前的方法不好用了。(参考了以前的经验帖子,链接就放下面了):(5条消息) Visual Studio 2022界面美化教程_CN天狼-优快云博客(5条消息) Microsoft Visual Studio 2019 美化之——透明化窗口 Microsoft Visual Studio 2019 C/C++ Windows 下重量级编辑器 Editor_CipherDreams_material studio怎么把背景弄成透明。
2025-01-27 12:59:49
2074
原创 Windows 小记 16 -- 巧用未文档化事件
在最近的学习过程中,一个练习的小项目需要知道桌面什么时候会发生切换(P.S.不是 Win10,11 的虚拟桌面)。登陆系统时候的桌面和进入系统后的桌面不是一个桌面。现在,我们需要在发生窗口切换的时候响应(做一些动作),那么怎么实现呢?最开始时候我考虑到可以循环取活动桌面的信息,然后判断是不是用户桌面。这样的话会比较low。然后,在观察系统事件时候,我不经意间发现了一个细节,桌面切换这件事,系统也在监听!Windows 操作系统中有很多用到进程间通信的地方,不同组件之间是通过相互协作来完成操作的。
2025-01-27 09:23:02
727
原创 实现桌面动态壁纸(三)—— 视频播放的策略
而实现窗口透明则通过修改播放器渲染输出窗口(或者背景窗口)的样式,即通过 WS_EX_LAYERED 设置分层窗口,然后使用 SetLayeredWindowAttributes(hOutputTargetWnd, RGB(0,0,0), 250, LWA_ALPHA | LWA_COLORKEY) 减除窗口中的黑色颜色,这样就可以实现除渲染以外的部分完全透明了。要真正实现一个动态壁纸套件,其实除了视频播放器还需要一个定制化的 Web 浏览器,因为在前端技术成熟的今天,网页能够做到更多的交互和动画。
2025-01-26 22:41:09
329
原创 Windows 小记 15 -- 关于 Win11 睡眠状态的不严谨猜测
Win11 和 Win10 在睡眠设计方面有很大不同,第一点是 Win11 的睡眠不像 Win10 那样由 Winlogon 和常见调用进程(explorer)直接发起。很有可能是通过 ALPC。通过测试可以发现,即使拦截了 LSM 服务,也不能在 Win11 上阻止睡眠,屏幕还是会变黑(无锁屏)。但是可以发现释放过程后,会陷入真正的睡眠(黑屏+需要密码解锁锁屏)。可以猜测, Win11 可能为了更快速地完成状态切换,睡眠可能只是先关闭显示器,然后再在后台异步处理完过程,随后进入真正的睡眠。
2024-12-25 01:16:28
168
原创 Windows 小记 14 -- IShellExecuteHook 接口已经失效
如果你想要用这个来拦截所有启动是不可能的,这个接口最开始就不是这个目的设计的(对 CreateProcess 、CreateProcessInternal、CreateProcessAsUser、NtCreateUserProcess 等无效),并且从 Win7 开始,资源管理器基本上不咋使用 ShellExecuteEx 了,估计就是为了解决滥用问题。微软官方声称这个接口的概念已经在 Vista 中删除。实测注册 HOOK 后,只对终端中得提权,任务管理器中的运行对话框(非提权/提权)有拦截效果。
2024-12-22 18:13:44
235
原创 Windows 小记 13 -- 如何正确获取 UIAccess
但是,通过我的尝试(可以说是失败的尝试),发现 UIAccess 这个特权必须在进程初始化时使用才有效,为当前进程动态赋予 UIAccess 不能够成功使得窗口置顶。这一点其实有时候是比较麻烦的,因为你的应用必须保存当前的设置,然后注册在重启时恢复状态。网络上获取 UIAccess 的一般方法是通过复制特权进程的令牌,并赋予 UIAccess 特权给令牌,然后用这个新的令牌启动进程。除非你有代码签名(通过程序清单合法地使用最高优先级的 UIAccess),否则 UIAccess 的绕过方法都不是最简单的。
2024-12-19 23:39:00
397
原创 Windows 小记 12 -- 全局快捷键引擎降低轮询效率
通常,一些软件会通过鼠标(键盘)钩子、低级键盘钩子或注册热键(当注册热键比较多时,系统每次都需要查表)的方式来实现全局快捷键,或用于捕获键盘和鼠标输入等事件。然而,在使用过程中,启动此类全局快捷键引擎时,往往会导致系统在一段时间内严重降低对 USB 设备事件的轮询效率,进而造成明显的延迟现象。钩子机制会拦截操作系统的输入消息,系统的每个输入事件(键盘或鼠标)都需要经过这些钩子来进行处理。当全局钩子或热键引擎占用了大量 CPU 时间,系统处理来自 USB 设备的事件(如鼠标和键盘输入)时会发生延迟,表现为。
2024-12-17 21:15:49
382
原创 Windows 小记 8 -- EndTask 结束任务的安全问题
通过分析 EndTask 函数的实现细节,我发现该函数最终通过与 CSRSS 进程通信,请求调用 CSR 中的服务接口来终止目标窗口(进程)。换句话说,以上代码会导致 CSRSS 自己终止自己,由于它是系统关键进程,这会导致系统蓝屏。这个窗口属于 CSRSS 进程,而 CSRSS 是一个系统关键进程。通过我的测试发现,EndTask 函数没有进行任何安全边界检查,允许低权限用户终止受保护的进程和系统关键进程。EndTask 函数用于结束任务,它会强制终止目标窗口的进程,因此不建议用于常规操作。
2024-12-16 22:15:39
865
原创 Windows 小记 10 -- DLL 静态链接需要注意的
它通过将一些不常变化的头文件(如标准库、第三方库、项目中的常用头文件等)预先编译成一个二进制文件,然后在后续的编译过程中直接引用这个预编译的文件,而不需要每次都重新编译这些头文件。预编译头的作用是加速编译过程,它通常包含那些较少改变的头文件和声明(例如标准库、常用的第三方库头文件等)。对于经常不变的头文件,可以在预编译时固定下来,只需在发生变化时重新编译,这样可以减少不必要的编译。在编译时,先生成预编译头,然后在后续的源文件编译时引用这个预编译头文件,从而加速编译过程。在预编译头文件中声明。
2024-12-16 21:47:14
918
原创 Windows 小记 9 -- RawInput 的注意事项
但是从虚拟按键码来看,二者又共用相同的虚拟按键码。Scan 1 Make 代码在 WM_KEYDOWN/WM_KEYUP/WM_SYSKEYDOWN/WM_SYSKEYUP 和 WM_INPUT 消息中传递。扫描码是直接面向设备的。处理这个问题的推荐方法是让一个窗口接收原始输入,然后向其他感兴趣的窗口生成事件。RawInput 也是支持对扫描码的处理的,只不过不仔细研究结构容易被忽略。Flags 成员定义了扫描码的信息标志位(高位)。其实真正的 Scan 1 Code 包含高位标志位的。
2024-12-13 14:59:10
660
原创 Windows 小记 7 -- TASKKILL 命令拦截规则概述
taskkill /f /fi "pid ge "taskkill { "/F" | "/T" | "/IM" } taskkill /FI "IMAGENAME ne
2024-12-07 02:15:06
203
原创 Windows 小记 6 -- 为什么我的全局消息钩子卸载不掉?
对于 WH_CBT、WH_GETMESSAGE 等几个全局性质的钩子,特别容易在启用钩子一段时间后出现无法完全卸载的问题。微软的文档也说明了,基于钩子链传递的 HOOK 会导致远程线程中的模块无法主动卸载。如果某个线程先前创建了一个窗口,但随后又销毁了它(并且不再在消息循环中运行),则这会使钩子 DLL 处于加载状态。Application Frame Host 进程,手动释放挂起的进程是没有用的,只能激活他们的窗口。但是有时还是会遇到这个问题,锁定的进程可能会阻止 DLL 卸载,有证据可以证明这一点。
2024-12-06 16:56:02
244
原创 Windows 小记 5 -- 判断账户是否是管理员账户
域用户(针对间接或者嵌套用户组,最佳的获取方式是通过令牌SID,如果用户账户已经登陆,则可以通过进程句柄获取令牌,否则,则需要通过凭据登陆获取令牌)此外需要注意,当账户没有启用时,可能是无法创建和登陆管理员用户的。如果返回 “\n发生系统错误 1378。\n指定的帐户名已是此组的成员。\n” 则表明已经位于管理员用户组。如果返回“操作成功完成”,则表明之前不是管理员账户。那么再调用 /del 删除添加的管理员。可以通过 net localgroup Administrators 进行验证。
2024-11-16 20:14:16
672
1
转载 Windows 小记 4 -- 关闭漏洞驱动黑名单
通过修改此注册表可以达到正常加载已经被 ms 惩戒的已具备有效签名的驱动(通常是漏洞驱动)。这将允许干什么我就不多说了吧。值:0 (关闭 CI 黑名单过滤)默认值:1 (启用黑名单)
2024-11-15 22:51:49
800
转载 Windows 小记 3 -- 屏蔽系统热键的补充
ban 的基本思路就是:1)获取注册热键的窗口句柄(一般这些窗口可以根据窗口类名特征或者窗口创建的时机,窗口层次锁定,或者你逆向hook 住一些创建时的 api 即可);2)窗口子类化,在子类化过程中调用 UnregisterHotKey 卸载热键(此 id 根据驱动获取的结果得到,或者写死)。通过查找热键,可以找到 Win+L,Ctrl+Alt+Del 等多个热键的id 码。不同系统可能id码还会不一样,取决于注册热键的程序是否经常更新,像 csrss 就不怎么变化,explorer 就总会变。
2024-11-15 22:28:41
83
转载 Windows 小记 2 -- 关注窗口安全性
方法9:远程线程 hook GetMessage, SendMessage, PostMessage,PeekMessage 或者他们的共同内部函数,故意导致窗口卡死。方法10:发送消息点击具有系统菜单关闭按钮的窗口。方法8:发送 WM_QUIT 至窗口线程,绕过窗口过程杀 GUI 线程。方法1:各类窗口关闭消息,只要目标窗口没有处理这些消息就可以做到关闭。方法7:comctl32 6.0 以上更新窗口过程函数(类同法6)方法11:嵌入子窗口,或者所有者窗口覆盖,导致目标窗口无法操作。/* 窗口攻击 */
2024-11-15 20:45:48
54
转载 Windows 小记 1 -- 判断系统进程
4)对于 LOCAL SERVICE 和 NETWORK SERVICE 的进程,一般是 svchost.exe 进程,他是一个容器进程,需要获取其服务信息或者装载的模块信息(模块才是真正的判定指标)2)枚举进程的会话号,会话号为 0 的可能为系统进程(这包括了所有 SYSTEM 用户组、LOCAL SERVICE 和 NETWORK SERVICE 的进程)。P.S:为什么需要第3,4步?因为会话在 0 的进程不一定是系统进程,第三方进程也可以在会话 0 创建进程,并且也可以位于 SYSTEM 用户组。
2024-11-15 20:30:27
71
原创 PE 自身数据写入
有时候需要我们程序向自身写入一些数据,以便于下次运行可以直接读取。当不使用配置文件(外部存储)时,应该怎么做?原理很简单:向 PE 新增一个节,然后向这个特殊的节写入数据。这也是很多奇奇怪怪的程序会用的玩意。花了点时间写了一个例子。运行后,程序首先检查是否具有特殊节区,如果有,直接读取数据。如果没有,则执行写入逻辑“AddSection” 最后执行 CreateBatchFileToReplaceSelf 使用隐身的批处理替换自身并删除副本。
2024-10-27 18:13:34
303
原创 [Windows] 关于 WM_SETTINGCHANGE 消息封送处理
通过对 WM_SETTINGCHANGE 消息的研究,已经发现 WM_SETTINGCHANGE 消息的 lParam 一般是需要指定为一个字符串的,并且字符串代表了需要系统范围内窗口应用程序(不包括驱动程序、网络驱动程序、系统级设备驱动程序或这些系统组件的任意组合)更改的具体配置设置。其他 Shell 有关更新消息可能通过 WM_COMMAND 其他消息参数或者 WM_USER 到 WM_APP 之间的特定消息值完成。桌面:WM_COMMAND + (WPARAM)0x7402。
2024-10-23 17:50:43
296
转载 Windows 桌面窗口 Z 序移动 [测试]
Windows 桌面自定义WorkerW分层窗口脱离系统消息的使用,自定义分层窗口的部分功能,实现在桌面嵌入任意窗口。
2024-10-21 00:31:30
2045
7
固定快捷方式到开始菜单任务栏
2024-06-27
如何在 explorer 初始化时注入(Win10/11)?
2024-02-15
TA创建的收藏夹 TA关注的收藏夹
TA关注的人