首页
论坛
课程
招聘
[原创]Hook URLDownLoadToFile
2009-12-16 22:39 5944

[原创]Hook URLDownLoadToFile

2009-12-16 22:39
5944
Hook URLDownLoadToFile,进入自己的函数,弹出是否下载,是则再次调用URLDownLoadToFile下载文件,否则不下载,返回。
可是点是时,再次调用URLDownLoadToFile,被注入的程序自己动退出了。
点否调用MESSAGEBOX,被注入程序可以回到流程中。二晚了,还没想通。
大虾指点下。。
====================================================

// SimpleHook.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "urlmon.h"
#include "windows.h"
#pragma comment(lib,"urlmon.lib");

BYTE orig_code[8] = {0x0, 0x0, 0x0, 0x0, 0x0,0x0,0x0,0x0};
BYTE hook_code[8] = { 0xB8, 0x0, 0x0, 0x40, 0x0,0xFF,0xE0,0x0 };

ULONG OldProc;
ULONG OldProc2;

//HANDLE Event = NULL;

///////////////////////////////////////////////////////
HRESULT __stdcall MY_URLDownloadToFile(
LPUNKNOWN pCaller,
LPCTSTR szURL,
LPCTSTR szFileName,
DWORD dwReserved,
LPBINDSTATUSCALLBACK lpfnCB
)
{
        LPUNKNOWN pCaller1 = pCaller;
        LPCTSTR szURL1 = szURL;
        LPCTSTR szFileName1 = szFileName ;
        DWORD dwReserved1 = dwReserved;
        LPBINDSTATUSCALLBACK lpfnCB1 = lpfnCB;
        DWORD dwOldProtect;
        int ret;

        //WaitForSingleObject(Event,INFINITE);
        
        if(MessageBox(NULL,"要下载吗?",NULL,MB_YESNO)==IDYES)
        {

                //VirtualProtect((LPVOID)OldProc, 8, PAGE_EXECUTE_READWRITE, &dwOldProtect);
        //VirtualProtect((LPVOID)OldProc2, 8, PAGE_EXECUTE_READWRITE, &dwOldProtect);
                 MessageBox(0,szURL,"点了确定",0);
        memcpy((BYTE *)OldProc, orig_code, 8);
        memcpy((BYTE *)OldProc2, orig_code, 8);

         ret = URLDownloadToFileA(pCaller1,szURL1,szFileName1,dwReserved1,lpfnCB1);

         memcpy((BYTE *)OldProc, hook_code, 8);
        memcpy((BYTE *)OldProc2, hook_code, 8);
                                  //SetEvent(Event);
                  return ret;  //return ret?   return 0?
        }
        else{
                   MessageBox(NULL,"到消下载。",NULL,0);
            return 0;
        }
        
}

void hook_func()
{
        DWORD dwOldProtect;
        
        OldProc = (ULONG)GetProcAddress(GetModuleHandle("urlmon.dll"),"URLDownloadToFileA");
        if(!VirtualProtect((LPVOID)OldProc, 8, PAGE_EXECUTE_READWRITE, &dwOldProtect))
        {
                return;
        }

        OldProc2 = (ULONG)GetProcAddress(GetModuleHandle  ("urlmon.dll"),"URLDownloadToFileW");
        if(!VirtualProtect((LPVOID)OldProc2, 8, PAGE_EXECUTE_READWRITE,  &dwOldProtect))
        {
                return ;
        }
  
   
           memcpy(orig_code, (BYTE *)OldProc, 8);
            *((ULONG*)(hook_code+1) ) = (ULONG)MY_URLDownloadToFile
           // 修改原始入口
        memcpy((BYTE *)OldProc, hook_code, 8);

             memcpy((BYTE *)OldProc2, hook_code, 8);       

}

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD  ul_reason_for_call,
LPVOID lpReserved
)
{
              DWORD ThreadId;

        switch (ul_reason_for_call)
        {
                case DLL_PROCESS_ATTACH:
        /Event = CreateEvent(NULL,FALSE,TRUE,NULL);
                MessageBox(NULL,"Inject OK",NULL,0);
        hook_func();
                break;
                case DLL_PROCESS_DETACH:

                break;       
        }
        return TRUE;       
}

第五届安全开发者峰会(SDC 2021)10月23日上海召开!限时2.5折门票(含自助午餐1份)

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (7)
雪    币: 226
活跃值: 活跃值 (28)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
鹿剑 活跃值 3 2009-12-17 12:17
2
0
感觉作用不大,这个函数太顶层了,可以下载东西的方法太多了……用socket就可以下载了
雪    币: 226
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
glgxyyxh 活跃值 2009-12-17 22:42
3
0
想法是拦SHELLCODE里的调用,才那么些字节,要完成SOCKET下载就太难了吧。。
雪    币: 226
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
glgxyyxh 活跃值 2009-12-17 23:54
4
0
如果被注入程序静态链接urlmon.dll,再调用URLDOWNLOADTOFILE。
是可以正返回的,改成动态链接就不行了。
雪    币: 229
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
binglan212 活跃值 2009-12-19 22:04
5
0
用Detour多好
主要应该hook  LoadLibrary,
雪    币: 6
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zjein 活跃值 2009-12-20 03:04
6
0
之前看到你在楼里发了
楼主采用的是 8 字节的 hook, 但是保存代码时出问题了

//URLDownloadToFileA

421378F5 >    8BFF                   mov edi,edi
421378F7  /.  55                     push ebp
421378F8  |.  8BEC                   mov ebp,esp
421378FA  |.  81EC 10010000          sub esp,110

//URLDownloadToFileW
421377AA >/$  8BFF                   mov edi,edi
421377AC  |.  55                     push ebp
421377AD  |.  8BEC                   mov ebp,esp
421377AF  |.  56                     push esi
421377B0  |?  57                     push edi
421377B1  |?  68 54010000            push 154

仔细看好了,这二个函数,头8字节并不一样的,

你将 URLDownloadToFileA 的8字节 memcpy 到 URLDownloadToFileW 执行肯定会出错

出错代码
memcpy(orig_code, (BYTE *)OldProc, 8);       

应该用二个变量 分析保存 URLDownloadToFileA  URLDownloadToFileW
雪    币: 226
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
glgxyyxh 活跃值 2009-12-21 21:35
7
0
感谢ZJEIN的指点。
调试好了

注册看雪有一段时间了,几乎没用过OD,想跟下程序时,不懂跟!得学习下才行。。。。
雪    币: 102
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bnbpbl 活跃值 2009-12-23 00:00
8
0
学习了....谢谢
游客
登录 | 注册 方可回帖
返回