吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4269|回复: 7
收起左侧

[其他转载] 实现Win10下Delphi 10.3.1 inline hook 域名转向之InternetConnectA

[复制链接]
bester 发表于 2019-8-17 19:06
本帖最后由 bester 于 2019-8-17 19:10 编辑

好几年前,飘零金盾的山寨,域名转向还是个高端的东西,那时候梦想能自己实现易语言的HOOK,可是始终没有大佬能公布源码,或者公布的都是C的源码,无非都是调用逆缘的DLL,自己用E加个调用窗体就是所谓的xx专版域名转向,今日想起来这个事,随手做一下吧,等会看一下封包的Send和Recv能不能实现。

引用mq5123的回复:

一般破解来说验证方式都是tcp,http/https post/get 提交
InternetOpenA 创建句柄
InternetConnectA 建立连接
HttpOpenRequestA 创建http请求
HttpSendRequestA 发送请求
InternetReadFile 读取返回数据
InternetCloseHandle 关闭句柄
这个也看验证种类了,易游、核盾什么的都可以,不过例如飘零金盾什么的就不行,
这种应该没有调用这类api,而是自行构建了send请求,一般这种情况给
send
sendto
WSASend
下发包断点
recv
recvfrom
WSARecv
下收包断点

实现前(访问的是百度):
1.jpg
实现后(访问52破解):
2.jpg

易语言访问网页的源码:添加一个超文本浏览框,在_启动窗口创建完毕下面写 超文本浏览框1.地址=“www.baidu.com

以下为Delphi实现HOOK源码:
[Delphi] 纯文本查看 复制代码
library Project1;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  System.SysUtils,
  System.Classes,
  wininet, //加载wininet库,不然无法调用InternetConnectA函数
  Winapi.Windows;  //加载常用API库





function MyMoveMemo(old: Pointer; New: Pointer; size: Integer): integer; stdcall; external 'kernel32.dll' name 'RtlMoveMemory';     //内存移动复制函数,这里暂时用不到

{$R *.res}
var
  read: array[0..4] of Byte;  //保存的API的头部5个字节,方便还原
  rd: NativeUInt;   //读内存API函数的最后一个参数
  apiaddr: Integer;       //API首地址


// 参数:权限名称 ,返回: 成功返回TRUE
Function AdjustProcessPrivilege(Token_Name: Pchar): Boolean;
var
  Token: THandle;
  TokenPri: TOKEN_PRIVILEGES;
  ProcessDest: int64;
  PreSta: DWORD;
begin
  Result := False;
  if OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES,Token) then
    begin
      if LookupPrivilegeValue(nil,Token_Name,ProcessDest) then
        begin
          TokenPri.PrivilegeCount := 1;
          TokenPri.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
          TokenPri.Privileges[0].Luid := ProcessDest;
          PreSta := 0;
          if AdjustTokenPrivileges(Token,False,TokenPri,sizeof(TokenPri),nil,PreSta) then
            begin
              Result := True;
            end;
        end;
    end;
end;


function MyInternet(hInet: HINTERNET; lpszServerName: LPSTR;nServerPort: INTERNET_PORT; lpszUsername: LPSTR; lpszPassword: LPSTR;dwService: DWORD; dwFlags: DWORD; dwContext: DWORD_PTR): HINTERNET;stdcall;      //我们构造的函数,从API头跳到我们这个函数当中,方便我们做事
var
  I: Integer;     //循环次数变量,每次都要写入1个字节,还原API头
  reads: byte;   //取出我们保存的5个字节,然后循环写入
begin
  for I := 1 to 5 do
  begin
    reads := read[I - 1];   //因为数组下标从0开始,I是从1开始,则用I-1
    WriteProcessMemory(GetCurrentProcess, Pointer(apiaddr + I - 1), Pointer(@reads), 1, rd);
  end;
Result:=InternetConnectA(hInet,PAnsiChar('www.52pojie.cn'),nServerPort,lpszUsername,lpszPassword,dwService,dwFlags,dwContext);   //就是将第二个参数的域名改成自己的,然后转PansiChar类型,就没有了,其他不用管,非常简单
end;

function lens(x, y: Integer): Integer;              //取跳转长度
begin
  Result := x - y - 5;
end;
procedure MyMian();                               //将HOOK操作封装成一个过程,我称为MyMain
var
  jmps: Integer;
  lengths: Integer;
begin
  AdjustProcessPrivilege('SeDebugPrivilege');      //提权函数,不用管 ,可以不写,但是如果写入内存失败,就要用提权,我这边测试可以不用提权也能写入
  apiaddr := Integer(GetProcAddress(LoadLibrary('wininet.dll'), 'InternetConnectA'));  //获取API地址
  ReadProcessMemory(GetCurrentProcess, Pointer(apiaddr), Pointer(@read), 5, rd);           //读前5个字节
  jmps := 233;                                                                             //这里是jmp的10进制,16进制的E9
  lengths := lens(Integer(@MyInternet), apiaddr);                                               //计算长度
  WriteProcessMemory(GetCurrentProcess, Pointer(apiaddr), Pointer(@jmps), 1, rd);          //开始写入jmp
  WriteProcessMemory(GetCurrentProcess, Pointer(apiaddr + 1), Pointer(@lengths), 4, rd);   //开始写入长度
end;
begin
 MyMian()                                                                             //这里是DLLmain,会首先调用这里,所以我们这里直接将HOOK封装成一个过程,然后直接调用这个过程
end.

免费评分

参与人数 3吾爱币 +5 热心值 +3 收起 理由
nshark + 1 + 1 谢谢@Thanks!
苏紫方璇 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
朱朱你堕落了 + 1 + 1 骚操作。!!!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

冥界3大法王 发表于 2019-8-17 19:31
引入四个外员不错。
wenyuanzh 发表于 2019-8-17 20:03
头像被屏蔽
yulinsoft 发表于 2019-8-24 10:22
haokucn 发表于 2019-10-30 14:55
非常好的代码,学习了
nshark 发表于 2019-11-2 09:32
学习了~~~~
Bachelor硕 发表于 2021-1-20 23:35
LZ  我现在用delphi hook地址  然后跳转自己函数  再跳转回来下一指令如何实现?  我现在跳转回下条指令继续执行就会报错。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 20:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表