首页
社区
课程
招聘
[求助][求助]ws2_32.dll的劫持
发表于: 2014-9-7 11:50 7750

[求助][求助]ws2_32.dll的劫持

2014-9-7 11:50
7750
这个ID是几年前一个前辈给我的,在今天之前我是完全没接触过crack之类的东西...

最近需要做一个针对单个进程的透明代理,我可以使用remote hook或者wpcap来做这个事情,但都有其缺点,所以考虑到了dll劫持这个方法。通过搜索找到了Aheadlib这个工具,编译出ws2_32.dll后放在相应进程的目录下完全OK。下面是我做的调整。

环境:win7 ultimate 32, vs2010 sp1
Aheadlib:即时调用/需要时载入/直接跳入

我需要在connect中拿到进程要连接的地址端口,通过sock4协议连接到代理服务器上,也就是说我要在AheadLib_connect中使用connect/send/recv这几个函数。
考虑到我知道connect函数的参数,我就将AheadLib中的实现替换为
extern "C" __declspec(dllexport)  int __cdecl AheadLib_connect ( SOCKET sock, sockaddr *addr, int nlen )
{  
  connect_ptr  foo_connect = (connect_ptr)GetProcAddress(m_hModule, "connect");
  send_ptr  foo_send  = (send_ptr)GetProcAddress(m_hModule, "send");
  recv_ptr  foo_recv  = (recv_ptr)GetProcAddress(m_hModule, "recv");

  sockaddr_in addr_proxy;
  //连接代理服务器的socket地址,代码略去

  int ret = foo_connect( sock, (sockaddr *)&addr_proxy, sizeof(addr_proxy) );

  if( 0 == ret )
  {
    sock4_header _msg;
    //赋值代码略去
    ret = foo_send( sock, (char *)&_msg, sizeof(_msg), 0 );
    if( ret > 0 )
    {
      char buf[128] = {0};
      ret = foo_recv( sock, buf, 8, 0 );
      if( ret > 0 && buf[1] == PROXY_RESPONSE_OK )
      {
        //OK
        return 0;
      }
    }
  }
  return -1;
}


1、在我的台式机上试验成功。对于recv函数,如果我使用GetProcAddress拿到的函数指针,调用的话就会产生ESP错误,应该是参数栈出问题了,直接使用recv则没问题。
2、在我的笔记本上(环境相同),执行完毕recv并能够打印出代理连接成功的日志,但我的测试进程在并没有打印connect成功的日志,所以应该是返回之后导致什么地方溢出了。

我的问题是,
对于我已经知道的函数声明,是否可以通过我修改实现的方式直接用c/c++代码来做我想做的工作?

已解决,结论是可行的。我之前的问题是自己代码的问题

在此先谢过各位大神。

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

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
已经解决,结论是可以这样做
AheadLib导出的方式是__cdecl, 使用c/c++这种方式导出用的是__stdcall, 所以只需要修改AheadLib生成代码中你要实现函数的声明为__stdcall即可。
如果不修改声明,需要按通常方式从esp+4开始拿到参数,调用完其它以__cdecl方式声明的函数后add esp
2014-9-8 10:26
0
游客
登录 | 注册 方可回帖
返回
//