1.Android开发——HOOK技术【解析】
2.Linux内核-hook系统调用
3.Pytorch hook 与 dataparallel 使用—— deoldify 源码解析 part1
4.C# Hook原理及EasyHook简易教程
5.什么是修改修改新编hook技术
6.jnihookåç
Android开发——HOOK技术【解析】
Android 开发中,Hook 技术犹如一个灵活的源码源码译方译「钩子」,能够在事件传递的后编流程中插入自定义处理。系统通过事件分发机制运作,式重而 Hook 则能监控并影响这个流程。修改修改新编API Hook 技术允许我们改变 API 的源码源码译方译神庄跟踪源码执行路径,尽管Android的后编沙箱机制限制了直接修改其他程序,但Hook技术为我们提供了解决方案。式重Hook的修改修改新编应用广泛,开发者可以用来记录执行日志,源码源码译方译防止重复启动,后编而恶意者则可能利用它拦截用户输入获取敏感信息。式重
实战中,修改修改新编假设我们需要在不改动现有点击事件的源码源码译方译前提下,为某个 View 添加额外逻辑。后编首先,确定要 Hook 的对象,如View的OnClickListener。通过追踪源码,发现OnClickListener被ListenerInfo持有。接下来,创建一个代理类,天泽源码实现OnClickListener接口,确保保留原有逻辑。然后,使用反射将代理对象替换掉原始的ListenerInfo,实现 Hook 目标。具体代码中,代理类的使用展示了 Hook 的过程。
Android Hook技术的实现方式主要有两种,它在调试和优化应用时扮演了重要角色。深入理解 Hook,可以参考《Android核心技术手册》等权威资料。通过 Hook,开发者可以巧妙地调整应用行为,但同时也需注意潜在的安全风险。
Linux内核-hook系统调用
内核符号表的修改是实现系统调用劫持的关键。系统调用通过触发0x软中断并跳转到system_call()函数来执行,该函数根据系统调用号跳转到内核函数的入口地址。修改内核符号表,使其跳转到自定义函数,即实现了系统调用劫持。
获取系统调用表是箭头ea源码hook系统调用的第一步。以下是几种获取系统调用表地址的方法:
(1)调用内核导出函数kallsyms_lookup_name获取
(2)读取system.map文件获取
(3)从PAGE_OFFSET开始遍历查找__NR_close系统调用首地址
(注:PAGE_OFFSET为内核空间与用户空间的分界地址,不同体系结构有所不同。)
获取系统调用表后,可以将系统调用替换为自定义接口。以下以sys_open为例,展示拦截系统调用的内核模块代码编写过程:
(1)找到sys_open的声明(在内核源代码路径下)
(2)在hook.h文件中声明要hook的系统调用函数指针和自定义的替换系统调用函数
(3)获取系统调用表地址
(4)获取sys_open指针,将其指向自定义的open函数
在修改系统调用表指向时,需先关闭内核写保护机制,修改完毕后重新启用。
x_ CPU中,控制寄存器的bit控制写保护标志。通过内核提供的接口或内联汇编代码修改bit标志。
(5)实现myhook_open函数
(6)卸载模块时,还原系统调用指向
(7)编写Makefile文件,编译代码
6、加载模块及日志打印
ending!!!
以上是hook系统调用sys_open的讲解,其他系统调用的hook方法类似。
Pytorch hook 与 dataparallel 使用—— deoldify 源码解析 part1
在调整项目deoldify从单GPU到多GPU训练时,遭遇了一系列问题,促使我对PyTorch的理解进一步加深。项目中的wifi 雷达 源码Unet结构在上采样过程中使用了skip connection,通常做法是硬编码实现,这种方式简洁明了,但若需要改变网络结构,如从resnet调整为resnet,这样的硬编码方式显然不够灵活。
deoldify采取了另一种方法,在需要保存输出的网络层中插入自定义的hook函数,并利用PyTorch的register_forward_hook接口,确保每次前向传播时都能触发该函数,从而保存输出以供后续使用。自定义hook的核心代码展示了这一过程。
在单GPU训练中,上述方法运行正常,然而在多GPU环境下,遇到了hook存储的值与concat操作的权重不在同一GPU设备上的问题,引发错误。起初,我误以为nn.DataParallel会自动处理这个问题,但事实并非如此,我开始了深入的debug之旅。
首先,朝夕教育源码成功复现了错误现象,发现存储在hook中的值分布不均,部分在GPU1上,其他在GPU0上。这表明nn.DataParallel并没有将hook备份并分发到每个GPU上,而是多个GPU共享同一个Hooks类及接口。进一步检查发现,不同线程对应的hook接口及存储值的内存地址相同,这证实了hook并不适用于多GPU运行环境。
为解决这一问题,参考了相关文献,并将hook接口进行了修改,引入当前线程ID作为键,值对应输出,从而实现了线程安全。这一调整使得程序在第一个迭代周期正常运行。值得注意的是,第二个迭代周期又出现了问题,但这与hook的多线程运行无关,详情请见后续文章。
在debug过程中,为了简化操作,插入打印信息来观察多线程运行情况。然而,在获取hook中多线程运行信息时,遇到了异常,因获取`self.stored[key]`时报出`dict找不到key`的错误,这是因为多线程在写入`hook.stored`时,for循环期间警告`self.stored`的大小发生变化,这表明发生了并发错误,部分值并未正确写入。最终,删除了打印代码,程序恢复正常运行。
本次经历不仅解决了多GPU环境下hook使用的问题,也加深了我对PyTorch多GPU运行机制的理解,特别是关于线程安全和并发操作的注意事项。
C# Hook原理及EasyHook简易教程
C#通过调用Windows API和利用EasyHook库,实现了对Windows平台消息处理机制的扩展,允许开发者拦截和处理特定窗口的消息。下面是一个直观的教程,展示如何在C#中利用EasyHook进行Hook操作。
C#中,尽管不能直接操作内存,但可通过调用Windows API来实现Hook功能。例如,通过SetWindowsHookEx、UnhookWindowsHookEx和CallNextHookEx等函数,安装、执行和卸载Hook子程,从而在消息到达目标窗口处理函数前进行拦截。
使用EasyHook,开发者可以绕过C#对Windows API操作的限制。首先,创建一个WinForm项目,引用EasyHook库。在主窗体中,通过获取进程ID,判断系统位数,然后将自定义DLL注册到GAC以便在目标进程中调用。接着,使用EasyHook的RemoteHooking.Inject方法注入DLL,定义Hook函数,如修改MessageBox的内容和标题。
在实际操作中,通过LocalHook函数获取MessageBox的地址并创建本地钩子,Hook成功后,原有的MessageBox功能会被修改。EasyHook的易用性和跨平台支持,使得C# Hook变得更为可行和便捷。
虽然EasyHook提供了便利,但中文资料相对匮乏,学习过程中可能存在挑战。作者鼓励大家共同探讨和分享Hook经验,如果有任何疑问或建议,可以在评论区交流。源代码和更多详细教程可参考作者的博客文章:C# Hook原理及EasyHook简易教程 - Wackysoft - 博客园。
什么是hook技术
Hook技术是一种软件开发中的调试和修改技术。 Hook技术是一种允许开发者在软件运行期间修改其行为或者监视其运行的技术。在计算机科学中,Hook通常指的是一种函数或者过程,这个过程会在特定的程序事件发生时被自动调用。例如,当一个软件试图访问网络资源,或者调用某个特定的函数时,Hook技术可以拦截这些事件,允许开发者介入并进行一些操作,比如调试、修改数据、改变程序的执行流程等。 详细来说,Hook技术主要有以下几个应用特点: 1. 拦截功能:Hook技术能够拦截程序中的特定事件或函数调用,例如系统API的调用。通过这种方式,开发者可以在事件发生时获取到相关信息,或者改变事件的执行结果。 2. 调试和修改:通过Hook技术,开发者可以在程序运行时进行实时的调试和修改。这对于软件开发过程中的错误排查、性能优化以及新功能测试等场景非常有用。 3. 扩展功能:除了调试和修改,Hook技术还可以用于扩展软件的功能。例如,通过Hook某些事件,开发者可以添加新的功能或者修改现有功能的行为。 在具体实现上,Hook技术可以通过修改程序的源代码、使用第三方库或者操作系统提供的接口等方式来实现。不同的Hook技术适用于不同的场景,开发者需要根据具体的需求选择合适的Hook方法。 需要注意的是,虽然Hook技术在软件开发中有很多应用,但过度使用或者不当使用也可能带来一些问题,如性能下降、稳定性问题等。因此,在使用Hook技术时,开发者需要谨慎考虑其影响并合理使用。jnihookåç
jnihookæ¯ä¸ç§éè¿ä¿®æ¹Java Native Interface (JNI)æ¥å®ç°å¯¹Androidåºç¨ç¨åºçå¨æä¿®æ¹åæ§å¶çææ¯ãJNIæ¯Javaåæ¬å°ä»£ç ï¼é常æ¯C/C++ï¼ä¹é´çæ¡¥æ¢ï¼å®å 许å¨Java代ç ä¸è°ç¨æ¬å°ä»£ç ï¼å¹¶å®ç°Javaä¸åºå±æä½ç³»ç»æ硬件ç交äºã
jnihookçåçæ¯éè¿ä¿®æ¹JNIå½æ°è¡¨ï¼å称为å½æ°æé表ï¼ä¸çå½æ°æéæ¥å®ç°å¯¹ç®æ å½æ°çæ¿æ¢ãå½æ°è¡¨æ¯ä¸ä¸ªåå¨JNIå½æ°æéçæ°æ®ç»æï¼å®å°Javaæ¹æ³ååºå±å®ç°çæ¬å°æ¹æ³å¯¹åºèµ·æ¥ãéè¿ä¿®æ¹å½æ°è¡¨ä¸çå½æ°æéï¼å¯ä»¥å°ç®æ å½æ°çè°ç¨éå®åå°èªå®ä¹çå½æ°æè Hookå½æ°ï¼ä»èå®ç°å¯¹ç®æ å½æ°çä¿®æ¹ææ§å¶ã
jnihookçåå æ¯ä¸ºäºå®ç°ä¸äºç¹å®çç®çï¼æ¯å¦å®ç°åºç¨ç¨åºçéåå·¥ç¨ãç ´è§£ãè°è¯ãHookæ¡æ¶çãå®å¯ä»¥ç¨æ¥ä¿®æ¹åºç¨ç¨åºçè¡ä¸ºï¼çªç ´åæçéå¶ï¼å®ç°èªå®ä¹çåè½æè ç»è¿æäºå®å ¨æ£æµãåæ¶ï¼jnihookä¹ä¸ºå¼å人åæä¾äºä¸ç§è°è¯ååæåºç¨ç¨åºçæ段ï¼å¸®å©ä»ä»¬ç解åºç¨ç¨åºçå·¥ä½åçåå é¨æºå¶ã
ç¶èï¼éè¦æ³¨æçæ¯ï¼jnihookææ¯å¨ä¸äºæ åµä¸å¯è½ä¼è¢«æ»¥ç¨ï¼æ¯å¦ç¨äºéæ³éåå·¥ç¨ãç ´è§£çççæ´»å¨ï¼ä»èä¾µç¯äºè½¯ä»¶çç¥è¯äº§æååæ³æçãå æ¤ï¼å¨ä½¿ç¨jnihookææ¯æ¶ï¼éè¦éµå®æ³å¾æ³è§ï¼å¹¶å°é软件å¼åè çæçãåæ¶ï¼å¼åè ä¹åºè¯¥å¢å¼ºåºç¨ç¨åºçå®å ¨æ§ï¼é²æ¢è¢«æ¶æçjnihookæ»å»ã