扩展接口?加壳?

伊始

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

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

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

主体

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

序号API&其他
1GetCurrentProcess()
2LoadLibrary()
3VirtualProtectEx
4WriteProcessMemory
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,请恢复原入口即可。

`

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值