首页 > 逆向调试 > 劫持msimg32.dll实现GUI型程序补丁制作

劫持msimg32.dll实现GUI型程序补丁制作

示例程序

软件下载:http://www.elcomsoft.com/download/ewsa_setup_en.msi
软件介绍:Audit security of your wireless networks and recover WPA/WPA2 with patent-pending GPU
acceleration technology that speeds up password recovery if one or more
compatible NVIDIA or ATI video cards are installed.

程序分析
这是一个vmp保护的程序,壳启动代码里处理iat的时候,会从当前目录加载dll,通过加载模块列表发现msimg32.dll会产生劫持。

分析结论
以前lpk、usp10、setupapi做补丁很方便,现在被微软处理了,但我们还可以根据特定程序来针对性地dll劫持,也同样方便快捷。

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
// Source Code File: msimg32.cpp
// Output Bin: msimg32.dll
 
#include <Windows.h>
 
// 导出函数
#pragma comment(linker, "/EXPORT:vSetDdrawflag=_AheadLib_vSetDdrawflag,@1")
#pragma comment(linker, "/EXPORT:AlphaBlend=_AheadLib_AlphaBlend,@2")
#pragma comment(linker, "/EXPORT:DllInitialize=_AheadLib_DllInitialize,@3")
#pragma comment(linker, "/EXPORT:GradientFill=_AheadLib_GradientFill,@4")
#pragma comment(linker, "/EXPORT:TransparentBlt=_AheadLib_TransparentBlt,@5")
 
// 宏定义
#define EXTERNC extern "C"
#define NAKED __declspec(naked)
#define EXPORT __declspec(dllexport)
 
#define ALCPP EXPORT NAKED
#define ALSTD EXTERNC EXPORT NAKED void __stdcall
#define ALCFAST EXTERNC EXPORT NAKED void __fastcall
#define ALCDECL EXTERNC NAKED void __cdecl
 
// AheadLib 命名空间
namespace AheadLib
{
        HMODULE m_hModule = NULL;        // 原始模块句柄
        DWORD m_dwReturn[5] = {0};       // 原始函数返回地址
 
 
        // 加载原始模块
        inline BOOL WINAPI Load()
        {
                TCHAR tzPath[MAX_PATH];
                TCHAR tzTemp[MAX_PATH * 2];
 
                GetSystemDirectory(tzPath, MAX_PATH);
                lstrcat(tzPath, TEXT("\\msimg32"));
                m_hModule = LoadLibrary(tzPath);
                if (m_hModule == NULL)
                {
                        wsprintf(tzTemp, TEXT("无法加载 %s,程序无法正常运行。"), tzPath);
                        MessageBox(NULL, tzTemp, TEXT("AheadLib"), MB_ICONSTOP);
                }
 
                return (m_hModule != NULL);        
        }
 
        // 释放原始模块
        inline VOID WINAPI Free()
        {
                if (m_hModule)
                {
                        FreeLibrary(m_hModule);
                }
        }
 
        // 获取原始函数地址
        FARPROC WINAPI GetAddress(PCSTR pszProcName)
        {
                FARPROC fpAddress;
                CHAR szProcName[16];
                TCHAR tzTemp[MAX_PATH];
 
                fpAddress = GetProcAddress(m_hModule, pszProcName);
                if (fpAddress == NULL)
                {
                        if (HIWORD(pszProcName) == 0)
                        {
                                wsprintf(szProcName, "%d", pszProcName);
                                pszProcName = szProcName;
                        }
 
                        wsprintf(tzTemp, TEXT("无法找到函数 %hs,程序无法正常运行。"), pszProcName);
                        MessageBox(NULL, tzTemp, TEXT("AheadLib"), MB_ICONSTOP);
                        ExitProcess(-2);
                }
 
                return fpAddress;
        }
}
 
using namespace AheadLib;
 
