欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[翻译]Windows进程注入: 破坏BaDDEr

[翻译]Windows进程注入: 破坏BaDDEr

原文:https://modexp.wordpress.com/2019/08/09/windows-process-injection-breaking-badder/

引言

动态数据交换(Dynamic Data Exchange)是个数据共享协议,动态数据交换管理库(Dynamic Data Exchange Management Library)使应用程序能够通过DDE协议更方便地共享数据。2017年10月一个微软Office任意代码执行漏洞被发现后,DDE随即上了头条。从那以后,它就被默认关闭了,也就被大家认为是一个不重要的组件。本注入方法只局限于explorer.exe,当然如果你知道其它使用该协议的应用程序就另当别论了。我要感谢Adam关于使用DDE进行注入的讨论。

枚举DDE服务

Windows 10里使用DDE的DLL有shell32.dll, ieframe.dll和twain_32.dll。shell32.dll在explorer.exe中创建了三个DDE服务。下面的代码使用DDEML API列出所有服务及服务所属的进程。

VOID dde_list(VOID) {

    CONVCONTEXT cc;

    HCONVLIST   cl;

    DWORD       idInst = 0;

    HCONV       c = NULL;

    CONVINFO    ci;

    WCHAR       server[MAX_PATH];

    

    if(DMLERR_NO_ERROR != DdeInitialize(&idInst, NULL, APPCLASS_STANDARD, 0)) {

      printf("unable to initialize : %i.\n", GetLastError());

      return;

    }

    

    ZeroMemory(&cc, sizeof(cc));

    cc.cb = sizeof(cc);

    cl = DdeConnectList(idInst, 0, 0, 0, &cc);

    

    if(cl != NULL) {

      for(;;) {

        c = DdeQueryNextServer(cl, c);

        if(c == NULL) break;

        ci.cb = sizeof(ci);

        DdeQueryConvInfo(c, QID_SYNC, &ci);

        DdeQueryString(idInst, ci.hszSvcPartner, server, MAX_PATH, CP_WINUNICODE);

        

        printf("Service : %-10ws Process : %ws\n", 

          server, wnd2proc(ci.hwndPartner));

      }

      DdeDisconnectList(cl);

    } else {

      printf("DdeConnectList : %x\n", DdeGetLastError(idInst));

    }

    DdeUninitialize(idInst);

}

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功