我们知道kernel32.dll里有一个GetProcAddress函数,可以找到模块中的函数地址,函数原型是这样的: WINBASEAPI FARPROC WINAPI GetProcAddress ,看不出头绪 我老大很有才,他去翻了翻win2000的源码 偶也 一目了然 Win2K 源码 FARPROC GetProcAddress( HMODULE hModule, LPCSTR The GetProcAddress function searches for the function in the module specified by the hModule parameter Only use GetProcAddress to retrieve addresses of exported functions that belong to library modules. ,找到了就再做一次Load Dll,和GetProcAddress //没有找到'.'
我们知道kernel32.dll里有一个GetProcAddress函数,可以找到模块中的函数地址,函数原型是这样的: WINBASEAPI FARPROC WINAPI GetProcAddress 好了先试验一下 果然ntdll.dll中的 RtlFreeHeap的地址 和a2的值的一样的, 似乎印证了什么东西, 好吧 OD拿来 开启逆向 kernel32.GetProcAddress 搞了一会头晕了,看不出头绪 我老大很有才,他去翻了翻win2000的源码 偶也 一目了然 Win2K 源码 FARPROC GetProcAddress( HMODULE hModule The GetProcAddress function searches for the function in the module specified by the hModule ,找到了就再做一次Load Dll,和GetProcAddress // 没有找到 '.'
个人网站、项目部署、开发环境、游戏服务器、图床、渲染训练等免费搭建教程,多款云服务器20元起。
函数功能描述: GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址。 函数原型: FARPROC GetProcAddress( HMODULE hModule, // DLL模块句柄 LPCSTR lpProcName // 函数名 ); 参数: hModule 注释: GetProcAddress函数被用来检索在DLL中的输出函数地址。 GetProcAddress函数验证那个指定的序数值是否在输出的序数1和最高序数值之间(在.DEF中)。 函数用这个序数值作为索引从函数表中读函数地址,假如.DEF 文件不连续地定义函数的序数值,如从1到N(N是输出的函数序数值),错误将会发生,GetProcAddress将会返回一个错误的、非空的地址,虽然指定的序数没有对应的函数
(LoadLibraryA("kernel32.dll"), "CreateFileA"); 先得到GetProcAddress typedef FARPROC(WINAPI * FN_GetProcAddress )( _In_ HMODULE hModule, _In_ LPCSTR lpProcName ); FN_GetProcAddress fn_GetProcAddress = (FN_GetProcAddress)getProcAddress((HMODULE)getKernel32()); 然后把"CreateFileA"字符串替换了 char szCreateFile )( _In_ HMODULE hModule, _In_ LPCSTR lpProcName ); FN_GetProcAddress fn_GetProcAddress = (FN_GetProcAddress)getProcAddress((HMODULE)getKernel32()); typedef HANDLE(WINAPI *FN_CreateFileA)
((HINSTANCE)Param.KernelHandle, "LoadLibraryA"); Param.KernelGetProcAddress = (GETPROCADDRESS)GetProcAddress ((HINSTANCE)Param.KernelHandle, "GetProcAddress"); printf("获取到Kernel32.dll = %x", Param.KernelHandle ((HINSTANCE)Param.Kernel32Base, "LoadLibraryA"); Param.KernelGetProcAddress = (GETPROCADDRESS)GetProcAddress )GetProcAddress((HINSTANCE)parametros.KernelHandle, "GetProcAddress"); // 拷贝 winsock 字符串 strcpy(parametros.wsastring // 调用的远程Shell代码 void __stdcall MyShell(PARAMETROS *ptr) { // 通过GetProcAddress获取到ws2.dll中的所有函数地址 ptr
的RVA 4)通过GetProcAddress函数找到LoadLibraryA函数地址 5)通过这GetProcAddress和LoadLibraryA两个函数来加载dll文件和查找函数以供使用 先了解几个基本概念 2.2 GetProcAddress 定义:GetProcAddress是一个计算机函数,功能是检索指定的动态链接库(DLL)中的输出库函数地址 FARPROC GetProcAddress( HMODULE 如何通过kernel32.dll地址找到 GetProcAddress函数地址? 因为我们已经获得了GetProcAddress地址,我们可以利用GetProcAddress(kernel32, “LoadLibraryA”)这样的方式来查找LoadLibraryA函数的地址,但是在着之前 Get_Function_GetProcAddress cmp dword ptr[eax + 0x8], 0x65726464 jnz Get_Function_GetProcAddress
typedef double(*ADDPROC)(double, double); typedef double(*SUBPROC)(double, double); // GetProcAddress (handle, "qAdd"); SUBPROC MySub = (SUBPROC)GetProcAddress(handle, "qSub"); //SUBPROC MySub = (ADDPROC)GetProcAddress(handle, MAKEINTRESOURCE(2)); //编译不通过-放弃 cout << "input Number a: "; (handle, "qAdd"); //SUBPROC MySub = (ADDPROC)GetProcAddress(handle, MAKEINTRESOURCE(2)); // MAKEINTRESOURCE LPCSTR SUBPROC MySub = (SUBPROC)GetProcAddress(handle, "qSub"); // MAKEINTRESOURCE
return; DATA Data = {0}; //获取kernel32.dll中相关的导出函数 Data.dwLoadLibrary= (DWORD)GetProcAddress (GetModuleHandle("kernel32.dll"),"LoadLibraryA"); Data.dwGetProcAddress= (DWORD)GetProcAddress(GetModuleHandle ("kernel32.dll"),"GetProcAddress"); Data.dwGetModuleHandle= (DWORD)GetProcAddress(GetModuleHandle ("kernel32.dll"),"GetModuleHandleA"); Data.dwGetModuleFileName= (DWORD)GetProcAddress(GetModuleHandle
modBReg) return FALSE; INIT_REG_ENGINE InitRegEngine = (INIT_REG_ENGINE)GetProcAddress(modBReg, "InitRegEngine "); BRegDeleteKey = (BREG_Delete_KEY)GetProcAddress(modBReg, "BRegDeleteKey"); BRegOpenKey = (BREG_OPEN_KEY )GetProcAddress(modBReg, "BRegOpenKey"); BRegCloseKey = (BREG_CLOSE_KEY)GetProcAddress(modBReg, "BRegCloseKey "); BRegSetValueEx = (REG_SET_VALUE_EX)GetProcAddress(modBReg, "BRegSetValueEx"); if (!
解决方法1 GetProcAddress 函数功能描述:GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址。重明中也已利用该技术。 为例,改成GetProcAddress的调用方法,则变成下面这样: HMODULE Kernels32 = GetModuleHandleA("kernel32.dll"); using CreateToolhelp32Snapshots WINAPI*)(DWORD,DWORD); CreateToolhelp32Snapshots CreateToolhelp32Snapshot = (CreateToolhelp32Snapshots)GetProcAddress LPVOID, SIZE_T, DWORD, DWORD); VirtualAllocExPrototype VirtualAllocEx = (VirtualAllocExPrototype)GetProcAddress , SIZE_T, SIZE_T*); WriteProcessMemoryPrototype WriteProcessMemory = (WriteProcessMemoryPrototype)GetProcAddress
TempVar:=0; Result := CreateRemoteThread(hProc, nil, 0, GetProcAddress HNtDll := LoadLibrary(ntdll); if HNtDll <> 0 then begin RtlCreateQueryDebugBuffer := GetProcAddress (HNtDll, 'RtlCreateQueryDebugBuffer'); RtlQueryProcessDebugInformation := GetProcAddress(HNtDll ReleaseRtlQueryDebug; end; hProc:=OpenProcess(PROCESS_ALL_ACCESS,false,pid); try TempVar:=DWORD(GetProcAddress ); pd:=@AsmBuf[1]; pd^:=TempVar; pd:=@AsmBuf[6]; pd^:=hMod; TempVar:=DWORD(GetProcAddress
Exe调用一个DLL中的方法,有两种方法: 1 在Exe导入表中加入DLL中函数信息,例如我们程序中调用GetProcAddress这类的API就是因为我们程序默认的导入表中包含了Kernel32 .dll导出函数GetProcAddress信息。 2 在逻辑中通过LoadLibrary动态载入一个DLL,然后通过GetProcAddress获取函数地址。这样我们在Exe的导入表中是看不到这个DLL的信息的。 = hDllTop ) { pRet0 = (PRetN)GetProcAddress( hDllTop, "Ret0" ); if ( NULL ! = hDllBase ) { pRet1 = (PRetN)GetProcAddress( hDllBase, "Ret1" ); if ( NULL !
这将帮助我们找到有用的导出函数:GetProcAddress和LoadLibraryA,我们可以使用它来实现我们的目标。 函数的地址 它实际上类似于找到GetProcAddress函数的地址,唯一的区别是导出表的偏移量是0x88而不是0x78。 mov rdi,rdx; 在RDI中保存GetProcAddress 请注意,这必须小心。 找到LoadLibraryA的地址 由于我们有GetProcAddress的地址和kernel32.dll的基地址,我们可以使用它们来调用GetProcAddress(kernel32.dll,“LoadLibraryA 因此,我们需要将我们的字符串放在堆栈上,然后在此之后为我们调用的函数分配空间(例如GetProcAddress)。
三、代码实现 ZwCreateThreadEx在 ntdll.dll 中并没有声明,所以我们需要使用 GetProcAddress 从 ntdll.dll 中获取该函数的导出地址。 , DWORD dwStackSize, DWORD dw1, DWORD dw2, LPVOID pUnkown); 同样我们也使用 GetProcAddress hKeModule = GetModuleHandleA("Kernel32.dll") typedef_LoadLibraryA myLoadLibraryA = (typedef_LoadLibraryA)GetProcAddress GetModuleHandleA("Kernel32.dll"); typedef_ZwCreateThreadEx ZwCreateThreadEx = (typedef_ZwCreateThreadEx)GetProcAddress (hNtModule, "ZwCreateThreadEx"); typedef_LoadLibraryA myLoadLibraryA = (typedef_LoadLibraryA)GetProcAddress
中要使用动态链接库中的导出函数,只能在程序中根据DllAtribute显示调用,无法在运行阶段动态加载,但是我们可以利用WIN32 API的LoadLibrary和FreeLibrary打到目的,问题是根据GetProcAddress FreeLibrary(int hLibModule); [DllImport("kernel32", CharSet=CharSet.Ansi)] public extern static int GetProcAddress button1_Click(object sender, System.EventArgs e) { int hmod=LoadLibrary("*****.dll"); int pFname=GetProcAddress
hModule=GetModuleHandleA("kernel32.dll"); LPTHREAD_START_ROUTINE lpStartAddress=(LPTHREAD_START_ROUTINE)GetProcAddress PWSTR pwszPara = NULL; hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID); pfnThreadRtn = GetProcAddress inject"), 0, 0); } return true; } 2.调用代码如下,注意必须将上方编译好的hook.dll与下方工程放到同一个目录下,通过LoadLibrary函数获取到模块句柄,然后通过GetProcAddress HMODULE hMod = LoadLibrary(TEXT("hook.dll")); typedef void(*pSetHook)(void); pSetHook SetHook = (pSetHook)GetProcAddress
abort("LoadLibrary", err) } defer syscall.FreeLibrary(h) proc, err := syscall.GetProcAddress = nil { abort("GetProcAddress", err) } r, _, _ := syscall.Syscall(uintptr(proc), 0, 0, 0, 0)
= NULL) { PFUNMSG pMsgBox = (PFUNMSG)GetProcAddress(hModule, "MsgBox"); pMsgBox(L"hello lyshark" pDllAddr, DllName, dwSize, NULL)) { return FALSE; } // 获得 LoadLibraryA()函数的地址 pFuncProcAddr = GetProcAddress )这个未公开的内核函数,所以我们必须手动调用ZwCreateThread()这一内核函数,将第七个参数设置为0即可,ZwCreateThreadEx函数在ntdll.dll中并未声明,所以必须手动使用GetProcAddress ,ebx,offset szLoadLibrary mov lpLoadLibrary,eax invoke GetProcAddress,ebx,offset szGetProcAddress mov lpGetProcAddress,eax invoke GetProcAddress,ebx,offset szGetModuleHandle mov lpGetModuleHandle
{ if ( NULL == hDllOne ) { break; } RetNFunc pFunc = (RetNFunc)GetProcAddress { if ( NULL == hDllTwo ) { break; } RetNFunc pFunc = (RetNFunc)GetProcAddress if ( NULL == hPlugin ) { break; } PluginFunc pFunc = (PluginFunc)GetProcAddress = pFun1 ) { printf( "MainRet1: %d\n", pFun1() ); } RetNFunc pFun2 = (RetNFunc)GetProcAddress "MainRet2: %d\n", pFun2()); } } 因为插件DLL已经被Exe加载,所以此处GetModuleHandle(NULL)会得到该进程Exe的模块句柄,GetProcAddress
修改项目属性: 高级配置 编写 ShellCode 32位 #include <windows.h> FARPROC getProcAddress(HMODULE hModuleBase); DWORD getKernel32(); int EntryMain() { // get function address :GetProcAddress typedef FARPROC(WINAPI * FN_GetProcAddress)( _In_ HMODULE hModule, _In_ LPCSTR lpProcName ); FN_GetProcAddress fn_GetProcAddress = (FN_GetProcAddress)getProcAddress((HMODULE)getKernel32()); // get function ); FN_GetProcAddress fn_GetProcAddress = (FN_GetProcAddress)getProcAddress((HMODULE)getKernel32
扫码关注腾讯云开发者
领取腾讯云代金券