zoukankan      html  css  js  c++  java
  • 基于visual c++之windows核心编程代码分析(54)实现Winlogon注入dll

    Windows Logon Process,Windows NT 用户登陆程序,管理用户登录和退出。

    该进程的正常路径应是 C:\Windows\System32 且是以 SYSTEM 用户运行.我们都知道操作系统都是基于权限,而权限都是基于用户的,而这个winlogon进程就是管理用户登入登出,是不可以被结束的。winlogon是一个父进程,大多数的进程都是winlogon的子进程,如MDM.EXE、SVCHOST.EXE、ALG.EXE等等重要的进程,换句话说没有winlogon哪来正常的操作系统,怎么能启动系统。

    为了监控winlogon进程中没有病毒,需要插入dll 进行安检。

    dll编写就不再浪费时间,

    下面我们重点实现如何插入dll.

    #include "stdafx.h"
    
    
    #ifdef _MANAGED
    #pragma managed(push, off)
    #endif
    EXTERN_C __declspec(dllexport) void install();
    EXTERN_C __declspec(dllexport) void uninstall();
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
    					 )
    {
        return TRUE;
    }
    
    #ifdef _MANAGED
    #pragma managed(pop)
    #endif
    
    void  install()
    {
    	HANDLE hToken;              // handle to process token 
    	TOKEN_PRIVILEGES tkp;       // pointer to token structure 
    	OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS, &hToken); 
    	LookupPrivilegeValue(NULL, SE_DEBUG_NAME, 
    		&tkp.Privileges[0].Luid); 
    	tkp.PrivilegeCount = 1;  // one privilege to set    
    	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
    	AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0);
    	HKEY hkey;
    	BYTE value_[MAX_PATH*2];
    	char *run="SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Notify\\winsvr";//启动项
    	HANDLE cf;	
    	RegDeleteKey(HKEY_LOCAL_MACHINE,run);//先删除
    	RegCreateKey(HKEY_LOCAL_MACHINE,run, &hkey); //自启动
    	if (!hkey)//失败
    	{
    		return;
    	}
    
    	strcpy((char*)&value_,"c:\\dll.dll");//dll路径
    	RegSetValueEx(hkey,"DLLName",0,REG_EXPAND_SZ,(PBYTE)&value_,strlen((char*)&value_));
    	strcpy((char*)&value_,"exe");//导出函数名
    	RegSetValueEx(hkey,"Logon",0,REG_SZ,(PBYTE)&value_,strlen((char*)&value_));
    
    	//让winlogon异步处理我们的程序,避免卡在那。
    	DWORD dw=1;
    	RegSetValueEx(hkey,"Asynchronous",0,REG_DWORD,(PBYTE)&dw,sizeof(dw));	
    }
    void uninstall()
    {
    	HANDLE hToken;              // handle to process token 
    	TOKEN_PRIVILEGES tkp;       // pointer to token structure 
    	OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS, &hToken); 
    	LookupPrivilegeValue(NULL, SE_DEBUG_NAME, 
    		&tkp.Privileges[0].Luid); 
    	tkp.PrivilegeCount = 1;  // one privilege to set    
    	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
    	AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0);
    	HKEY hkey;
    	BYTE value_[MAX_PATH];
    	char *run="SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Notify\\winsvr";//启动项
    	HANDLE cf;	
    	RegDeleteKey(HKEY_LOCAL_MACHINE,run);//先删除
    }


     

  • 相关阅读:
    自动刷新页面
    docker 数据卷管理
    docker container(容器)
    docker images
    docker 设计原理
    hbase数据原理及基本架构
    详谈kafka的深入浅出
    django介绍及路由系统
    mysql爱之深探测
    mysql数据库内容相关操作
  • 原文地址:https://www.cnblogs.com/new0801/p/6177771.html
Copyright © 2011-2022 走看看