扩展接口?加壳?

伊始

  各位小伙伴们好呀!不知道小伙伴们在遇到过,原需求我不想动,但我扩展新功能,但你不能影响以前的功能,构架不能动,总之我只要扩展,能不动的就别动。那这可怎么办呢,哎!
  为了解决这个需求,我要思考下。umm,分为两种。

序号 需求
1 在业务中间加统计、校验
2 在弃用的接口做新的东西

这两种都可以看作为,函数执行顺序要变化。
  这里我们就可以用到API HOOK技术了,此技术在于修改IAT(导入地址表),然后先执行我们扩展的的业务,至于是否要继续在走接下来的业务就看实际需求了。

主体

  不墨迹了,直接干货!
  需要用到的API如下:

序号 API&其他
1 GetCurrentProcess()
2 LoadLibrary()
3 VirtualProtectEx
4 WriteProcessMemory
5 _asm(嵌入汇编)

  这次,我们打算以最简单的方式来扩展接口,我先就以”User32.dll“,因为大多数程序都会加载它。如果你想hook自己的dll,那么就请换成自己的。

第一步:获取当前“空间”

获取当前进程
HANDLE WINAPI GetCurrentProcess(
    VOID
    );

第二步:获取User32.dll加载的地址

HMODULE WINAPI LoadLibraryW(
    _In_ LPCWSTR lpLibFileName
    );

第三步:获取MessageBox的地址

FARPROC WINAPI GetProcAddress(
    _In_ HMODULE hModule,
    _In_ LPCSTR lpProcName
    );

第四步:就要修改入口地址了`,如果还需要保留原来的业务,请先备份一下地址

 _asm
 {
  lea edi, oldAddr            // 保存旧地址
   mov esi, oldMSGBox   // 获取到旧地址
   cld                        
   movsd                   
   movsb                    
 }
 Code[0] = 0xe9; //这个汇编的jmp跳转指令,相对跳转
 _asm
 {
  lea eax, MyMSGBox
   mov ebx, oldMSGBox
   sub eax, ebx
   sub eax, LEN
   mov dword ptr[Code + 1], eax
 }

第五步:将修改好的地址,放到IAT(导入地址表)中。

开辟空间
BOOL WINAPI VirtualProtectEx(
    _In_ HANDLE hProcess,
    _In_ LPVOID lpAddress,
    _In_ SIZE_T dwSize,
    _In_ DWORD flNewProtect,
    _Out_ PDWORD lpflOldProtect
    );
写入
BOOL WINAPI WriteProcessMemory(
    _In_ HANDLE hProcess,
    _In_ LPVOID lpBaseAddress,
    _In_reads_bytes_(nSize) LPCVOID lpBuffer,
    _In_ SIZE_T nSize,
    _Out_opt_ SIZE_T * lpNumberOfBytesWritten
    );

至此完毕,调用函数即可执行我们的新业务代码。

注:如果需要取消API Hook,请恢复原入口即可。

扫描二维码关注公众号,回复: 10652821 查看本文章

`

发布了5 篇原创文章 · 获赞 10 · 访问量 72

猜你喜欢

转载自blog.csdn.net/itsaoght/article/details/105419303