DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: delifei
今日帖子: 46
在线用户: 12
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
女 vivee (vivee) ★☆☆☆☆ -
注册会员
2018/9/7 0:24:25
标题:
付费请教如何使用indy登录淘宝后取卖家后台商品数据~~~~ 浏览:579
加入我的收藏
楼主: 我正常使用webbrowser能登录淘宝并进入后台,但使用indy控件模拟webbrowser,构造所有的head头(包括cookie),访问淘宝卖家后台失败,自动就转到登录界面。烦扰多天,试过了网上各种公开方法,尝试了各种组合都无果,所以特请各位delphi大神出手,有偿帮助解决,谢谢大家了,QQ 59225848,mob 13376053266
----------------------------------------------
-
作者:
男 go_on (go_on) ★☆☆☆☆ -
盒子活跃会员
2018/9/7 8:27:38
1楼: webbrowser上应该是有一个安全登录空间的,你应该登录不上的。

猜测解决办法:应该是有二次开发接口的,很多淘宝的插件供应商做插件应该是通过二次开发接口
----------------------------------------------
www.eudn.net工程师联合开发网
作者:
男 bahamut8348 (leonna) ▲▲▲▲▲ -
普通会员
2018/9/7 8:56:42
2楼: 用curl。
----------------------------------------------
--
作者:
女 vivee (vivee) ★☆☆☆☆ -
注册会员
2018/9/7 11:06:36
3楼: 1楼的兄弟:淘宝是有二次开发接口的,但貌似现在申请不了开放平台了,所以我用折中的方法来解决的~~~

