shellcode笔记(二) 获取所需调用函数的地址
程序员文章站
2022-03-24 09:15:25
...
shellcode笔记(二) 获取所需调用函数的地址
-
此笔记基于 “VS平台C/C++高效shellcode编程技术实战课程” 视频
shellcode中杜绝一切绝对地址的直接调用,因为不同系统上的绝地地址存放的可能不是我们需要使用的函数,或者根本没有存放东西,这就需要我们在程序执行的过程中去动态地去获取所需函数的地址。该怎么做呢?
做法:
我们这里以创建文件的函数CreateFileA为例,先找到CreateFileA函数的定义,如下所示:
WINBASEAPI
__out
HANDLE
WINAPI
CreateFileA(
__in LPCSTR lpFileName,
__in DWORD dwDesiredAccess,
__in DWORD dwShareMode,
__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
__in DWORD dwCreationDisposition,
__in DWORD dwFlagsAndAttributes,
__in_opt HANDLE hTemplateFile
);
然后将这一部分copy到我们的Rmain函数里进行修改,编写一个FN_CreateFileA类型的指针:
typedef HANDLE(WINAPI *FN_CreateFileA)(
__in LPCSTR lpFileName,
__in DWORD dwDesiredAccess,
__in DWORD dwShareMode,
__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
__in DWORD dwCreationDisposition,
__in DWORD dwFlagsAndAttributes,
__in_opt HANDLE hTemplateFile
);
然后我们定义一个这个类型的函数类型变量:
FN_CreateFileA fn_CreateFileA;
现在我们把GetProcAddress返回的地址赋值给fn_CreateFileA,接下来调用fn_CreateFileA:
fn_CreateFileA = (FN_CreateFileA)GetProcAddress(LoadLibraryA("kernel32.dll"),"CreateFileA");
fn_CreateFileA("G:\\Blue Bird.txt", GENERIC_WRITE, 0,NULL, CREATE_ALWAYS, 0, NULL);
运行结果:可以看到G盘下创建了一个Blue Bird.txt文件
思考:在一般程序中,我们使用函数输入函数的名字,编译器会转换得到相应函数的绝对地址,进而调用相应函数,那为什么shellcode中不可以这样?
上一篇: spring-boot使用教程(一)