首页
社区
课程
招聘
[原创][Hook][ws2_32.dll]
发表于: 2019-1-31 20:38 16360

[原创][Hook][ws2_32.dll]

2019-1-31 20:38
16360

目标程序:ws2_32.dll.

工具:

1.Visual Studio
2.DebugView

知识储备

1.dll的编写和加载流程.
2.Windows核心编程.
3.维基百科:Hooking.
4.Socket网络编程.

目标:

编写dll文件Hook调用ws2_32.dll的Send和Recv函数的程序,截取程序收发的数据包.

 

PS:当逆向程序时发现有反调试或是加壳,而你又暂时只需要程序的网络模块的收发数据时,Hook程序调用的网络函数是个不错选择.

思路

1.什么是API的Hook,原理和本质是什么,最后如何Hook?

  1. 实例:消息钩子算是Hook的一个实例.
  2. 原理:对函数内部进行挂钩处理,获取参数甚至修改执行流程跳转到自定义的函数中去执行.
  3. 本质:修改EIP指向的下一条指令,达到修改正常运行逻辑的目的.
  4. 操作:在目标函数内部修改字节,写入跳转地址的指令,防止程序崩溃需要在自定义函数中修复原先修改的内容后正常返回.

2.代码的编写流程是如何?

  1. Socket编程:编写两个示例分别调用Send/Recv函数进行通信.
  2. DLL编程:编写DLL文件获取Send/Recv的函数地址,进行挂钩截获数据.
  3. 注入利用:DLL的注入技术种类繁多,最为方便快捷有两种,远线程注入和注册表注入.

步骤

一、Socket编程

  • Recv_Server
#include "stdafx.h"
#define _WINSOCK_DEPRECATED_NO_WARNINGS 
#include 
#pragma comment(lib,"ws2_32.lib")
VOID eMsg(char* msg);
int _tmain(int argc, _TCHAR* argv[])
{
    //HINSTANCE hlib = LoadLibrary(L"afflux.dll");
    //if (!hlib)
    //    error_msg("error:000:loadlibrary_error\n");
    //init wsadata
    WSADATA wsd;
    int code;
    code = WSAStartup(MAKEWORD(2, 2), &wsd);
    if (code == SOCKET_ERROR)
        eMsg("error:001:init_error\n");
    if (HIBYTE(wsd.wVersion) != 2 || LOBYTE(wsd.wVersion) != 2)
        eMsg("error:002:version_error\n");

    //create socket
    SOCKET sSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sSocket == SOCKET_ERROR)
        eMsg("error:003:create_socket_error\n");
    //bind
    sockaddr_in Saddr;
    Saddr.sin_port = htons(0x1234);
    Saddr.sin_family = AF_INET;
    Saddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    code = bind(sSocket, (sockaddr*)&Saddr, sizeof(sockaddr));
    if (code == SOCKET_ERROR)
        eMsg("error:004:bind_socket_error\n");
    code = listen(sSocket, SOMAXCONN);
    if (code == SOCKET_ERROR)
        eMsg("error:005:listen_socket_error\n");
    printf("server>>\n");
    while (true)
    {
        SOCKET Csocket;
        sockaddr_in Caddr;
        int CaddrSize = sizeof(Caddr);
        Csocket = accept(sSocket, (sockaddr*)&Caddr, &CaddrSize);
        if (Csocket == INVALID_SOCKET)
            eMsg("error:006:accept_client_error\n");
        char buff[100] = "";
        code = recv(Csocket, buff, 100, 0);
        if (code == SOCKET_ERROR)
            eMsg("error:005:recv_server_error\n");
        printf("recv>>%s\n", buff);
    }
    return 0;
}
  • Send_Client
#include "stdafx.h"
#define _WINSOCK_DEPRECATED_NO_WARNINGS 
#include 
#pragma comment(lib,"ws2_32.lib")
VOID eMsg(char* msg);
int _tmain(int argc, _TCHAR* argv[])
{

    //HINSTANCE hlib = LoadLibrary(L"afflux.dll");
    //if (!hlib)
    //    error_msg("error:000:loadlibrary_error\n");
    //init wsadata
    WSADATA wsd;
    int code;
    code = WSAStartup(MAKEWORD(2, 2), &wsd);
    if (code == SOCKET_ERROR)
        eMsg("error:001:init_error\n");
    if (HIBYTE(wsd.wVersion) != 2 || LOBYTE(wsd.wVersion) != 2)
        eMsg("error:002:version_error\n");
    printf("Client>>\n");
    while (true)
    {
        //create socket
        SOCKET Csocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (Csocket == INVALID_SOCKET)
            eMsg("error:003:create_socket_error\n");
        //link
        sockaddr_in Saddr;
        Saddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
        Saddr.sin_family = AF_INET;
        Saddr.sin_port = htons(0x1234);
        int SaddrSize = sizeof(Saddr);
        code = connect(Csocket, (sockaddr*)&Saddr, SaddrSize);
        if (Csocket == INVALID_SOCKET)
            eMsg("error:004:link_server_error\n");
        char buff[100] = "";
        printf("input>>");
        gets_s(buff, 50);
        code = send(Csocket, buff, 50, 0);
        if (code == SOCKET_ERROR)
            eMsg("error:006:send_data_error\n");
        closesocket(Csocket);
    }
    return 0;
}

二、Hook_Dll编写


[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!

最后于 2020-2-20 15:09 被Weaving编辑 ,原因:
收藏
免费 6
支持
分享
最新回复 (11)
雪    币: 21
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
下载源码来研究。多谢
2019-2-1 11:58
0
雪    币: 12977
活跃值: (5703)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3

学习了,多谢楼主分享
2019-2-1 13:10
0
雪    币: 351
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢分享
2019-2-1 14:17
0
雪    币: 1372
活跃值: (5667)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
5
单线程是没问题 ,对于多线程 这些函数调用非常频繁,执行HOOK,以及恢复的时候,利用memcpy修改的是5个字节,可能别的线程此时刚好调用recv,memcpy尚未完成,导致指令错误崩溃。 有很多方式解决 一种是利用 Interlock系列函数修改8字节,这样可能会导致错过一些调用。可以在另外的地方申请内存写入调用头,采取二次跳转,参考detours,还可以IAT EAT HOOK解决!!
最后于 2019-2-1 14:48 被IamHuskar编辑 ,原因:
2019-2-1 14:47
0
雪    币: 2577
活跃值: (13159)
能力值: ( LV12,RANK:312 )
在线值:
发帖
回帖
粉丝
6
3feK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3f1#2x3h3y4@1L8#2)9J5k6h3y4G2L8g2)9J5c8U0p5K6x3K6f1J5x3o6M7&6i4K6u0r3x3U0x3@1y4K6t1J5z5l9`.`.
2019-2-1 16:51
0
雪    币: 300
活跃值: (2672)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
mark
2019-2-2 14:13
0
雪    币: 1535
活跃值: (695)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
mark
2019-2-3 09:41
0
雪    币: 11
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
mark
2019-5-27 13:27
0
雪    币: 86
活跃值: (1378)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
源码没得下载了?
2020-2-17 22:14
0
雪    币: 53
活跃值: (528)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
煞有介事的瞎搞。
2020-2-29 22:01
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
下载不了??
2020-4-4 20:26
0
游客
登录 | 注册 方可回帖
返回