BOOL Patched=FALSE;
void DoPatch()
{
        if(Patched)return;
        DWORD addr1=0x00402130; //RETURN REGISTER TYPE
        unsigned char  addr1bytes[6]={0xB8,0x00,0x00,0x00,0x03,0xC3};
        DWORD addr2=0x00402160; //IS REGISTER
        unsigned char  addr2bytes[4]={0x33,0xC0,0x40,0xC3};
        DWORD addr3=0x00596708; //HAHA
        unsigned char  addr3bytes[22] = {
                        0x20, 0x00, 0x47, 0x00, 0x4F, 0x00, 0x4C, 0x00,
                        0x44, 0x00, 0x53, 0x00, 0x55, 0x00, 0x4E, 0x00,
                        0x20, 0x00, 0x00, 0x00, 0x00, 0x00 
        };
 
        DWORD oldprt;
        VirtualProtect((LPVOID)addr1,sizeof(addr1bytes),PAGE_EXECUTE_READWRITE,&oldprt);
        CopyMemory((LPVOID)addr1,addr1bytes,sizeof(addr1bytes));
        VirtualProtect((LPVOID)addr1,sizeof(addr1bytes),oldprt,&oldprt);
 
        VirtualProtect((LPVOID)addr2,sizeof(addr2bytes),PAGE_EXECUTE_READWRITE,&oldprt);
        CopyMemory((LPVOID)addr2,addr2bytes,sizeof(addr2bytes));
        VirtualProtect((LPVOID)addr2,sizeof(addr2bytes),oldprt,&oldprt);
 
        VirtualProtect((LPVOID)addr3,sizeof(addr3bytes),PAGE_EXECUTE_READWRITE,&oldprt);
        CopyMemory((LPVOID)addr3,addr3bytes,sizeof(addr3bytes));
        VirtualProtect((LPVOID)addr3,sizeof(addr3bytes),oldprt,&oldprt);
 
        Patched=true;
}
 
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
        if (dwReason == DLL_PROCESS_ATTACH)
        {
                DisableThreadLibraryCalls(hModule);
                DoPatch();
                return Load();
        }
        else if (dwReason == DLL_PROCESS_DETACH)
        {
                Free();
        }
 
        return TRUE;
}
 
ALCDECL AheadLib_vSetDdrawflag(void)
{
        // 保存返回地址
        __asm POP m_dwReturn[0 * TYPE long];
 
        // 调用原始函数
        GetAddress("vSetDdrawflag")();
 
        // 转跳到返回地址
        __asm JMP m_dwReturn[0 * TYPE long];
}
 
ALCDECL AheadLib_AlphaBlend(void)
{
        // 保存返回地址
        __asm POP m_dwReturn[1 * TYPE long];
 
        // 调用原始函数
        GetAddress("AlphaBlend")();
 
        // 转跳到返回地址
        __asm JMP m_dwReturn[1 * TYPE long];
}
 
ALCDECL AheadLib_DllInitialize(void)
{
        // 保存返回地址
        __asm POP m_dwReturn[2 * TYPE long];
 
        // 调用原始函数
        GetAddress("DllInitialize")();
 
        // 转跳到返回地址
        __asm JMP m_dwReturn[2 * TYPE long];
}
 
ALCDECL AheadLib_GradientFill(void)
{
        // 保存返回地址
        __asm POP m_dwReturn[3 * TYPE long];
 
        // 调用原始函数
        GetAddress("GradientFill")();
 
        // 转跳到返回地址
        __asm JMP m_dwReturn[3 * TYPE long];
}
 
ALCDECL AheadLib_TransparentBlt(void)
{
        // 保存返回地址
        __asm POP m_dwReturn[4 * TYPE long];
 
        // 调用原始函数
        GetAddress("TransparentBlt")();
 
        // 转跳到返回地址
        __asm JMP m_dwReturn[4 * TYPE long];
}

【转载声明】本文转载自UPK论坛,文章内容可行性本人暂时没有验证,有兴趣的同学可以自行验证,文章内容仅供参考。原文地址为:http://www.unpack.cn/thread-67020-1-1.html
【推荐阅读】Windows Live Messenger Plug-in Development Bible(MSN插件开发圣经


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> 劫持msimg32.dll实现GUI型程序补丁制作
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



  1. 本文目前尚无任何评论.