欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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笔记(二) 获取所需调用函数的地址




思考:在一般程序中,我们使用函数输入函数的名字,编译器会转换得到相应函数的绝对地址,进而调用相应函数,那为什么shellcode中不可以这样?

相关标签: ShellCode