2楼的兄弟:能详细指导一下吗?不会哎:(
----------------------------------------------
-
作者:
男 star5 (星五) ★☆☆☆☆ -
盒子活跃会员
2018/9/7 12:10:57
4楼: http://open.taobao.com/
----------------------------------------------
博客 - http://offeu.com
作者:
女 vivee (vivee) ★☆☆☆☆ -
注册会员
2018/9/7 14:18:20
5楼: 刚用curl的get方法试过了,不知道是不是方法有问题,跟idhttp结果是一样的
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲△ -
普通会员
2018/9/7 14:29:11
6楼: 安全登录控件就是一个解决办法。
这个 控件 会告诉你 cookei或者免登陆 url 应该是什么。

一楼早早的就告诉了你答案,你不相信而已。
----------------------------------------------
(C)(P)Flying Wang
作者:
女 vivee (vivee) ★☆☆☆☆ -
注册会员
2018/9/7 14:38:09
7楼: @wang_80919  怎么使用这个安全登录控件啊?麻烦告诉我个联系方式,私下请教你呢
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲△ -
普通会员
2018/9/7 15:13:09
8楼: 你先准备好500万人民币,我就告诉你我支付宝账号。
然后,用支付宝联系。
----------------------------------------------
(C)(P)Flying Wang
作者:
女 vivee (vivee) ★☆☆☆☆ -
注册会员
2018/9/7 15:24:58
9楼: 按此在新窗口浏览图片
----------------------------------------------
-
作者:
男 cntlis (cntlis) ▲▲△△△ -
注册会员
2018/9/7 15:29:15
10楼: 我可以搞定,需要用到hook技术
----------------------------------------------
-
作者:
女 vivee (vivee) ★☆☆☆☆ -
注册会员
2018/9/7 15:37:36
11楼: @cntlis 有联系方式吗?求教
----------------------------------------------
-
作者:
男 cntlis (cntlis) ▲▲△△△ -
注册会员
2018/9/7 16:06:52
12楼:
var
  FCookieMgr: TIdCookieManager;
  FHook: array[0..1] of TPNHook;
  FCookieHdl: OleVariant;
  FCsConnection: TRTLCriticalSection;
  FCookieList: TStrings;
  FExePath: String;

function PCEFunc_InternetSetCookie(lpszUrl, lpszCookieName,
  lpszCookieData: PChar): BOOL; stdcall;
var
  FNewCookieData: String;
type
  TInternetSetCookie = function (lpszUrl, lpszCookieName,
  lpszCookieData: PChar): BOOL; stdcall;
begin
  FNewCookieData:= lpszCookieData;
  FNewCookieData:= StringReplace(FNewCookieData, 'HttpOnly', '', [rfReplaceAll, rfIgnoreCase]);
  FHook[0].UnHook;
  Result:= TInternetSetCookie(FHook[0].FBaseAdd)(lpszUrl, lpszCookieName,
  lpszCookieData);
  FHook[0].Hook;
end;

procedure PCEFunc_LogHttpResponseHeader(HRequest: HINTERNET);
var
  FlpvBuffer: Pointer;
  FlpdwBufferLength: DWORD;
  FlpdwReserved: DWORD;
  FStrHeader, FStrTemp: STring;
  FCookieIdx, FCookieBegin, FCookieLen: Integer;
begin
  FlpdwBufferLength:= 10240;
  FlpdwReserved:= 0;
  try
    EnterCriticalSection(FCsConnection);
    GetMem(FlpvBuffer,FlpdwBufferLength);
    if HttpQueryInfo(HRequest,HTTP_QUERY_RAW_HEADERS_CRLF,FlpvBuffer,FlpdwBufferLength,FlpdwReserved) then begin
//      FormMain.mmo1.Lines.Add(PChar(FlpvBuffer));
      FStrHeader:= PChar(FlpvBuffer);
      FPNWriteLnText(FExePath+ 'log.txt', PChar(FlpvBuffer));
      FCookieIdx:= 1;
      FCookieBegin:= QuickPos('Set-Cookie:', FStrHeader, FCookieIdx);
      while FCookieBegin>0 do begin
        FStrTemp:= Copy(FStrHeader, FCookieBegin+11, 500);
        FCookieLen:= Pos(#13, FStrTemp);
        FCookieMgr.AddCookie(Copy(FStrTemp, 1, FCookieLen), 'taobao.com');
        FCookieList.Add(Copy(FStrTemp, 1, FCookieLen));
        Inc(FCookieIdx);
        FCookieBegin:= QuickPos('Set-Cookie:', FStrHeader, FCookieIdx)
      end;

//      Pos()
    end;
  finally
    FreeMem(FlpvBuffer);
    LeaveCriticalSection(FCsConnection);
  end;
end;

function PCEFunc_InternetCloseHandle(hInet: HINTERNET): BOOL; stdcall;
type
  TInternetCloseHandle= function (hInet: HINTERNET): BOOL; stdcall;

begin
----------------------------------------------
-
作者:
男 cntlis (cntlis) ▲▲△△△ -
注册会员
2018/9/7 16:07:47
13楼: 我之前的核心代码,就是这些,Hook到wininet.dll里边就OK了
----------------------------------------------
-
作者:
男 cntlis (cntlis) ▲▲△△△ -
注册会员
2018/9/7 16:11:08
14楼: 这个和Idhttp或者是CURL没有关系,就是和你获取cookie的方式有关,传统的获取Cookie的方式是不行的
----------------------------------------------
-
作者:
女 vivee (vivee) ★☆☆☆☆ -
注册会员
2018/9/7 16:13:16
15楼: 谢谢啦,一会儿就试验~~~~
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲△ -
普通会员
2018/9/7 16:30:13
16楼: 怪不得那么多盗号,银行盗刷的。原来 HOOK 一下就行了。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 cntlis (cntlis) ▲▲△△△ -
注册会员
2018/9/7 16:44:13
17楼: 盗号那些也是一种HOOK,不过他们HOOK的也是有多种方式 ,直接HOOK到驱动层,然后捕获到硬件信号,那种是直接的把密码都给HOOK走了
楼主这种,只需要普通的函数hook,把完整的Cookie拿到就好了,原理不同
----------------------------------------------
-
作者:
男 nevergrief (孤独骑士) ★☆☆☆☆ -
盒子活跃会员
2018/9/7 17:12:19
18楼: Hook到wininet.dll里? 怎么hook,用CreateRomoteThread?还请cntlis明示
----------------------------------------------
只有偏执狂才能生存!
作者:
男 cntlis (cntlis) ▲▲△△△ -
注册会员
2018/9/7 17:21:18
19楼: unit uPN_Func_Hook;

interface

uses
  Windows, Messages, Classes, SysUtils;

type

  PTIMPORT_CODE = ^TIMPORT_CODE;
  TIMPORT_CODE = packed record
    JmpPtr: Word;
    PtrAdd: ^Pointer;
  end;

  //Hook类相关类型
  TJmpCode=packed record  //8字节
    MovEax:Byte;
    Addr:DWORD;
    JmpCode:Word;
    dwReserved:Byte;
  end;

  /// 用来替换API函数的Hook
  /// 注意,除了这个类,还需要创建一个全局的钩子,才能保证全局
  TPNHook = class(TObject)
  private
    FDllModule:HMODULE; //DLL的句柄
    FDllNeedFree: Boolean;
    FProcess:THandle; //当前进程句柄
    FNewAdd:TJmpCode;
    FOldAdd:array[0..7] of Byte;
    FReadOK:Boolean;  //是否得到了函数的地址
  public
    FBaseAdd:Pointer; //函数的入口地址
    /// <summary>TPNHook.Create
    /// </summary>
    /// <param name="ADllName"> 要修改的函数所在的DLL名字 </param>
    /// <param name="AFuncName"> 要Hook的函数名字 </param>
    /// <param name="ANewFunc"> 要替换的函数指针 </param>
    constructor Create(ADllName, AFuncName: string; ANewFunc: Pointer);
    destructor Destroy; override;
    /// Hook Api函数
    procedure Hook;
    /// UnHookApi
    procedure UnHook;
  end;

  /// <summary>获取API函数的真实地址
  /// </summary>
  /// <returns> Pointer
  /// </returns>
  /// <param name="APointer"> 函数指针 </param>
  function PNFunc_ApiAdd(APointer: Pointer): Pointer;


implementation

function PNFunc_ApiAdd(APointer: Pointer): Pointer;
begin
   Result := APointer;
   if APointer= nil then
      exit;
   try
      if (PTIMPORT_CODE(APointer).JmpPtr = $25FF) then
        Result := PTIMPORT_CODE(APointer).PtrAdd^;
   except
      Result := nil;
   end;
end;

constructor TPNHook.Create(ADllName, AFuncName: string; ANewFunc: Pointer);
var
  FReserved:DWORD;
begin
  inherited Create;
  //获取模块句柄(即DLL的句柄)
  FDllModule:=GetModuleHandle(PChar(ADllName));
  FDllNeedFree:= False;
  //如果得不到说明未被加载,重新加载
  if FDllModule=0 then begin
    FDllModule:=LoadLibrary(PChar(ADllName));
    FDllNeedFree:= True;
  end;
  //得到函数入口地址(基址)
  FBaseAdd:=Pointer(GetProcAddress(FDllModule,PChar(AFuncName)));
  //获取当前进程句柄
  FProcess:=GetCurrentProcess;
  //指向新地址的指针
  FNewAdd.MovEax:=$B8;
  FNewAdd.Addr:=DWORD(ANewFunc);
  FNewAdd.JmpCode:=$E0FF;

  //保存原始地址至OldAdd
  FReadOK:=ReadProcessMemory(FProcess,FBaseAdd,@FOldAdd,SizeOf(TJmpCode),FReserved);

  Hook;
end;

destructor TPNHook.Destroy;
begin
  UnHook;
  try
    if (FDllModule>0) and FDllNeedFree then FreeLibrary(FDllModule);
//    CloseHandle(FProcess);
  except
  end;
  inherited;
end;

procedure TPNHook.Hook;
var
  FReserved:DWORD;
begin
  if FReadOK then
    //写入新的地址
    WriteProcessMemory(FProcess,FBaseAdd,@FNewAdd,SizeOf(TJmpCode),FReserved);
end;

procedure TPNHook.UnHook;
var
  FReserved:DWORD;
begin
  if FReadOK then
    //写入老的地址
    WriteProcessMemory(FProcess,FBaseAdd,@FOldAdd,SizeOf(TJmpCode),FReserved);
end;

end.
----------------------------------------------
-
作者:
男 cntlis (cntlis) ▲▲△△△ -
注册会员
2018/9/7 17:21:52
20楼: HOOK的代码
var
  FMyFormTaobao: TFormTaobao;
begin
//  FHook[0]:= TPNHook.Create('wininet.dll', 'InternetSetCookieA', @PCEFunc_InternetSetCookie);
  FHook[1]:= TPNHook.Create('wininet.dll', 'InternetCloseHandle', @PCEFunc_InternetCloseHandle);
  FMyFormTaobao:= TFormTaobao.Create(nil);
  FMyFormTaobao.ShowModal;
  FPNFreeObj(FMyFormTaobao);
    FPNFreeObj(FHook[1]);
----------------------------------------------
-
作者:
男 nevergrief (孤独骑士) ★☆☆☆☆ -
盒子活跃会员
2018/9/7 18:33:17
21楼: PCEFunc_InternetCloseHandle 没有贴完整,再麻烦一下
----------------------------------------------
只有偏执狂才能生存!
作者:
男 cntlis (cntlis) ▲▲△△△ -
注册会员
2018/9/7 20:18:05
22楼: function PCEFunc_InternetCloseHandle(hInet: HINTERNET): BOOL; stdcall;
type
  TInternetCloseHandle= function (hInet: HINTERNET): BOOL; stdcall;

begin
  PCEFunc_LogHttpResponseHeader(hInet);
//  HttpQueryInfo
  try
    FHook[1].UnHook;
    Result:= TInternetCloseHandle(FHook[1].FBaseAdd)(hInet);
  finally
    FHook[1].Hook;
  end;
end;
----------------------------------------------
-
作者:
男 cntlis (cntlis) ▲▲△△△ -
注册会员
2018/9/7 20:53:54
23楼: 淘宝的那个登录的安全控件,也很容易,不需要去破解他的控件,有一个很简单的方式,用Delphi直接的做一个ACTIVEX,然后所有的方法都模拟他,包括GUID都和他一样,然后直接的把他的方法的返回值给模拟成我们自己的值就OK了,他里边主要是有一个硬件编码,那个编码是MAC地址经过3DES等加密算法,搞出来的,然后密码就是一个哈希算法,可以直接的调用淘宝自己的登录控件的算法生成
----------------------------------------------
-
作者:
男 wac1104 (火鸟) ★☆☆☆☆ -
注册会员
2018/9/13 10:15:27
24楼: https://github.com/Ericwang1104/WebDriver4D
试试webdriver  模拟浏览器方式
----------------------------------------------
火鸟
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行15.625毫秒 RSS