• 20145319 《网络渗透》免考—任务栏隐藏


    20145319 《网络渗透》免考—任务栏隐藏

    概述

    • 本次实验在windows环境下实现,主要通过编写窗口程序并且修改程序中showWindows函数的参数来实现该窗口程序不显示窗口外形,也不在任务栏中显示从而达到隐藏目的
    • 主要知识如下
      • c++编程(与窗口相关的api函数)
      • 其他例如字符集和编译环境的一些知识

    实验内容

    • 在实际生活中,攻击者将恶意代码植入被攻击主机中时,往往希望恶意代码能够隐藏自己,能够偷偷运行在后台中,让程序不弹出任何的窗口也不会在任务栏中现身。这就是恶意代码的任务栏隐藏,而如何实现这个功能,我们就需要从windows API中修改其中的函数参数来实现

    编程基础

    • 在本次实验中,我们需要调用windowsAPI函数,编写windows系统应用程序,而非控制台程序,因此使用入口函数winMain初始化应用程序

    • WinMain函数的原型声明如下:

        int WINAPI WinMain(
                HINSTANCE hInstance,     // handle to current instance
                HINSTANCE hPrevInstance, // handle to previous instance
                LPSTR lpCmdLine,         // command line
                int nCmdShow             // show state
        );
      
    • WinMain共四个参数,与main函数不同,这四个参数都在系统在调用函数时传给应用程序

    • hInstance:表示该程序当前运行的实例的句柄,作为一个实例的唯一标识(类似于进程和pid)。一个程序可以多个实例,但每运行一个实例就分配一个实例句柄,通过hInstance传参

    • hPrevInstance:在win32中无效,通常设为为NULL

    • lpCmdLine:传递给应用程序的一个命令行参数(类似于main函数中的argv)

    • nCmdShow:指定程序的窗口应该如何显示, 例如最大化、最小化以及我们这次要使用的隐藏等,这个可以由用户自由设定

    • 函数creatwindow函数showWindow分别是用于创建窗口、设置指定窗口显示状态的函数,我们正是通过修改这两个函数的参数来实现任务栏隐藏功能

    • 函数creatwindow的函数原型声明:

        HWND CreateWindow(
        	LPCTSTR lpClassName,
        	LPCTSTR lpWindowName,
        	DWORD dwStyle,
        	int x,
        	int y,
        	int nWidth,
        	int nHeight,
        	HWND hWndParent,
        	HMENU hMenu,
        	HANDLE hlnstance,
        	LPVOID lpParam);
      
    • lpClassName:指定窗口的类名

    • lpWindowName:窗口标题

    • dwStyle:窗口风格参数

    • x&y:分别代表了窗口初始的水平,垂直位置

    • nwidth&nHeight:窗口的宽度以及高度

    • hWndParent:被创建窗口的父窗口或者所有者窗口的句柄

    • hMenu:菜单句柄

    • hlnstance与窗口相关联的模块实例的句柄

    • lpParam

    • 函数showWindow的函数原型

        BOOL ShowWindow(HWND hWnd, int nCmdShow);
      
    • hwnd:对应窗口的句柄

    • ncmdShow:指定该窗口以何种状态显示(事实上我们正式通过修改这个参数实现了任务栏隐藏)

    • 其他类似于messagebox等函数以及方法就不再一一介绍

    • 通过查询到基本函数以及方法我们可以写一个自己的简单的窗口

        #include "stdafx.h"
        #include "windows.h"
      
        LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//声明回调函数
      
        int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
        PSTR szCmdLine, int iCmdShow){        
      
        static TCHAR szAppName[] = _T("HelloWindow");
      
        HWND  hwnd;        //用来保存成功创建窗口后返回的句柄
        MSG   msg;         //定义消息结构体变量
        WNDCLASS  wndclass;    //窗体类
      
        wndclass.style = CS_HREDRAW | CS_VREDRAW; //指定窗口风格
        wndclass.lpfnWndProc = WndProc; ////函数指针,指向处理窗口消息的函数入口
        wndclass.cbClsExtra = 0;       //结构体后附加的字节数,一般总为0
        wndclass.cbWndExtra = 0;       //窗体实例附加的字节数,一般总为0
        wndclass.hInstance = hInstance;                          //模块句柄
        wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);     //图标句柄 任务栏显示的图标
        wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);       //光标句柄
        wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景颜色COLOR_BACKGROUND
        wndclass.lpszMenuName = NULL;      //菜单名的字符串
        wndclass.lpszClassName = szAppName; //自定义类名,不要与其他类名重复
      
        if (!RegisterClass(&wndclass))
        {
        	MessageBox(NULL, TEXT("注册类失败!"), szAppName, MB_ICONERROR);
        	return 0;
        }
      
        int x = ((GetSystemMetrics(SM_CXSCREEN) / 2) - 200); //水平方向居中
        int y = ((GetSystemMetrics(SM_CYSCREEN) / 2) - 200); //垂直居中
      
        hwnd = CreateWindow(szAppName, TEXT("window_test"), WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, x, y, 400, 200, NULL, NULL, hInstance, NULL);//创建窗体API
      
        //ShowWindow(hwnd, SW_HIDE);
        ShowWindow(hwnd, iCmdShow);    //显示窗体的API 传入需要显示的窗体句柄和显示方式
        UpdateWindow(hwnd);            //刷新窗体的API
      
        while (GetMessage(&msg, NULL, 0, 0) > 0){   //从系统的应用程序线程消息队列中取得一个消息
        	DispatchMessage(&msg);
        	}
        return msg.wParam;
        }
      
        LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
      
        	HDC  hdc;                      //句柄
        	PAINTSTRUCT   ps;              //绘制信息
        	RECT          rect;            //矩形
        	HINSTANCE     hInstance;       //窗口实例
        	static HWND   hwndButton[2];   //按钮句柄
      
        	switch (message){
        		case WM_CREATE: //创建按钮
        		{
        				hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
        				hwndButton[0] = CreateWindow(_T("BUTTON"), _T("hello"),
        					WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
        					140, 50, 100, 50, hwnd, NULL,
        					(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
        			
        				return 0;
        		}
        	case WM_PAINT: //绘制文字
        		hdc = BeginPaint(hwnd, &ps);
        		GetClientRect(hwnd, &rect);
        		DrawText(hdc, TEXT("By:20145319"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_BOTTOM);
        		EndPaint(hwnd, &ps);
        		return 0;
        	case WM_COMMAND: //响应按钮消息
        		if ((HWND)lParam == hwndButton[0])
        		{
        			MessageBox(NULL, TEXT("你好,5319"), TEXT("问候"), MB_OK | MB_ICONQUESTION);
        		}
        		return 0;
        	case WM_CLOSE: //关闭
        		if (IDYES == MessageBox(hwnd, _T("是否关闭程序?"), _T("提示"), MB_YESNO | MB_ICONQUESTION))
        		{
        			DestroyWindow(hwnd);
        		}
        		return 0;
        	case WM_DESTROY: //退出程序
        		PostQuitMessage(0);
        		return 0;
        	}
        return DefWindowProc(hwnd, message, wParam, lParam);
        }
      
    • 当程序正常运行时我们可以看到其界面,任务栏以及进程列表中的程序名均一切正常

    • 当我们修改showWindow函数中的参数为SW_HIDE,则结果如下,我们能在后台进程中看到相应程序,但是其界面和任务栏中都已经找不到该程序了

    其他

    编译中的问题

    • 在调用messageBox或者creatWindow之类的函数时,通常会输入中文字符串来作为对应的函数参数,那么就可能会出现编译报错(“const char*”类型的实参和LPCWSTR类型的形参不兼容)

    • 造成该错误的原因是字节编码问题,默认环境下的unicode编码并不支持多字节,使用_T函数可以转换编码

    • 当程序中并没有编译错误之后,我们尝试运行该程序,会出现如下错误

    • 这是因为,在最开始我们已经强调,winMain是windows系统应用程序的入口函数,当前环境下系统找不到main函数,从而报错,因此我们需要将编译环境从dos环境修改为windows环境

    • 点击菜单栏中项目菜单,打开项目的属性页面,将子系统参数由控制台(console)修改为窗口(windows)

    • 其实最近我才发现可以直接建立windows窗口程序。。。。

  • 相关阅读:
    HttpWebRequest.GetRequestStream方法timeout的原因及解决办法
    C#随机函数random()典型用法集锦
    windows 2008 开启默认共享
    Window xp命令大全
    大并发处理解决方案
    库特Z配置
    SQL Server 返回了错误 21(设备未就绪。) 解决方法
    C# 执行bat批处理文件
    sql索引从入门到精通(十亿行数据测试报告)
    DataTable使用时的小问题
  • 原文地址:https://www.cnblogs.com/20145319zk/p/7043966.html
Copyright © 2020-2023  润新知