导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
vivee (vivee)
★☆☆☆☆
-
普通会员
2018/9/7 0:24:25
标题:
付费请教如何使用indy登录淘宝后取卖家后台商品数据~~~~
浏览:1581
加入我的收藏
楼主:
我正常使用webbrowser能登录淘宝并进入后台,但使用indy控件模拟webbrowser,构造所有的head头(包括cookie),访问淘宝卖家后台失败,自动就转到登录界面。烦扰多天,试过了网上各种公开方法,尝试了各种组合都无果,所以特请各位delphi大神出手,有偿帮助解决,谢谢大家了,QQ 59225848,mob 13376053266
----------------------------------------------
-
作者:
go_on (go_on)
★☆☆☆☆
-
盒子活跃会员
2018/9/7 8:27:38
1楼:
webbrowser上应该是有一个安全登录空间的,你应该登录不上的。 猜测解决办法:应该是有二次开发接口的,很多淘宝的插件供应商做插件应该是通过二次开发接口
----------------------------------------------
www.eudn.cn工程师联合开发网
作者:
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 脚本模型 - http://webpascal.com 需要短信接口的请联系我,可发行业与营销内容。
作者:
vivee (vivee)
★☆☆☆☆
-
普通会员
2018/9/7 14:18:20
5楼:
刚用curl的get方法试过了,不知道是不是方法有问题,跟idhttp结果是一样的
----------------------------------------------
-
作者:
2018/9/7 14:29:11
6楼:
安全登录控件就是一个解决办法。 这个 控件 会告诉你 cookei或者免登陆 url 应该是什么。 一楼早早的就告诉了你答案,你不相信而已。
----------------------------------------------
(C)(P)Flying Wang
作者:
vivee (vivee)
★☆☆☆☆
-
普通会员
2018/9/7 14:38:09
7楼:
@wang_80919 怎么使用这个安全登录控件啊?麻烦告诉我个联系方式,私下请教你呢
----------------------------------------------
-
作者:
2018/9/7 15:13:09
8楼:
你先准备好500万人民币,我就告诉你我支付宝账号。 然后,用支付宝联系。
----------------------------------------------
(C)(P)Flying Wang
作者:
vivee (vivee)
★☆☆☆☆
-
普通会员
2018/9/7 15:24:58
9楼:
----------------------------------------------
-
作者:
2018/9/7 15:29:15
10楼:
我可以搞定,需要用到hook技术
----------------------------------------------
-
作者:
vivee (vivee)
★☆☆☆☆
-
普通会员
2018/9/7 15:37:36
11楼:
@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
----------------------------------------------
-
作者:
2018/9/7 16:07:47
13楼:
我之前的核心代码,就是这些,Hook到wininet.dll里边就OK了
----------------------------------------------
-
作者:
2018/9/7 16:11:08
14楼:
这个和Idhttp或者是CURL没有关系,就是和你获取cookie的方式有关,传统的获取Cookie的方式是不行的
----------------------------------------------
-
作者:
vivee (vivee)
★☆☆☆☆
-
普通会员
2018/9/7 16:13:16
15楼:
谢谢啦,一会儿就试验~~~~
----------------------------------------------
-
作者:
2018/9/7 16:30:13
16楼:
怪不得那么多盗号,银行盗刷的。原来 HOOK 一下就行了。
----------------------------------------------
(C)(P)Flying Wang
作者:
2018/9/7 16:44:13
17楼:
盗号那些也是一种HOOK,不过他们HOOK的也是有多种方式 ,直接HOOK到驱动层,然后捕获到硬件信号,那种是直接的把密码都给HOOK走了 楼主这种,只需要普通的函数hook,把完整的Cookie拿到就好了,原理不同
----------------------------------------------
-
作者:
2018/9/7 17:12:19
18楼:
Hook到wininet.dll里? 怎么hook,用CreateRomoteThread?还请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.
----------------------------------------------
-
作者:
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]);
----------------------------------------------
-
作者:
2018/9/7 18:33:17
21楼:
PCEFunc_InternetCloseHandle 没有贴完整,再麻烦一下
----------------------------------------------
只有偏执狂才能生存!
作者:
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;
----------------------------------------------
-
作者:
2018/9/7 20:53:54
23楼:
淘宝的那个登录的安全控件,也很容易,不需要去破解他的控件,有一个很简单的方式,用Delphi直接的做一个ACTIVEX,然后所有的方法都模拟他,包括GUID都和他一样,然后直接的把他的方法的返回值给模拟成我们自己的值就OK了,他里边主要是有一个硬件编码,那个编码是MAC地址经过3DES等加密算法,搞出来的,然后密码就是一个哈希算法,可以直接的调用淘宝自己的登录控件的算法生成
----------------------------------------------
-
作者:
2018/9/13 10:15:27
24楼:
https://github.com/Ericwang1104/WebDriver4D 试试webdriver 模拟浏览器方式
----------------------------------------------
火鸟