首页
社区
课程
招聘
[求助]DLL拦截 ws2_32.dll, 出现的疑惑, 请大神解惑
发表于: 2017-6-8 16:39 3892

[求助]DLL拦截 ws2_32.dll, 出现的疑惑, 请大神解惑

2017-6-8 16:39
3892

1、在我的DLLMain中加载系统的 ws2_32.dll, 并把 ws2_32.dll中的所有函数地址都保存下来, 例如:  

FARPROC connectAddr = GetAddress("connect");

2、在我的导出函数中直接调用真正的函数地址, 例如:

ALCDECL MyHijack_connect(void)
{
    __asm JMP connectAddr;
}

主程序可以正常运行, 并且可以调用到我的dll

但是如果我想在程序中做些什么, 比如想查看新连接的地址和端口, 如下

ALCDECL TESTInet_ntoa(in_addr addr)
{
    __asm JMP inet_ntoaAddr;
}
void __cdecl PrintConnect()
{
    void* espaddr = NULL;
    __asm mov espaddr, ebp;
    int Sock = *((int*)((char*)espaddr + 8));
    struct sockaddr_in* addr = *(struct sockaddr_in**)((char*)espaddr + 12);
    int nameLen = *((int*)((char*)espaddr + 16));
    USHORT port = addr->sin_port;
    char* linkaddr = NULL;
    __asm
    {
        mov eax, 0;
        mov ax, word ptr port;
        push eax;
        call ntohsAddr;
        mov port, ax;
    }
    TESTInet_ntoa(addr->sin_addr);
    __asm mov linkaddr, eax;
    char buf[22] = { 0 };
    sprintf_s(buf, "%s:%d", linkaddr, port);
    MessageBoxA(NULL, buf, "新连接", MB_OK);
    __asm mov esp, ebp;
    __asm pop ebp;
    __asm ret;
}
ALCDECL MyHijack_connect(void)
{
    __asm
    {
        sub ESP, 12;
        push esi;
        push edi;
        push eax;
        MOV esi, esp;
        add esi, 28;
        MOV edi, esp;
        add edi, 12;
        MOV eax, [esi];
        MOV [edi], eax;
        add esi, 4;
        add edi, 4;
        MOV eax, [esi];
        MOV [edi], eax;
        add esi, 4;
        add edi, 4;
        MOV eax, [esi];
        MOV [edi], eax;
        pop eax;
        pop edi;
        pop esi;
        call PrintConnect;
    }
    __asm add esp, 12;
    __asm JMP connectAddr;
}

可以弹出俩个新连接的窗口, 但是之后程序就没反应了, 任务管理器里进程也没了, 我查看了调用完 PrintConnect 出来后的esp也就是 __asm add esp, 12;  这时候的esp值和刚进MyHijack_connect时的值一样, 不知道为什么会启动不了

还有就是如下代码也不行

void __cdecl PrintConnect()
{
    __asm JMP connectAddr;
}
ALCDECL MyHijack_connect(void)
{
    __asm JMP PrintConnect;
}

完全没有动esp, 为什么多了一层  jmp  后程序就不正常了呢


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 12848
活跃值: (9142)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
2
DllMain不可调用LoadLibrary
2017-6-8 16:56
0
雪    币: 9
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
hzqst DllMain不可调用LoadLibrary
为什么,  那应该在哪里调用  LoadLibrary
2017-6-8 17:04
0
雪    币: 12848
活跃值: (9142)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
4
tianyabin 为什么, 那应该在哪里调用 LoadLibrary
开一个线程去做
2017-6-8 17:07
0
雪    币: 9
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
hzqst DllMain不可调用LoadLibrary
我现在的  DLLMain  代码是这样的
BOOL  WINAPI  DllMain(HMODULE  hModule,  DWORD  dwReason,  PVOID  pvReserved)
{
        if  (dwReason  ==  DLL_PROCESS_ATTACH)
        {
                DisableThreadLibraryCalls(hModule);
                if  (Load())
                {
                        Hijack();
                }
        }
        else  if  (dwReason  ==  DLL_PROCESS_DETACH)
        {
                Free();
        }
        return  TRUE;
}

Load函数是这样的
inline  BOOL  WINAPI  Load()
  {
                m_hModule  =  LoadLibrary("C:\\Windows\\System32\\ws2_32.dll");
                if  (m_hModule  ==  NULL)
                        return  FALSE;
                FreeAddrInfoExAddr  =  GetAddress("FreeAddrInfoEx");
                FreeAddrInfoExWAddr  =  GetAddress("FreeAddrInfoExW");
                ........
                return  (m_hModule  !=  NULL);
}
2017-6-8 17:09
0
雪    币: 9
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
hzqst 开一个线程去做
好的,  我试下
2017-6-8 17:10
0
雪    币: 9
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
hzqst 开一个线程去做
增加了线程,  但是新线程好像没有执行
2017-6-8 17:33
0
雪    币: 26
活跃值: (79)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
用LSP撸它,还简单些
2017-6-8 17:36
0
雪    币: 9
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
rlive 用LSP撸它,还简单些
不会啊
2017-6-8 17:38
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
hzqst DllMain不可调用LoadLibrary
一定条件下是可以调用  LoadLibrary  的,  比如目标DLL要导入的DLL已经被加载了,  一个最简单的例子就是劫持lpk时,在入口可以调用LoadLibrary  来加载系统的lpk.dll
2017-6-8 18:55
0
雪    币: 7515
活跃值: (5347)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
void  __cdecl  PrintConnect(),问题应该出在这.没必要写成,cdecl,可以带参数,也没必要最好自己修改spb,ebp
2017-6-8 21:47
0
雪    币: 23
活跃值: (1376)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
简单点  ,自己写个程序调用connect,  用帖子里的  代码去HOOK    connect  ,然后  调试器去调试    看问题在哪.
2017-6-9 00:11
0
雪    币: 223
活跃值: (292)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
估计堆栈的原因.
2017-6-9 20:57
0
雪    币: 211
活跃值: (118)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
增加log输出,确定下问题在哪儿,确定下程序执行到的位置。  静态分析哪有动态运作直观。。
2017-6-10 16:45
0
游客
登录 | 注册 方可回帖
返回
//