首页
社区
课程
招聘
[原创]如何中断Themida的MessageBox对话框
发表于: 2011-9-19 14:46 26820

[原创]如何中断Themida的MessageBox对话框

2011-9-19 14:46
26820
原理:读取系统DLL到分配的内存里面去,然后定位到相关的API的代码。
FARPROC  GetApiAddr(BYTE *Base,DWORD Api)
参数一:我们分配的内存基址
参数二:函数地址减去模块基址的差值
返回值:返回内存中得API的函数的地址
作用:对原来的系统API函数下断点无效,因为我们已经吧全部系统DLL读取到内存中定位到相关的代码了,调用的是内存中得API函数

#include <windows.h>
char Caption[]="Test";
char Text[]="MessageBoxA";
FARPROC  GetApiAddr(BYTE *Base,DWORD Api)
{
	DWORD VirtualSize;
	DWORD PhysicalAddr;
	DWORD RawSize;  
	FARPROC RET=NULL;
	PIMAGE_DOS_HEADER DosHeader=(PIMAGE_DOS_HEADER)Base;
	PIMAGE_NT_HEADERS NtHeader=(PIMAGE_NT_HEADERS)((DWORD)DosHeader+(DWORD)DosHeader->e_lfanew);
	PIMAGE_SECTION_HEADER SecHeader=(PIMAGE_SECTION_HEADER)((DWORD)NtHeader+sizeof(IMAGE_FILE_HEADER)+  
		NtHeader->FileHeader.SizeOfOptionalHeader+4);
	BYTE SecSum=NtHeader->FileHeader.NumberOfSections;
	while(SecSum)
	{
		PhysicalAddr=(DWORD)SecHeader->Misc.PhysicalAddress;
		VirtualSize=(DWORD)SecHeader->VirtualAddress;//>Misc.VirtualSize;
		PhysicalAddr+=VirtualSize;
		if(Api>=VirtualSize&&Api<=PhysicalAddr)
		{
			RawSize=SecHeader->PointerToRawData;
			RawSize-=VirtualSize;
			Base+=RawSize;
			Base+=Api;
		}
		SecHeader++;
		SecSum--;
	}
	RET=(FARPROC)Base;
	return RET;
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
	DWORD dwRead;
	char SystemPath[MAX_PATH]={0};
	HMODULE hMod=GetModuleHandleA("USER32.DLL");
	if(!hMod)
		hMod=LoadLibraryA("USER32.DLL");
	GetSystemDirectoryA(SystemPath,MAX_PATH);
	lstrcat(SystemPath,"\\user32.dll");
	HANDLE Handle=CreateFileA(SystemPath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	DWORD Size=GetFileSize(Handle,NULL);
	BYTE *Virtual=VirtualAlloc(NULL,Size,MEM_COMMIT,PAGE_READWRITE);
	VirtualLock(Virtual,Size);
	ReadFile(Handle,Virtual,Size,&dwRead,NULL);
	DWORD MeAddr=(DWORD)GetProcAddress(hMod,"MessageBoxA");
	MeAddr=MeAddr-(DWORD)hMod;
	DWORD Api=(DWORD)GetApiAddr(Virtual,MeAddr);
_asm{
		push 0
		lea eax,Caption
		push eax
		lea eax,Text
		push eax
		push 0
		call Api
	}
	return FALSE;
}

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

收藏
免费 6
支持
分享
最新回复 (37)
雪    币: 27
活跃值: (90)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
韬哥解释下吧,代码看着挺累的。。
2011-9-19 15:27
0
雪    币: 343
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
果断支持韬兄。
2011-9-19 15:27
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
4
添加了说明。
2011-9-19 16:33
0
雪    币: 962
活跃值: (1681)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
.......我觉得这样问题很大。。。确定这样行?
2011-9-19 16:53
0
雪    币: 76
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
关注中,求解决方案!
2011-9-19 17:34
0
雪    币: 287
活跃值: (578)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
滔哥好牛B啊!完全看不懂你在讲啥!求滔哥指点
2011-9-19 17:46
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
8
黑哥太谦虚了
2011-9-19 17:49
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
9
这都是论坛中的大牛玩过时的玩意了,我从以前的帖子的EXE里面给趴出来了
2011-9-19 17:52
0
雪    币: 219
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
恩。你的文章写的挺好的。支持一下。。
2011-9-21 15:53
0
雪    币: 266
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
THEMIDA 的壳子确实是这样的,
2011-9-21 16:19
0
雪    币: 1534
活跃值: (733)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
12
大概看了一下代码总感觉有问题啊。
2011-9-21 16:22
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
实在是看不明白啊,。。
2011-9-21 16:48
0
雪    币: 606
活跃值: (230)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
14
偶做了一个小小的改动!!!!!呵呵@@@@功能差不多~~~~
2011-9-22 16:43
0
雪    币: 606
活跃值: (230)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
15
#include <windows.h>

DWORD ReGetProcAddress(HMODULE hModule, HMODULE hOldModule, LPCSTR lpProcName)
{
        DWORD MyApiAddr;
        DWORD ApiOffset;
        DWORD ReApiAddr;

       
        MyApiAddr = (DWORD)GetProcAddress(hOldModule, lpProcName);
        ApiOffset = MyApiAddr - (DWORD)hOldModule;
        ReApiAddr = (DWORD)hModule + ApiOffset;

        return (ReApiAddr);
}

HMODULE RemapLibrary(LPCSTR lpModuleName)
{
        HMODULE hMod;
        DWORD ImageSize;
        BYTE* Virtual;
        PIMAGE_DOS_HEADER DosHeader;
        PIMAGE_NT_HEADERS NtHeader;

        hMod = GetModuleHandleA(lpModuleName);
        if(!hMod)
        {
                return (0);
        }

        DosHeader = (PIMAGE_DOS_HEADER)hMod;
        NtHeader = (PIMAGE_NT_HEADERS)((DWORD)DosHeader + (DWORD)DosHeader->e_lfanew);
        ImageSize = (DWORD)NtHeader->OptionalHeader.SizeOfImage;
       
        Virtual = (BYTE*)VirtualAlloc(NULL, ImageSize, MEM_COMMIT, PAGE_READWRITE);
        if(!Virtual)
        {
                return (0);
        }

        VirtualLock(Virtual, ImageSize);

        memcpy(Virtual, (PBYTE)hMod, ImageSize);

        return ((HMODULE)Virtual);
}

typedef DWORD (WINAPI *MSGBOX)(HWND,LPSTR,LPSTR,UINT);

void main()
{
        HMODULE hOldMod, hNewMod;
        MSGBOX MyMessageBox;

        printf("开始动态加载User32.dll\n");

        hOldMod = LoadLibrary("user32.dll");

        printf("User32.dll加载成功!\n");

        printf("开始重新映射User32.dll\n");

        hNewMod = RemapLibrary("user32.dll");

        printf("User32.dll重新映射成功!\n按任意键继续...\n");

        getchar();

        printf("开始释放原User32.dll\n");

        FreeLibrary(hOldMod);

        printf("User32.dll释放成功!\n按任意键继续...\n");

        getchar();

        MyMessageBox = (MSGBOX)ReGetProcAddress(hNewMod, hOldMod, "MessageBoxA");
       
        MyMessageBox(NULL, "ReMapLibrary OK!", "Test", 0);

        printf("调用MessageBoxA成功!");

}
2011-9-22 16:43
0
雪    币: 535
活跃值: (109)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
16
不知道Safengine是不是也是这种方法,是的话od里ctrl+s搜索特征码就能中断了
2011-9-22 17:02
0
雪    币: 279
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
话说OD暂停  然后单步也可以找到
2011-9-22 17:42
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
18
多谢封装!
2011-9-22 17:51
0
雪    币: 33
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
代码很不认识
2011-9-23 02:46
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
来顶下滔哥
2011-9-23 09:11
0
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
21
最简单的内存对齐,重定位,IAT,这些你都没做的嘛。

另外,这和Themida有啥关系。
2011-9-26 10:29
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
22
找下和这标题相同的帖子吧,看了就知道怎么了!
2011-9-26 13:19
0
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
23
……
2011-9-26 14:08
0
雪    币: 136
活跃值: (105)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
24
hhee 楼上的给力哥
2011-9-26 23:27
0
雪    币: 576
活跃值: (1163)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
25
内存RVA到 文件VA的转换过程。。TMD查找关键API函数调用的一个快捷途径。。
2011-9-28 18:52
0
游客
登录 | 注册 方可回帖
返回
//