首页
社区
课程
招聘
[原创]Lex在逆向中应用二例(自制MFC SPY与除法定式识别软件,附软件及源码)
发表于: 2015-10-10 21:32 13683

[原创]Lex在逆向中应用二例(自制MFC SPY与除法定式识别软件,附软件及源码)

2015-10-10 21:32
13683

本贴所提及的主要程序有三个:

//cpp文件中
BEGIN_MESSAGE_MAP
END_MESSAGE_MAP
 
//头文件中
DECLARE_MESSAGE_MAP
virtual const AFX_MSGMAP* GetMessageMap() const;
void CMyMFCSpyDlg::OnSpyMFC()
{
    HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, "WaitForMySpyHookDll");
    HHOOK hhk = NULL;

    if(!IsWindow(m_hWndDest))
    {
        AfxMessageBox("NOT a valid handle");
    }

    if (!::SendMessage(m_hWndDest, WM_QUERYAFXWNDPROC, 0, 0))
    {
        AddHead2OutputBox("WM_QUERYAFXWNDPROC: Dest App is NOT a MFC application.\r\n");
        return;
    }
    
    BeginWaitCursor();

    /* 挂钩、注入、并等待返回结果 */

    //挂钩
    hhk = SetMFCSpyHook();
    if(!hhk)
    {
        AfxMessageBox("设置钩子失败");
    }

    //通知钩子处理事务
    ::SendMessage(m_hWndDest, WM_NULL, WP_BEGINSPY, LP_BEGINSPY);

    //等待处理完毕
    WaitForSpyDll();

    //通过FileMapObject读取目标信息
    ShowDestInf();

    ::UnhookWindowsHookEx(hhk);
    
  EndWaitCursor();
}
void WriteMsgMapInf2File(AFX_MSGMAP *pMsgMap)
{
    AFX_MSGMAP_ENTRY MsgEntryEnd = {0, 0, 0, 0, 0, 0};
    const AFX_MSGMAP_ENTRY *pEntrys = NULL;
    UINT nTagMsgIndex = -1;

    HANDLE hMap = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, g_szDatFilePath);
    if (hMap == NULL)
        return;

    char*  pszBuff = (char*)::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS,
                                0, 0, //偏移
                                0 /*映射所有*/);
    if (pszBuff == NULL)
    {
        return;
    }

    if (pMsgMap == NULL || g_pCWnd == NULL)
    {
        strcpy(pszBuff, "ITEM_END_ITEM_END_ITEM_END");
        ::UnmapViewOfFile(pszBuff);
        ::CloseHandle(hMap);
        return;
    }

    // 定长 200
#define ItemLen 200

    //写窗口对象内容
     sprintf(pszBuff, "CWnd Address:0x%p, VT Address:0x%p", g_pCWnd, * ((int*)g_pCWnd) );
     pszBuff += ItemLen;

    //写消息映射表内容
    pEntrys = pMsgMap->lpEntries;
    while(memcmp(pEntrys, &MsgEntryEnd, sizeof(MsgEntryEnd)) != 0)
    {
        nTagMsgIndex = GetTagMsgIndex(pEntrys->nMessage);
        
        if (nTagMsgIndex != -1)
        {
            sprintf(pszBuff, "%-20s", g_tagWndMsg[nTagMsgIndex].strMsg);

            sprintf(pszBuff + 20, "nCode:%p, nID:%p, pfn:%p", 
                pEntrys->nCode,
                pEntrys->nID,
                pEntrys->pfn);
            pszBuff += ItemLen;
        }

        pEntrys++;
    }

    strcpy(pszBuff, "ITEM_END_ITEM_END_ITEM_END");

    ::UnmapViewOfFile(pszBuff);
    ::CloseHandle(hMap);
}
AFX_MSGMAP * GetRlsMsgMap(CWnd *pWnd)
{
    AFX_MSGMAP *pMsgMap = NULL;
    __asm 
    {
        push ecx;
        push ebx;
        
        mov ebx, pWnd;
        mov ecx, dword ptr [ebx];
        mov ecx, dword ptr [ecx + 0x30];
        call ecx;
        mov pMsgMap, eax;
        
        pop ebx;
        pop ecx;
    }
    return pMsgMap;
}
#define ToTagMsg(WndMsg) {WndMsg, #WndMsg} ,
 
