中转inline hook,不需要恢复首字节的hook

2023-11-20

分类: HOOK 2015-02-23 23:38  446人阅读  评论(1)  收藏  举报

注:我实验的环境:win7 x64

经验证XP会有稍微区别,主要是我本次实验HOOK的API, 从XP到WIN7微软有了些许改变。

----------------------------------------------------------------------------------------------------------------------------------------

最近在看驱动教程时,从前人的HOOK得到启发,才有了本篇文章,在此甚是感激。

文章估计有些长,当是我的学习笔记了,适合有一定HOOK基础的盆友,

我写这篇文章的目的就是为了提高HOOK的效率。

本次我以HOOK GetProcAddress为例。

例子VS2010工程HookGetProcAddressTest.rar下载地址:

http://download.csdn.net/detail/friendan/8454859

--------------------------------------------------------------------------------------------------------------------------------

问题的提出:

以前我们HOOK时,第一步就是定义我们自己假的API了,如:

  1. FARPROC WINAPI MyGetProcAddress(  
  2.     __in HMODULE hModule,  
  3.     __in LPCSTR lpProcName  
  4.     );  

在我们假的API中,一般做法如下:

  1. FARPROC WINAPI MyGetProcAddress(__in HMODULE hModule, __in LPCSTR lpProcName)  
  2. {  
  3.     // 1.记录参数  
  4.     // 2.修改参数  
  5.     // 3.修改返回值  
  6.     // 4.恢复HOOK,调用原函数,然后再HOOK  
  7.     // ...  
  8. }  

问题就出在第4步了,如果是多线程的环境,在恢复HOOK时,我们可能会漏HOOK

-----------------------------------------------------------------------------------------------------------------------------------------------------

问题的解决:

       为了不恢复HOOK,也能调用原API,我加了一个中转函数,该函数没有参数,也没有返回值,

没有参数和没有返回值是为了保持堆栈的平衡,该函数声明如下:

  1. void GetProcAddressProxy(void);  

