最近在作一個公衆號, 經過公衆號能夠查詢聯盟優惠券的功能. 因爲查券服務器不少api須要聯盟的cookie, 這就須要這個登陸狀態保持.api
開始以爲應該定時刷新一個聯盟API就行了, 事實是不行.服務器
那就本身作自動登陸吧, 這個好像挺複雜的, 懶.(由於有各類驗證碼, js點擊), 還有一點就是我使用了另外的方法.cookie
是什麼方法呢? 就是用現成的登陸程序.ide
舉個例子, 大淘客都知道吧, 大淘客的登陸程序作的不錯, 拿來用就是了.函數
這個都熟悉吧, 不熟悉就拿一個你以爲熟悉的登陸程序吧, 大同小異.spa
等等, 你說這個AliLogin.exe怎麼雙擊啓動不了啊, 好像是啊, 那大淘客怎麼啓動的呢?命令行
哈哈, 那就是命令參數了, 怎麼看命令參數呢, code
百度裏搜索: 如何得到軟件的啓動參數blog
而後獲得結果: 一、先啓動程序二、在開始–>運行–>輸入 cmd 回車 進入命令行三、輸入:WMIC 出來提示後 輸入: process 就會顯示全部的進程命令行信息了進程
用這個方法, 咱們就獲得了命令啓動參數: -lt 1 -ac -ap -dc -dp -pn AL6362845535841316741047753041
不懂什麼意思, 能用就行
好了, 試試吧, 看靈不靈
sCmd := '-lt 1 -ac -ap -dc -dp -pn AL6362845535841316741047753041'; sPath := ExtractFilePath(ParamStr(0)); ShellExecute(0, 'open', PChar(sPath+'AliLogin.exe'), PChar(sCmd), nil, SW_SHOWNORMAL);
運行起來了. 而後呢, 運行起來也不行啊, 雖然登陸聯盟成功了, 可是cookie怎麼獲得呢, 對哦, 答案是咱們用注入.
HOOK代碼以下:
unit APIHook; interface uses SysUtils,Dialogs,Windows, WinSock, Classes; type //要HOOK的API函數定義 TSockProc = function(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall; PJmpCode = ^TJmpCode; TJmpCode = packed record JmpCode: BYTE; Address: TSockProc; MovEAX: array[0..2] of BYTE; end; //--------------------函數聲明--------------------------- procedure HookAPI; procedure UnHookAPI; var FLoad: TStringList; function recvout(var Rbuf; RLen: Integer): Integer; var OldSend, OldRecv: TSockProc; //原來的API地址 JmpCode: TJmpCode; OldProc: array[0..1] of TJmpCode; AddSend, AddRecv: pointer; //API地址 TmpJmp: TJmpCode; ProcessHandle: THandle; gLastTime: THandle; gCookie: string; gOldCook: string=''; implementation function GetStrEx(sSrc, sStart, sEnd: string): string; var nPos1, nPos2: Integer; sStr: string; begin Result := ''; nPos1 := Pos(sStart, sSrc); if nPos1 = 0 then Exit; sStr := Copy(sSrc, nPos1+length(sStart), Length(sSrc)-nPos1); nPos1 := Pos(sEnd, sStr); if nPos1>0 then Result := Copy(sStr, 1, nPos1-1) else Result := sStr; end; function recvout(var Rbuf; RLen: Integer): Integer; var buf1: pchar; i: integer; ss: string; begin // OutputDebugString(PChar('************:')); buf1 := @Rbuf; ss := buf1; //OutputDebugString(PChar('當前:'+ss)); //取cookie gCookie := GetStrEx(ss, 'Cookie:', 'Host:'); if Pos('t=', gCookie)>0 then begin if GetTickCount-gLastTime > 30*1000 then begin gLastTime := GetTickCount; OutputDebugString(PChar('Cookie:'+gCookie)); if gCookie <> gOldCook then begin gOldCook := gCookie; OutputDebugString(PChar('保存Cookie文件:'+ExtractFilePath(ParamStr(0))+'cook.txt')); FLoad.Clear; FLoad.Add(gCookie); FLoad.SaveToFile(ExtractFilePath(ParamStr(0))+'cook.txt'); end; end; end; end; {---------------------------------------} {函數功能:Send函數的HOOK {函數參數:同Send {函數返回值:integer {---------------------------------------} function MySend(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall; var dwSize: cardinal; begin //這兒進行發送的數據處理 // MessageBeep(1000); //簡單的響一聲 recvout(Buf, len); //調用直正的Send函數 WriteProcessMemory(ProcessHandle, AddSend, @OldProc[0], 8, dwSize); Result := OldSend(S, Buf, len, flags); JmpCode.Address := @MySend; WriteProcessMemory(ProcessHandle, AddSend, @JmpCode, 8, dwSize); end; {---------------------------------------} {函數功能:Recv函數的HOOK {函數參數:同Recv {函數返回值:integer {---------------------------------------} function MyRecv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall; var dwSize: cardinal; begin //這兒進行接收的數據處理 // MessageBeep(1000); //簡單的響一聲 //調用直正的Recv函數 WriteProcessMemory(ProcessHandle, AddRecv, @OldProc[1], 8, dwSize); Result := OldRecv(S, Buf, len, flags); JmpCode.Address := @MyRecv; WriteProcessMemory(ProcessHandle, AddRecv, @JmpCode, 8, dwSize); end; {------------------------------------} {過程功能:HookAPI {過程參數:無 {------------------------------------} procedure HookAPI; var DLLModule: THandle; dwSize: cardinal; begin ProcessHandle := GetCurrentProcess; DLLModule := LoadLibrary('ws2_32.dll'); AddSend := GetProcAddress(DLLModule, 'send'); //取得API地址 // AddRecv := GetProcAddress(DLLModule, 'recv'); JmpCode.JmpCode := $B8; JmpCode.MovEAX[0] := $FF; JmpCode.MovEAX[1] := $E0; JmpCode.MovEAX[2] := 0; ReadProcessMemory(ProcessHandle, AddSend, @OldProc[0], 8, dwSize); JmpCode.Address := @MySend; WriteProcessMemory(ProcessHandle, AddSend, @JmpCode, 8, dwSize); //修改Send入口 // ReadProcessMemory(ProcessHandle, AddRecv, @OldProc[1], 8, dwSize); //JmpCode.Address := @MyRecv; // WriteProcessMemory(ProcessHandle, AddRecv, @JmpCode, 8, dwSize); //修改Recv入口 OldSend := AddSend; // OldRecv := AddRecv; FLoad := TStringList.Create(); gLastTime := 0; end; {------------------------------------} {過程功能:取消HOOKAPI {過程參數:無 {------------------------------------} procedure UnHookAPI; var dwSize: Cardinal; begin if FLoad <> nil then FLoad.Free; WriteProcessMemory(ProcessHandle, AddSend, @OldProc[0], 8, dwSize); // WriteProcessMemory(ProcessHandle, AddRecv, @OldProc[1], 8, dwSize); end; end.
原理就是用鉤子注入AliLogin.exe進程, 捕獲這個進程全部的發送數據包, 從中間查找cookie, 而後保存下來.
至此cookie問題解決.
明天咱們來解決一下多個程序cookie共享的問題.
程序下載 請加技術羣下載