首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

1.15 自实现GetProcAddress

在正常情况下,要想使用GetProcAddress函数,需要首先调用LoadLibraryA函数获取到kernel32.dll动态链接库的内存地址,接着在调用GetProcAddress函数时传入模块基址以及模块中函数名即可动态获取到特定函数的内存地址...,但在有时这个函数会被保护起来,导致我们无法直接调用该函数获取到特定函数的内存地址,此时就需要自己编写实现LoadLibrary以及GetProcAddress函数,该功能的实现需要依赖于PEB线程环境块...,通过线程环境块可遍历出kernel32.dll模块的入口地址,接着就可以在该模块中寻找GetProcAddress函数入口地址,当找到该入口地址后即可直接调用实现动态定位功能。...strcmp(pFunName, "GetProcAddress")) { // 根据函数名称返回函数地址 return dwBase + dwFunAddrOffset...WINAPI *fnExitProcess)(_In_ UINT uExitCode);int main(int argc, char * argv[]){ // 获取kernel32基址 / 获取GetProcAddress

25810

1.15 自实现GetProcAddress

在正常情况下,要想使用GetProcAddress函数,需要首先调用LoadLibraryA函数获取到kernel32.dll动态链接库的内存地址,接着在调用GetProcAddress函数时传入模块基址以及模块中函数名即可动态获取到特定函数的内存地址...,但在有时这个函数会被保护起来,导致我们无法直接调用该函数获取到特定函数的内存地址,此时就需要自己编写实现LoadLibrary以及GetProcAddress函数,该功能的实现需要依赖于PEB线程环境块...,通过线程环境块可遍历出kernel32.dll模块的入口地址,接着就可以在该模块中寻找GetProcAddress函数入口地址,当找到该入口地址后即可直接调用实现动态定位功能。...位内存基址,读者可自行调用两种模式,输出如下图所示; 我们通过调用GetModuleKernel32()函数读入kernel32.dll模块入口地址后,则下一步就可以通过循环,遍历该模块的导出表并寻找到GetProcAddress...strcmp(pFunName, "GetProcAddress")) { // 根据函数名称返回函数地址 return dwBase + dwFunAddrOffset

22510

C# —— GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址。

函数功能描述: GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址。...函数原型: FARPROC GetProcAddress( HMODULE hModule, // DLL模块句柄 LPCSTR lpProcName // 函数名 ); 参数: hModule...注释: GetProcAddress函数被用来检索在DLL中的输出函数地址。...GetProcAddress函数验证那个指定的序数值是否在输出的序数1和最高序数值之间(在.DEF中)。...函数用这个序数值作为索引从函数表中读函数地址,假如.DEF 文件不连续地定义函数的序数值,如从1到N(N是输出的函数序数值),错误将会发生,GetProcAddress将会返回一个错误的、非空的地址,虽然指定的序数没有对应的函数

1.7K31

1.7 完善自定位ShellCode后门

的内存地址,而GetProcAddress是在kernel32.dll模块中的导出函数,所以我们可通过查找kernel32.dll的导出表来找到GetProcAddress函数的内存地址。...的地址,就在函数名称数组中,搜索GetProcAddress的名称;找到后根据编号,在序号数组中,得到它对应的序号值;最后根据序号值,在地址数组中,提取出它的地址。...的地址 } system("pause"); return 0;}读者需要自行在反汇编末尾add eax,ebp设置一个断点,然后运行程序,观察eax中的数据可知,当前GetProcAddress...的地址为0x75c39570,输出效果图如下所示;图片1.7.2 汇编实现动态定位功能有了上述功能的支持,动态定位的实现将变得格外容易,首先我们通过动态定位的方式确定GetProcAddress的内存地址...,该函数接收一个字符串参数,则我们通过push的方式将字符串的十六进制依次压栈保存,然后通过call [ebp+76]调用也就是调用GetProcAddress函数来动态得到内存地址,当得到地址后默认存储在

16420
领券