struct tagWndMsg
{
   DWORD dwMsg;
   const char * strMsg;
};
tagWndMsg g_tagWndMsg[] = {
    ToTagMsg(WM_FLIP)
    ToTagMsg(WM_NULL)
};
//宏替换为:
tagWndMsg g_tagWndMsg[] = {
    {WM_FLIP, "WM_FLIP"} ,
    {WM_NULL, "WM_NULL" } ,
};
%{
#include <stdio.h>
#include <string.h>
 
/* This program
 * converts the macros of windows message
 * to tagWndMsg containing the value and string
 */
  
unsigned int g_nMsgNum  = 0;
 
%}
MSGMACRO WM_[A-Z_]*
%x BLOCKCOMMENT
%%
 
\n                          { /* new line */ }
 
"//".*                      { /* eat up line comment */ }
 
"/*"                        { BEGIN BLOCKCOMMENT; }
<BLOCKCOMMENT>[^*\n]+       { /* eat up anything that's not a '*' */ }
<BLOCKCOMMENT>"*"           { /* eat up '*'s not followed by '/'s */ }
<BLOCKCOMMENT>\n            { /* new line */ }
<BLOCKCOMMENT>"*/"          { BEGIN INITIAL; }
 
{MSGMACRO}                  { printf("    ToTagMsg(%s)\n", yytext);  g_nMsgNum++;}
 
.                           { /* eat up whatever else */ }
 
%%
int main()
{
    char *szMacro = "#define ToTagMsg(WndMsg) {WndMsg, #WndMsg} ,\r\n";
     
    char *szTagMsg = "struct tagWndMsg\n"
                    "{\n"
                    "   DWORD dwMsg;\n"
                    "   const char * strMsg;\n"
                    "};\r\n";
     
    char *szBeginAry = "tagWndMsg g_tagWndMsg[] = {\n";
    char *szEndAry = "\n};";
     
    printf(szMacro);
    printf(szTagMsg);
     
    printf(szBeginAry);
    yylex();
    printf(szEndAry);
     
    printf("//Total Msg:%d", g_nMsgNum);
}
 
int yywrap()
{
    return 1;
}
GenMsgAry.exe < WinUser.h > Dest.cpp
//mfc42d.Dll版本
PVOID GetDbgFromHandleAddr(HMODULE hModule)
{
    return GetProcAddress(hModule, (LPCSTR) 2220);
}
 
//mfc42.Dll版本
PVOID GetRlsFromHandleAddr(HMODULE hModule)
{
    return GetProcAddress(hModule, (LPCSTR) 2867);
}
%{
#include <stdio.h>
#include <string.h>
#include "Tokens.h"

unsigned int g_dwOffset  = 0;

%}
CALL \xE8[\x00-\xFF]{4,4}
PUSH_NUM \x68[\x00-\xFF]{4,4}
VC6_RLS_STC_PATTERN \x56\x57\x6A\x01{CALL}\x8B\xF0\xFF\x74\x24\x0C\x8B\xCE{CALL}\x8B\xF8\x56\x8B\xCF{CALL}\x8B\xC7\x5F\x5E\xC2\x04\x00
//... 各种特征码
%%

{VC6_RLS_STC_PATTERN} {
    return VC6_STC_RLS;
}

//... 找到特征码后各种对应处理方案

. {
    g_dwOffset += yyleng;
}

\r|\n {
    g_dwOffset += 1; //注意通配符 "." 是不匹配newline的
}

%%
int yywrap()
{
    return 1;
}


int FindMFCVersion(FILE *fp)
{
    yyin = fp;
    yyrestart(fp);
    g_dwOffset = 0;

    switch (yylex())
    {
    case VC6_STC_DBG:
        return VC6_STC_DBG;
        break;
    case VC6_STC_RLS:
        return VC6_STC_RLS;
        break;
    case VS2013_STC_RLS:
        return VS2013_STC_RLS;
    case  VS2013_STC_DBG:
        return VS2013_STC_DBG;
        break;
    }
    return 0;
}

