• windows 各种inject/hook学习材料(自用)


    1,https://www.freesion.com/article/39911454630/

       主要介绍四种常见的 Windows DLL 注入技术。

        分别为全局钩子、远线程钩子、突破 SESSION 0 隔离的远线程注入和 APC 注入。

       有代码段。

    2,https://oyeah.blog.csdn.net/article/details/120265888

      介绍了十种dll注入方式,配有文字说明和图片,没有代码。

    https://github.com/suvllian/process-inject

          有文字说明,有完整代码。

    https://blog.csdn.net/CodeBowl/article/details/120171458  

         hook介绍

    5,https://github.com/EasyHook/EasyHook 

         hook 库

    6,https://github.com/TsudaKageyu/minhook

    关于注入的监控与防护

         注入操作,简单来说就是,将本来不属于该进程的代码强行写入该进程的内存空间,并执行。首先,进程句柄的权限控制,一旦获得了进程的内存空间读写权限就可以往进程中写入任意数据。 其次,是可执行代码完整性检查,检测非法模块或可执行内存块。

    关于反射式注入(ReflectiveInject)原理及使用

          以dll注入为例,相较于创建远程线程,然后直接调用LoadLibrary来加载dll实现注入;反射式注入也是通过创建远程线程,只是后半部分有差异;反射式注入的dll需要在dll中提供一个接口函数(导出或者不导出)被 远程线程调用,这个函数实现的功能相当于LoadLibrary。反射式注入的好处是实现了无文件注入,操作都是在内存中完成,可以在一定的程度上避免被拦截。

    关于远程线程创建

      通常使用CreateRemoteThread来创建远程线程来执行在另一个进程空间里面的代码,通过创建线程通知函数(PsSetCreateThreadNotifyRoutine)可以发现系统运行时会有大量的远程线程被创建。首先,当一个进程被创建时,该进程的第一个线程是被其父进程创建的;其次,一个进程可以通过CreateRemoteThread api在某个进程中创建线程。 下面是CreateThreadNotifyRoutine的代码:

    1. NTSTATUS MonitorRemoteThread(HANDLE ProcessId, HANDLE ThreadId,BOOLEAN Create)
    2. {
    3. NTSTATUS status = STATUS_SUCCESS;
    4. PKTHREAD Thread = NULL;
    5. PEPROCESS Process = NULL;
    6. HANDLE ParentPid = NULL;
    7. //线程创建通知函数是在执行创建线程的进程上下文下触发的
    8. //PsGetCurrentProcessId()在ProcessId进程中创建了线程ThreadId
    9. HANDLE CreatingProcess=PsGetCurrentProcessId();
    10. if (Create == TRUE&&
    11. CreatingProcess>(HANDLE)4)
    12. {
    13. if (ProcessId && ThreadId)
    14. {
    15. status = PsLookupThreadByThreadId(ThreadId, &Thread);
    16. if (NT_SUCCESS(status))
    17. {
    18. Process = IoThreadToProcess(Thread);
    19. if (Process)
    20. {
    21. //获取父进程pid
    22. ParentPid=PsGetProcessInheritedFromUniqueProcessId(Process);
    23. if (CreatingProcess!=ParentPid&&
    24. CreatingProcess!=ProcessId)//排除本地线程创建
    25. {
    26. DbgPrint("[%s]pid:%d create a suspicious remote thread %d in pid:%d\n",
    27. __FUNCTION__,
    28. CreatingProcess,
    29. ThreadId,
    30. ProcessId);
    31. }
    32. }
    33. //else
    34. //{
    35. // DbgPrint("[%s] IoThreadToProcess fails!\n", __FUNCTION__);
    36. //}
    37. }
    38. else
    39. {
    40. DbgPrint("[%s]PsLookupThreadByThreadId fails,status:0x%x\n", __FUNCTION__, status);
    41. }
    42. }
    43. }
    44. if (Thread)
    45. {
    46. ObDereferenceObject(Thread);
    47. }
    48. return status;
    49. }

    运行效果如下图:

     

  • 相关阅读:
    【Java初阶】面向对象三大特性之继承
    「零基础从零开始写VO视觉里程计」概率论、最小二乘、图优化(7-4)
    vue3 - swiper插件 实现PC端的 视频滑动功能(仿抖音短视频)
    JAVA开发管理(比敏捷更快的DevOps)
    09.selenium入门
    从0开始读C++Primer|第一章 开始
    Mysql Explain
    全局vue2下安装vue3遇到的问题
    使用spark-sql处理Doris大表关联
    Swagger2 总结
  • 原文地址:https://blog.csdn.net/pureman_mega/article/details/128129136