首页
论坛
课程
招聘
[原创]如何中断Themida的MessageBox对话框
2011-9-19 14:46 24671

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

2011-9-19 14:46
24671
原理:读取系统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;
}

[看雪官方培训] Unicorn Trace还原Ollvm算法!《安卓高级研修班》2021年秋季班火热招生!!

收藏
点赞0
打赏
分享
最新回复 (37)
雪    币: 0
活跃值: 活跃值 (24)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
tihty 活跃值 2 2011-9-19 15:27
2
0
韬哥解释下吧,代码看着挺累的。。
雪    币: 333
活跃值: 活跃值 (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
yarpee 活跃值 1 2011-9-19 15:27
3
0
果断支持韬兄。
雪    币: 49
活跃值: 活跃值 (16)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
邓韬 活跃值 9 2011-9-19 16:33
4
0
添加了说明。
雪    币: 1099
活跃值: 活跃值 (309)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
loqich 活跃值 2011-9-19 16:53
5
0
.......我觉得这样问题很大。。。确定这样行?
雪    币: 70
活跃值: 活跃值 (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yaneng 活跃值 2011-9-19 17:34
6
0
关注中,求解决方案!
雪    币: 248
活跃值: 活跃值 (261)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
dkxzl 活跃值 1 2011-9-19 17:46
7
0
滔哥好牛B啊!完全看不懂你在讲啥!求滔哥指点
雪    币: 49
活跃值: 活跃值 (16)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
邓韬 活跃值 9 2011-9-19 17:49
8
0
黑哥太谦虚了
雪    币: 49
活跃值: 活跃值 (16)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
邓韬 活跃值 9 2011-9-19 17:52
9
0
这都是论坛中的大牛玩过时的玩意了,我从以前的帖子的EXE里面给趴出来了
雪    币: 219
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
antnts 活跃值 2011-9-21 15:53
10
0
恩。你的文章写的挺好的。支持一下。。
雪    币: 266
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
icezy 活跃值 2011-9-21 16:19
11
0
THEMIDA 的壳子确实是这样的,
雪    币: 556
活跃值: 活跃值 (71)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
金罡 活跃值 1 2011-9-21 16:22
12
0
大概看了一下代码总感觉有问题啊。
雪    币: 108
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
今夕望月 活跃值 2011-9-21 16:48
13
0
实在是看不明白啊,。。
雪    币: 341
活跃值: 活跃值 (16)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
YangCoCol 活跃值 3 2011-9-22 16:43
14
0
偶做了一个小小的改动!!!!!呵呵@@@@功能差不多~~~~
雪    币: 341
活跃值: 活跃值 (16)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
YangCoCol 活跃值 3 2011-9-22 16:43
15
0
#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成功!");

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

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