实现如下:

  1. __declspec(nakedvoid GetProcAddressProxy(void)  
  2. {  
  3.     // 先执行原来的代码,再跳到原地址+5处执行  
  4.     __asm  
  5.     {  
  6.         // 原函数入口代码  
  7.         mov edi,edi  
  8.         push ebp  
  9.         mov ebp,esp  
  10.   
  11.         // 调用我们的过滤函数  
  12.         push [ebp+0xC]  // 参数lpProcName  
  13.         push [ebp+0x8]  // 参数hModule  
  14.         call MyGetProcAddress  
  15.           
  16.         // 跳到原函数首地址+5处执行,因为其前面的5字节已经被我们修改了  
  17.         mov eax, g_iOldGetProcAddress  
  18.         add eax, 5  
  19.         jmp eax  
  20.     }  
  21. }  

可以看出在中转函数中调用了我们的过滤函数即假API了,本次实验,我的假API主要功能为替换参数和替换返回值,

主要代码如下:

  1. FARPROC WINAPI MyGetProcAddress(__in HMODULE hModule, __in LPCSTR lpProcName)  
  2. {  
  3.     printf("MyGetProcAddress: hModule=0x%X, lpProcName=%s \n", hModule, lpProcName);  
  4.   
  5.     // 如果是Sleep,我们将其替换成不存在的一个函数  
  6.     if (strcmp(lpProcName, "Sleep") == 0)  
  7.     {  
  8.         DisabeMemoryProtect((int)lpProcName, strlen(lpProcName));  
  9.         strcpy((char*)lpProcName, "Slee8"); // 函数名不能比原来的长哈  
  10.         EnableMemoryProtect((int)lpProcName, strlen(lpProcName));  
  11.     }  
  12.   
  13.     // 如果是要过滤的函数  
  14.     if (strcmp(lpProcName, "LoadLibraryW") == 0)  
  15.     {  
  16.         // 获取KernelBa.GetProcAddress入口地址  
  17.         // 7564122F  - FF25 280B6475   jmp dword ptr ds:[<&API-MS-Win-Core-LibraryLoader-L1-1-0.GetProcAd>; KernelBa.GetProcAddress  
  18.         // win7 64  
  19.         if (*(byte*)(g_iOldGetProcAddress+6) == 0xEB)  
  20.         {  
  21.             g_iGetProcAddressHookAddr = g_iOldGetProcAddress + 15;  
  22.             g_iGetProcAddressHookAddr = *(int*)g_iGetProcAddressHookAddr;  
  23.             g_iGetProcAddressHookAddr = *(int*)g_iGetProcAddressHookAddr;  
  24.         }  
  25.         // xp  
  26.         if (*(byte*)(g_iOldGetProcAddress+6) == 0x51)  
  27.         {  
  28.              g_iGetProcAddressHookAddr = g_iOldGetProcAddress;  
  29.         }  
  30.   
  31.         // 从函数入口寻找特征码,找到要替换的起始地址  
  32.        /*76121E83   8B45 0C         mov eax,dword ptr ss:[ebp+0xC]  ;获取到的函数地址  
  33.         76121E86    5F              pop edi 
  34.         76121E87    5B              pop ebx 
  35.         76121E88    C9              leave 
  36.         76121E89 >  C2 0800         retn 0x8 ; 返回用户层 
  37.         76121E8C    CC              int3 
  38.         76121E8D    CC              int3 
  39.         76121E8E    CC              int3 
  40.         76121E8F    CC              int3 
  41.         76121E90    CC              int3*/  
  42.         byte bSpecialCode[9] = {0x8B, 0x45, 0x0C, 0x5F, 0x5B, 0xC9, 0xC2, 0x08, 0x00};  
  43.         g_iGetProcAddressHookAddr = FindSpecialCode(g_iGetProcAddressHookAddr, bSpecialCode, sizeof(bSpecialCode));  
  44.         if (g_iGetProcAddressHookAddr <= 0)  
  45.         {  
  46.             return 0;  
  47.         }  
  48.         //ShowMemoryData(g_iGetProcAddressHookAddr, 14);  
  49.   
  50.         // 旧函数的尾部代码  
  51.         byte bOldCode[14] = {0x8B, 0x45, 0x0C, 0x5F, 0x5B, 0xC9, 0xC2, 0x08, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC};  
  52.   
  53.         // 替换原来的0x8B, 0x45, 0x0C,即替换mov eax,dword ptr ss:[ebp+0xC]  
  54.         // 76071242    B8 78563412     mov eax,0x12345678  
  55.         byte bNewCode[11] = {0xB8, 0x90, 0x90, 0x90, 0x90, 0x5F, 0x5B, 0xC9, 0xC2, 0x08, 0x00};   
  56.   
  57.         DisabeMemoryProtect(g_iGetProcAddressHookAddr, sizeof(bNewCode));  
  58.         memcpy((void*)g_iGetProcAddressHookAddr, bNewCode, sizeof(bNewCode));  
  59.         *(int*)(g_iGetProcAddressHookAddr + 1) = (int)LoadLibraryI;     // 将4个0x90替换成我们的函数地址  
  60.         g_bIsModifyGetProcAddressHookAddr = true;  
  61.         EnableMemoryProtect(g_iGetProcAddressHookAddr, sizeof(bNewCode));  
  62.        // ShowMemoryData(g_iGetProcAddressHookAddr, 14);  
  63.     }  
  64.     else  
  65.     {  
  66.         // 恢复被我们修改过的指令  
  67.         // 旧函数的尾部代码  
  68.         byte bOldCode[14] = {0x8B, 0x45, 0x0C, 0x5F, 0x5B, 0xC9, 0xC2, 0x08, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC};  
  69.         if (g_bIsModifyGetProcAddressHookAddr)  
  70.         {  
  71.             DisabeMemoryProtect(g_iGetProcAddressHookAddr, sizeof(bOldCode));  
  72.             memcpy((void*)(g_iGetProcAddressHookAddr), bOldCode, sizeof(bOldCode));  
  73.             g_bIsModifyGetProcAddressHookAddr = false;  
  74.             EnableMemoryProtect(g_iGetProcAddressHookAddr, sizeof(bOldCode));  
  75.         }  
  76.     }  
  77.       
  78.     return 0;  
  79. }  

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

在HOOK时,我们让原API跳到我们的中转函数即可,我HOOK的实现代码如下:

  1. void HookGetProcAddress(bool bIsHook)  
  2. {  
  3.     // 为方便OD调试,加入的特征码  
  4.     __asm  
  5.     {  
  6.         mov eax, eax  
  7.         mov ebx, ebx  
  8.         mov ecx, ecx  
  9.     }  
  10.   
  11.     // HOOK GetProcAddress  
  12.     if (bIsHook)  
  13.     {  
  14.         // 取GetProcAddress地址  
  15.         g_iOldGetProcAddress = (int)GetProcAddress(LoadLibrary(_T("Kernel32.dll")), "GetProcAddress");  
  16.         if (g_iOldGetProcAddress <= 0)  
  17.         {  
  18.             return;  
  19.         }  
  20.   
  21.         // 修改函数前5个字节,使其跳到我们的函数GetProcAddressProxy  
  22.         DisabeMemoryProtect(g_iOldGetProcAddress, 5);  
  23.         int iJmpAddr = (int)GetProcAddressProxy - g_iOldGetProcAddress - 5;  
  24.         *(byte *)g_iOldGetProcAddress = 0xE9; // jmp  
  25.         *(int *)(g_iOldGetProcAddress + 1) = iJmpAddr;   
  26.         EnableMemoryProtect(g_iOldGetProcAddress, 5);  
  27.     }  
  28.   
  29.     // UNHOOK GetProcAddress  
  30.     if (!bIsHook && g_iOldGetProcAddress > 0)  
  31.     {  
  32.         // 恢复函数前5个字节  
  33.         // 8B FF 55 8B EC  
  34.         byte bBeginCode[5] = {0x8B,0xFF, 0x55, 0x8B, 0xEC};  
  35.         DisabeMemoryProtect(g_iOldGetProcAddress, sizeof(bBeginCode));  
  36.         memcpy((void*)g_iOldGetProcAddress, bBeginCode, sizeof(bBeginCode));  
  37.         EnableMemoryProtect(g_iOldGetProcAddress, sizeof(bBeginCode));  
  38.   
  39.         // 恢复被我们修改过的指令  
  40.         // 旧函数的尾部代码  
  41.         byte bOldCode[14] = {0x8B, 0x45, 0x0C, 0x5F, 0x5B, 0xC9, 0xC2, 0x08, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC};  
  42.         if (g_bIsModifyGetProcAddressHookAddr)  
  43.         {  
  44.             DisabeMemoryProtect(g_iGetProcAddressHookAddr, sizeof(bOldCode));  
  45.             memcpy((void*)(g_iGetProcAddressHookAddr), bOldCode, sizeof(bOldCode));  
  46.             g_bIsModifyGetProcAddressHookAddr = false;  
  47.             EnableMemoryProtect(g_iGetProcAddressHookAddr, sizeof(bOldCode));  
  48.         }  
  49.     }  
  50. }  

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------


效果截图如下:


-------------------------------------------------------------------------------------------------------------------------------------------------

帖下我在WIN7 X64使用OD得出GetProcAddress的反汇编代码:

// bp Kernel32.GetProcAddress
75641222 >  8BFF            mov edi,edi     ; GetProcAddresss入口
75641224    55              push ebp
75641225    8BEC            mov ebp,esp
75641227    5D              pop ebp
75641228    EB 05           jmp X<jmp.&API-MS-Win-Core-LibraryLoader-L1-1-0.GetProcAddress>
7564122A    90              nop
7564122B    90              nop
7564122C    90              nop
7564122D    90              nop
7564122E    90              nop
7564122F  - FF25 280B6475   jmp dword ptr ds:[<&API-MS-Win-Core-LibraryLoader-L1-1-0.GetProcAd>; KernelBa.GetProcAddress
75641235    90              nop
75641236    90              nop

76121E15 >  8BFF            mov edi,edi ; KernelBa.GetProcAddress入口地址
76121E17    55              push ebp
76121E18    8BEC            mov ebp,esp
76121E1A    51              push ecx
76121E1B    51              push ecx
76121E1C    53              push ebx
76121E1D    57              push edi
76121E1E    8B7D 0C         mov edi,dword ptr ss:[ebp+0xC]
76121E21    BB FFFF0000     mov ebx,0xFFFF
76121E26    3BFB            cmp edi,ebx
76121E28    76 17           jbe XKernelBa.76121E41
76121E2A    57              push edi
76121E2B    8D45 F8         lea eax,dword ptr ss:[ebp-0x8]
76121E2E    50              push eax
76121E2F    FF15 AC121176   call dword ptr ds:[<&ntdll.RtlInitString>]                         ; ntdll_1a.RtlInitString
76121E35    8D45 0C         lea eax,dword ptr ss:[ebp+0xC]
76121E38    50              push eax
76121E39    6A 00           push 0x0
76121E3B    8D45 F8         lea eax,dword ptr ss:[ebp-0x8]
76121E3E    50              push eax
76121E3F    EB 07           jmp XKernelBa.76121E48
76121E41    8D45 0C         lea eax,dword ptr ss:[ebp+0xC]
76121E44    50              push eax
76121E45    57              push edi
76121E46    6A 00           push 0x0
76121E48    6A 00           push 0x0
76121E4A    FF75 08         push dword ptr ss:[ebp+0x8]
76121E4D    E8 C05E0200     call KernelBa.76147D12
76121E52    50              push eax
76121E53    FF15 A8121176   call dword ptr ds:[<&ntdll.LdrGetProcedureAddress>]                ; ntdll_1a.LdrGetProcedureAddress
76121E59    85C0            test eax,eax
76121E5B    7D 0A           jge XKernelBa.76121E67
76121E5D    50              push eax
76121E5E    E8 1F590200     call KernelBa.76147782
76121E63    33C0            xor eax,eax
76121E65    EB 1F           jmp XKernelBa.76121E86
76121E67    6A 00           push 0x0
76121E69    FF75 08         push dword ptr ss:[ebp+0x8]
76121E6C    E8 A15E0200     call KernelBa.76147D12
76121E71    3945 0C         cmp dword ptr ss:[ebp+0xC],eax
76121E74    75 0D           jnz XKernelBa.76121E83
76121E76    3BDF            cmp ebx,edi
76121E78    1BC0            sbb eax,eax
76121E7A    F7D8            neg eax
76121E7C    05 380100C0     add eax,0xC0000138
76121E81  ^ EB DA           jmp XKernelBa.76121E5D
76121E83    8B45 0C         mov eax,dword ptr ss:[ebp+0xC];获取到的函数地址
76121E86    5F              pop edi
76121E87    5B              pop ebx
76121E88    C9              leave
76121E89 >  C2 0800         retn 0x8 ; 返回用户层
76121E8C    CC              int3
76121E8D    CC              int3
76121E8E    CC              int3
76121E8F    CC              int3
76121E90    CC              int3
---------------------------------------------------------------------------------------------------------------------------------------------

帖下我在XP使用OD得出GetProcAddress的反汇编代码:
7C80AE40 >  8BFF            MOV     EDI, EDI                         ; kernel32.7C800000
7C80AE42    55              PUSH    EBP
7C80AE43    8BEC            MOV     EBP, ESP
7C80AE45    51              PUSH    ECX
7C80AE46    51              PUSH    ECX
7C80AE47    53              PUSH    EBX
7C80AE48    57              PUSH    EDI
7C80AE49    8B7D 0C         MOV     EDI, DWORD PTR SS:[EBP+0xC]
7C80AE4C    BB FFFF0000     MOV     EBX, 0xFFFF
7C80AE51    3BFB            CMP     EDI, EBX
7C80AE53  ^ 0F86 D1F2FFFF   JBE     kernel32.7C80A12A
7C80AE59    57              PUSH    EDI
7C80AE5A    8D45 F8         LEA     EAX, DWORD PTR SS:[EBP-0x8]
7C80AE5D    50              PUSH    EAX
7C80AE5E    FF15 9412807C   CALL    NEAR DWORD PTR DS:[<&ntdll.RtlIn>; ntdll.RtlInitString
7C80AE64    8D45 0C         LEA     EAX, DWORD PTR SS:[EBP+0xC]
7C80AE67    50              PUSH    EAX
7C80AE68    6A 00           PUSH    0x0
7C80AE6A    8D45 F8         LEA     EAX, DWORD PTR SS:[EBP-0x8]
7C80AE6D    50              PUSH    EAX
7C80AE6E    6A 00           PUSH    0x0
7C80AE70    FF75 08         PUSH    DWORD PTR SS:[EBP+0x8]
7C80AE73    E8 1CEBFFFF     CALL    kernel32.7C809994
7C80AE78    50              PUSH    EAX
7C80AE79    E8 B7FFFFFF     CALL    <JMP.&ntdll.LdrGetProcedureAddre>
7C80AE7E    85C0            TEST    EAX, EAX
7C80AE80    0F8C F6840000   JL      kernel32.7C81337C
7C80AE86    6A 00           PUSH    0x0
7C80AE88    FF75 08         PUSH    DWORD PTR SS:[EBP+0x8]
7C80AE8B    E8 04EBFFFF     CALL    kernel32.7C809994
7C80AE90    3945 0C         CMP     DWORD PTR SS:[EBP+0xC], EAX
7C80AE93    0F84 B65F0300   JE      kernel32.7C840E4F
7C80AE99    8B45 0C         MOV     EAX, DWORD PTR SS:[EBP+0xC]
7C80AE9C    5F              POP     EDI
7C80AE9D    5B              POP     EBX
7C80AE9E    C9              LEAVE
7C80AE9F    C2 0800         RETN    0x8 ; 函数之后的数据和WIN7不一样
7C80AEA2    837D 10 00      CMP     DWORD PTR SS:[EBP+0x10], 0x0
7C80AEA6  ^ 0F85 07E5FFFF   JNZ     kernel32.7C8093B3
7C80AEAC    33FF            XOR     EDI, EDI
7C80AEAE  ^ E9 07E5FFFF     JMP     kernel32.7C8093BA

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

中转inline hook,不需要恢复首字节的hook 的相关文章

  • Cucumber-jvm @after 与 Appium 驱动程序

    我在用着cucumber jvm 并努力在全球范围内实施 After应该执行的方法只有一次所有场景执行完成后 这 After方法应该退出appium驱动程序 现在 After钩子在之后执行each运行场景 这意味着每次都应该从头开始创建驱动
  • 如何对位于 GIthub 中的存储库实施编码标准

    我们在 Github 上有一个帐户 并在 Github 私有存储库 中托管我们的所有项目 我们希望强制执行编码标准以及可能用于内部目的的其他挂钩 我们已经让这些钩子在颠覆方面工作得很好 因为存储库位于一个地方 管理这些钩子非常好 使用 Gi
  • 在 notepad.exe 中挂钩 CreateFile 不会捕获 API 调用

    我的最终目标是通过在 kernel32 dll 中挂钩文件 api 来跟踪 explorer exe 完成的文件操作 但是我尚未实现该操作 explorer exe 没有调用 API 或者我这边出了问题 为了弄清楚发生了什么 我设置了一个目
  • 监控应用程序对 DLL 的调用

    简而言之 我想监视从应用程序到 DLL 的选定调用 我们有一个旧的 VB6 应用程序 我们丢失了它的源代码 当时公司没有使用源代码控制 此应用程序使用第 3 方 DLL 我想在新的 C 应用程序中使用这个 DLL 不幸的是 DLL API
  • Detours - 挂钩类成员函数 - 设置目标函数偏移量的语法?

    对于非类函数 我可以简单地声明要绕行的函数的偏移量 如下所示 typedef int cdecl SomeFunc char pBuffer int size SomeFunc Real SomeFunc SomeFunc 0xCAFEBA
  • 服务器上的自动化 django 接收钩子:用“yes”响应collectstatic

    我正在使用 Github post recieve hook 来运行一个 bash 文件来提取我的两个存储库 bin sh cd public html repo static env i usr bin git pull origin m
  • 是否可以接受用户输入作为远程 git post-receive 挂钩的一部分?

    我有一个接收后钩子 每当我们推送主分支时 它就会部署我们的主分支 我想让部署成为可选的 该钩子要求简单的 Y N 响应来实现此目的 bash伪代码如下 echo Should I deploy this code now Enter Y N
  • WordPress 添加新的用户挂钩

    我想添加一些自定义字段以在 Wordpress 中添加新用户 我正在使用以下钩子 show user profile edit user profile 这些挂钩在编辑个人资料页面上显示新的自定义字段 但我希望新的自定义字段显示在 添加新用
  • gitolite hooks - 接收后似乎不起作用

    我在我的仓库中配置了 gitolite 我看到了 gitolite 文献中记录的 2 个钩子副本 我希望服务器端挂钩 post receive 在有人推送到存储库时发送电子邮件 我正在使用 git notifier 但是 当我推动时什么也没
  • 提交颠覆时可以修改文本文件吗?

    我想在正在提交的文本文件上运行以下脚本 Send the commands H and w to ed ed will append newline if the file does not end in one printf s n H
  • WordPress 预览_帖子_链接

    我试图在 WordPress 上发布时更改默认的 预览帖子 按钮 因为该网站安装了被黑客入侵的 WordPress 并且帖子预览不在应有的位置 我找到了钩子preview post link现在我只是想弄清楚如何制作一个小插件来解决这个问题
  • BitBucket WebHook 詹金斯

    我想配置 bitbucket 来触发 jenkins 构建 我花了一些时间研究这个问题 所有答案都来自几年前 但没有找到任何指南 因为从那以后事情似乎发生了变化 我正在尝试做的事情 将位桶推送到特定分支会触发构建 我有什么 Bitbucke
  • “安全”DLL 注入

    抱歉 这不是一个很好的问题 我有一个程序 当从资源管理器打开文件时需要发出警报 即调用 ShellExecute A W 不幸的是 微软删除了允许您在 Vista 及更高版本中挂钩这些事件的 COM 接口 IShellExecuteHook
  • PyInstaller 2.1导入自定义包

    我有一个脚本正在尝试使用 Python 2 7 使用 PyInstaller 2 1 进行编译 该脚本使用我编写的名为 auto common 的自定义包 在脚本中 我使用以下命令导入它 sys path append path to pa
  • Git commit hook - 如何使用 commit-msg 挂钩检查消息中的字符串?

    我需要创建一个 commit msg 挂钩来检查提交消息的任何部分是否包含 app asana 我搜索了一些参考资料和文档 我知道我需要为此使用 commit msg 我必须使用 Perl 或 Bash 来完成此操作 有人对此有线索吗 或者
  • 无法从 Git post-receive hook 检测分支

    我在远程存储库上设置了一个后接收挂钩 它尝试确定传入推送的分支名称 如下所示 branch git rev parse abbrev ref HEAD 不过 我发现无论我从 branch 变量推送哪个分支 都会设置为 master 有任何想
  • WordPress 使用 GD 图像引擎以编程方式将图像转换为 WebP 格式

    有许多 PHP 解决方案和 WP 插件 它们都带有我不想要 不需要的附加选项 即如何提供转换后的文件 存储它们的位置等 我不需要所有这些 并且正在寻找使用 GD 的纯简单代码 我不想使用插件 谢谢 编码应该什么时候发生 任何时候你知道这是钩
  • 用于阻止大于 20MB 的提交的预提交挂钩

    是否可以为 SVN 1 8 编写 prcommit 挂钩以避免提交大于 20MB 的文件 任何建议 将不胜感激 谢谢 我尝试过 但这不适用于二进制文件或其他文件扩展名 filesize SVNLOOK cat t TXN REPOS f w
  • Android应用程序:java / JNI调用挂钩策略

    我的目标是检测 AOSP 以便动态记录来自目标应用程序的所有 java 或 JNI 调用 带或不带参数和返回值 我不想修改应用程序 这就是我想要修改 Android 源代码的原因 我对 AOSP 及其众多库和框架不是很有经验 所以我正在寻求
  • 低级挂钩/SetWindowsHookEx lParam 自动重复?

    在这里阅读 Windows PC 上如何实现键盘自动重复 https stackoverflow com questions 876852 how is keyboard auto repeat implemented on a windo

随机推荐

  • java连接sqlserver2005 tcp 有时超时,SQL Server 2005 出现到主机 的 TCP/IP 连接失败

    用jdbc连接SQL Server2005出现到主机 的 TCP IP 连接失败 java net ConnectException Connection refused connect 估计是因为sqlserver2005默认情况下是禁用
  • Elasticsearch 日志

    下载并安装 Filebeat 首次使用 Filebeat 请参阅入门指南 复制代码片段 curl L O https artifacts elastic co downloads beats filebeat filebeat 7 2 0
  • SpringBoot 整合slf4j 日志配置

    slf4j 即 Simple Logging Facade for Java 简单门面日志 它是对所有日志框架制定的一种规范 标准 接口 并不是一个框架的具体的实现 它只服务于各种各样的日志系统 slf4j提供了统一的记录日志的接口 对不同
  • OpenGL.ES在Android上的简单实践:14-全景(惯性滑动球体)

    OpenGL ES在Android上的简单实践 14 全景 惯性滑动球体 1 整理封装全景球 现在 我们的地球已经能正确的显示出来 我们来增加必要的交互 使得我们左右滑动屏幕的时候 地球能旋转起来 而且是像一个地球仪一样 手指离开屏幕后 能
  • 如何修改游戏服务器ip地址吗,怎么修改游戏服务器ip地址吗

    怎么修改游戏服务器ip地址吗 内容精选 换一换 AI视频分析服务作业的输出结果需要指定输出通道 请提前配置好输出通道DIS或者Webhook AI视频分析服务作业的结果输出类型选择为DIS时 在创建作业前 您需确保DIS通道已开通成功 开通
  • 分-布-式-缓-存-(转)

    在前面的一些文章中 从实战的角度 讲解了有关 memcached的应用 容灾 监控等等 但是缺乏对理论的讲解和原理性的剖析 本文将从理论的角度去介绍 让大家从宏观上对 分布式缓存 nosql 等技术有所了解 以便进一步学习和使用 在构建大规
  • tensorflow 激活函数relu6为什么是6

    普通relu y max 0 x 相当于无限多个bernoulli分布 即无限多个骰子 relu6 y min max 0 x 6 相当于有六个bernoulli分布 即6个硬币 同时抛出正面 这样鼓励网络学习到稀疏特征 网络里面每一个输出
  • Linux之rm命令

    rm 删除一个文件或者目录 删除文件可以直接使用rm命令 若删除目录则必须配合选项 r rm r 删除当前目录下的所有文件及目录 文件一旦删除 则无法恢复 命令参数 f 强制删除 即使不存在的文件也不会报错 i交互式删除 r列出全部目录和子
  • 全国热门带正文新闻查询API接口

    一 接口介绍 解决同一类新闻在不同平台上的内容获取问题 在归档主流新闻平台的内容数据基础上 对外提供统一的调用方式来完成实时 最新的相关新闻的获取 极大方便各类企业在自有软件中集成新闻内容的功能 支持200余个新闻大站 为保证数据的及时性
  • PID控制算法(PID控制原理与程序流程)

    PID控制算法 PID控制原理与程序流程 暗影玄极 博客园 cnblogs com
  • RFID系统组成及其功能

    RFID系统因应用不同其组成会有所不同 但基本原理都是相似的 下面我们来讨论一下射频识别的基本原理 既然是射频识别 则必然要由读写器和电子标签组成 当然 在应用中通常还包含上层的管理系统 电子标签和读写器都要装有天线 以便于通信交流 其中读
  • Scratch资料

    Scratch软件是免费的 免费的 免费的 任何需要花钱才能下载Scratch软件的全是骗子 1 什么是Scratch Scratch是麻省理工学院的 终身幼儿园团队 开发的一种图形化编程工具 是面向青少年的一款模块化 积木化 可视化的编程
  • 【RF-SSA-LSTM】随机森林-麻雀优化算法优化时间序列预测研究(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 RF特征选择 2 2 LSTM预测 2 3 SSA LSTM预测 2 4 MLP预测
  • JDK不同版本间的新特性-基础篇

    目录 一 JDK环境部署 1 1 JDK18与IDEA2022环境准备 二 JDK9 10新特性 2 1 JDK9新特性 私有接口方法 2 2 JDK9新特性 通过try块自动关闭资源 2 4 JDK10新特性 var动态类型推断 局部变量
  • LVGL V8应用——实现互斥

    按键互斥 void language setup lv obj t cont lv obj create page lv obj set size cont 320 160 lv obj t ch cb lv checkbox create
  • python项目部署nginx_Nginx Python(Django)项目部署

    CentOS 7 系统默认安装 Python 2 7 版本 本节搭建的是基于 Python3 的 Django 网站 所以需要升级到 Python3 版本 1 安装 Python 及 Django 配置样例如下 yum install y
  • kubeadm部署1.20.0版本kubernetes

    一 环境准备 1 虚拟机环境 角色 主机名 IP地址 服务组件 master master 01 192 168 43 100 comtroller manager etcd scheduler kube apiserver node no
  • 在vmware里面看不到已经设置的共享文件夹

    查看你是否设置了共享文件夹 vmware hgfsclient 在上图的虚拟机点击安装vmware tools 之后会在vmware tools文件里面有一个压缩的文件 把它复制到自己创的文件夹并解压 自己创建文件夹使用mkdir p mo
  • mysql注册服务

    当我们使用win7命令行关闭mysql服务器的时候 命令 net stop mysql 出现 服务名无效的提示 因为我们没有在win下注册该服务 注册步骤 以管理员身份运行cmd 进入到mysql的bin目录 cd bin目录 例如我的命令
  • 中转inline hook,不需要恢复首字节的hook

    中转inline hook 不需要恢复首字节的hook 分类 HOOK 2015 02 23 23 38 446人阅读 评论 1 收藏 举报 HOOK inline hook 注 我实验的环境 win7 x64 经验证XP会有稍微区别 主要