15.寻找进程中的MessageBoxA函数Call并调用
[toc]
x86程序中的写法
1. ce寻找MessageoxA函数地址并通过自动汇编调用MessageBoxA
打开CE,附加程序
搜索MessageBoxA的地址
编写自动汇编代码调用MessgeBoxA
写法1:使用push传递参数
1 | [ENABLE] |
写法2:使用push传递参数并保存ebp
1 | [ENABLE] |
写法3:分配栈空间传递参数
1 | [ENABLE] |
写法4:分配并使用1个栈空间传递参数
1 | [ENABLE] |
写法5:分配并使用2个栈空间传递参数
1 | [ENABLE] |
写法6:分配并使用3个栈空间传递参数
1 | [ENABLE] |
写法6:分配并使用栈空间传递所有参数
1 | [ENABLE] |
写法7:分配并使用栈空间传递所有参数后平栈
1 | [ENABLE] |
2. 加载动态链接库调用MessageBoxA函数
1. 使用内联汇编
创建动态链接库项目
dllamin.c
1 | // dllmain.c : Defines the entry point for the DLL application. |
使用C语言程序加载动态链接库
main.c
1 | //Message.c |
2.在动态链接库中将汇编代码单独写在am文件中
动态库完整代码
dllmain.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24// dllmain.c : Defines the entry point for the DLL application.
//extern int AsmMessageBoxA_(void* paddr);
DWORD paddr = 0x7714B730;
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
AsmMessageBoxA_(paddr);
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}DllAsmMessage.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21;AsmMessage.asm
.586
.model flat,stdcall,c
option casemap:none
.data
text db 'Load Dll success',0
.code
AsmMessageBoxA_ proc
mov ebx,[esp+4]; eax = 'paddr'
push 2
push 0
lea ecx,text
push ecx
push 0
call ebx
ret
AsmMessageBoxA_ endp
endC语言加载动态库代码同上
x86_64位中的写法
1. ce寻找MessageoxA函数地址并通过自动汇编调用MessageBoxA
ce64位写法1:
1 | [ENABLE] |
ce64位写法2使用push入栈,使用add rsp,20平栈:
1 | [ENABLE] |
2. 加载动态链接库调用MessageBoxA函数
1. x86_64位中masm不支持内联汇编只能将汇编代码单独写在一个文件中
x86_64位动态库完整代码
dllmain.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24// dllmain.c : Defines the entry point for the DLL application.
int AsmMessageBoxA_(void* paddr);
DWORD64 paddr = 0x00007FFCC35EABD0;
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
AsmMessageBoxA_(paddr);
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}DllAsmMessage.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18; AsmMessage.asm
.data
text db 'Load Dll success', 0
.code
AsmMessageBoxA_ proc
mov rbx, rcx; rcx = 'paddr'
sub rsp, 28h
mov r9, 2
mov r8, 0
lea rdx, text
mov rcx, 0
call rbx
add rsp, 28h
ret
AsmMessageBoxA_ endp
endx86_64位C语言加载动态库
main.c
1 | //Message.c |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
