首页
社区
课程
招聘
[原创]MFC的逆向工程 - 给SPYXX添加新功能
发表于: 2007-9-28 08:19 14353

[原创]MFC的逆向工程 - 给SPYXX添加新功能

2007-9-28 08:19
14353

【文章标题】: MFC的逆向工程 - 给SPYXX.exe添加新功能
【文章作者】: Suyana
【作者邮箱】: Suyasha@163.com
【作者QQ号】: 517949855(请注明来自看雪论坛)
【软件名称】: VC++6.0自带(SPYXX.exe)
【编写语言】: VC++,MFC
【使用工具】: OllyDBG,ResHacker
【操作平台】: WinXP
【软件介绍】: VC++6.0自带的工具
【作者声明】: 本文原创于Suyana, 转载请注明作者并保持文章的完整, 谢谢!
------------------------------------------------------------------------------------
【详细过程】
  1.用VC++6.0或ResHacker修改程序资源(对话框->200),添加四个按钮。偶的四个按钮的ID是1000,1002,1003,1004。程序界面比较挤,偶把它汉化后修改了大小,重新调整位置。如图1
  
  2.分析一下,实现这四个功能需要两条函数:EnableWindow、ShowWindow。程序里都有,就不用手工添加了,还要获得要操作的窗口的句柄。用资源修改器查看一下程序显示窗口句柄的控件的ID是201(0c9h),所以在OD中"查找"->"所有命令",输入"push 0c9"。来到:

          0042BC88        mov     edx, [edi+220]          ; 这里保存的就是目标窗口的句柄因地址是变化的,所以要保存起来
          0042BC8E        push    edx                           ; 修改成jmp 0044B0B8
          0042BC8F        call    00427810
          0042BC94        add     esp, 4
          0042BC97        mov     ecx, esi
          0042BC99        push    eax
          0042BC9A        push    0C9
          0042BC9F        call    <jmp.&MFC42.#5953_CWnd::SetDlgItemTex>
  在0044B0B8处添加偶门的代码:
          0044B0B8        mov     [46CFF0], edx           ; 保存到这个地方
          0044B0BE        push    edx                           ; 被覆盖的代码
          0044B0BF        call    00427810                    ; 被覆盖的代码
          0044B0C4        jmp     0042BC94                 ; 继续执行
          0044B03E        push    ebp
          0044B03F        mov     ebp, esp
          0044B041        pushad
          0044B042        mov     eax, [ebp+8]            ; 取第一个参数
          0044B045        cmp     eax, 3E8                   ; 是不是ID=1000的按钮Enable
          0044B04A        jnz     short 0044B054
          0044B04C        push    1                              ; 可用
          0044B04E        pop     ebx
          0044B04F        call    0044B090                   ; 为了省代码,偶写了一个函数,用来使窗口可用或禁用,ebx=1为可用,0为禁用
          0044B054        cmp     eax, 3EA                   ; 是不是ID=1002的按钮Disable
          0044B059        jnz     short 0044B063
          0044B05B        push    0                              ; 禁用
          0044B05D        pop     ebx
          0044B05E        call    0044B090
          0044B063        cmp     eax, 3EB                   ; 是不是ID=1003的按钮Show
          0044B068        jnz     short 0044B072
          0044B06A        push    5                              ; 显示
          0044B06C        pop     ebx
          0044B06D        call    0044B0A3                  ; 自己写的函数,用来显示或隐藏窗口
          0044B072        cmp     eax, 3EC                  ; 是不是ID=1004的按钮Hide
          0044B077        jnz     short 0044B081
          0044B079        push    0                             ; 隐藏
          0044B07B        pop     ebx
          0044B07C        call    0044B0A3
          0044B081        popad
          0044B082        nop
          0044B083        pop     ebp
          0044B084        jmp     [44C664]                 ; 跳到MFC42库的OnCommand

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (11)
雪    币: 199
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
沙发
2007-9-28 11:05
0
雪    币: 1634
活跃值: (1397)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
3
好,支持,鼓励
2007-9-28 12:02
0
雪    币: 313
活跃值: (14)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
4
Thank you!
大家一起努力!!!
2007-9-28 17:29
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
5
十分有用,收藏了
2007-10-8 00:37
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
真没想到 这样也可以哦 呵呵 不错!
2007-10-8 11:19
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
支持!!
2007-10-8 11:43
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
吓我一跳,乍看还以为是要逆向MFC的类库呢~~
2008-1-4 22:43
0
雪    币: 102
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
膜拜一下
2009-8-12 14:45
0
雪    币: 206
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
不对吧???能进到CWnd::OnCommand中吗??
你新建的几个按键的PROC没有指向AfcWndProc吧??走的应该是默认的PROC.
就算你用了AfcWndProc但他只查找永久表呀,
代码如下:
AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
        // special message which identifies the window as using AfxWndProc
        if (nMsg == WM_QUERYAFXWNDPROC)
                return 1;

        // all other messages route through message map
        CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
        ASSERT(pWnd != NULL);
        ASSERT(pWnd->m_hWnd == hWnd);
        if (pWnd == NULL || pWnd->m_hWnd != hWnd)
                return ::DefWindowProc(hWnd, nMsg, wParam, lParam);
        return AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam);
}
不知说的对不对,还请高人指点.
2009-9-11 12:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
Thank you!
大家一起努力!!!

欢迎大家友情连接
http://www.chnia5e.com.cn
http://www.qjyl68.com.cn
http://www.chukcu.com.cn
http://www.yijnitong.com.cn
2009-9-11 19:00
0
雪    币: 240
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
自己做的好东西啊 交流交流吧  收藏了
2009-9-12 09:41
0
游客
登录 | 注册 方可回帖
返回
// // 统计代码