unsigned int GetPatternOffset()
{
    return g_dwOffset;
}
/bin
  GenMsgAry.exe    **提取Winuser.h中消息宏的程序
  MFCSpyHook.dll   **钩子,由句柄获取对方进程窗口对象
  MyMFCSpy.exe     **主程序
/CvtWinMsg                 **GenMsgAry.exe的源码
/FindMFCVersion          **静态FromHandle特征码识别的源码
/MFCSpyHook              ** MFCSpyHook.dll的源码
/MyMFCSpy                 ** MyMFCSpy.exe的源码
/ParserBin                   **用于识别汇编代码并逆运算的核心代码
/PatternRecgMFC         **针对以上的核心写的窗口UI
PatternRecgMFC.exe    **主程序
sample.txt                  **测试输入及中间文件

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 3
支持
分享
最新回复 (25)
雪    币: 81
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
沙发。。
2015-10-10 21:47
0
雪    币: 6
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢楼主分享。
2015-10-10 21:57
0
雪    币: 6
活跃值: (1125)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
很高级啊,希望楼主把这个程序继续完善。这份作业是得优了。
2015-10-10 21:58
0
雪    币: 341
活跃值: (138)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
5
两份好东西。。。
2015-10-10 22:57
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
6
十分感谢,最近正好需要这方面的资料~
2015-10-10 23:16
0
雪    币: 144
活跃值: (335)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
真是好东西啊  谢谢谢谢
2015-10-10 23:21
0
雪    币: 8201
活跃值: (2701)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
在我眼里lex是高大上,学习了。
2015-10-11 07:05
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
好东西好东西 感谢分享
2015-10-11 10:48
0
雪    币: 64
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
10
能走LSP的就LSP,搞不定的就开始PPTP、L2TP等VPN手段了
2015-10-11 13:22
0
雪    币: 562
活跃值: (4325)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
不看了,看了几篇文章。从文章的开头,一猜就才到是科锐的同学发的。
2015-10-11 23:21
0
雪    币: 768
活跃值: (530)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
12
好工具,好源码,好思路,lex好用法。
科锐高大上,,顶!赞!!!
2015-10-12 08:43
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
不知道LZ对辅助行为分析有研究过没
2015-10-12 09:29
0
雪    币: 96
活跃值: (36)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
牛!!!!!!!
2015-10-12 09:38
0
雪    币: 6475
活跃值: (3626)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
不错, 好文章....
2015-10-12 10:54
0
雪    币: 6790
活跃值: (4441)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
16
科瑞的作业题还蛮有意思的,支持一下楼主
2015-10-12 11:01
0
雪    币: 3532
活跃值: (1862)
能力值: ( LV6,RANK:93 )
在线值:
发帖
回帖
粉丝
17
我又来打广告了,https://github.com/lynnux/xspy
2015-10-12 11:14
0
雪    币: 231
活跃值: (2631)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
18
这看的头疼
2015-10-12 17:39
0
雪    币: 768
活跃值: (530)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
19
[QUOTE=lynnux;1396363]我又来打广告了,https://github.com/lynnux/xspy[/QUOTE]

广告很到位,,感谢~:)

ps楼主的程序兼容性要继续前进。。
2015-10-13 08:05
0
雪    币: 132
活跃值: (127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
高级货 赞一个
2015-10-13 20:57
0
雪    币: 74
活跃值: (748)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
学习下,感谢分享
2015-10-14 14:11
0
雪    币: 262
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
又是科锐的
2015-10-15 11:30
0
雪    币: 2810
活跃值: (2603)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
23
我也要打广告静态获取MFC的MESSAGE_MAP表
http://bbs.pediy.com/showthread.php?t=204239

2015-10-15 17:22
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
24
楼主这么用Lex的很炫~
2015-10-15 22:36
0
雪    币: 1361
活跃值: (1116)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
25
mark 标记下
2015-12-1 18:12
0
游客
登录 | 注册 方可回帖
返回
//