阿里媽媽帳號登陸狀態如何長時間保存

   最近在作一個公衆號, 經過公衆號能夠查詢聯盟優惠券的功能.  因爲查券服務器不少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.
View Code

   原理就是用鉤子注入AliLogin.exe進程, 捕獲這個進程全部的發送數據包, 從中間查找cookie, 而後保存下來.

   至此cookie問題解決.

   

 

   明天咱們來解決一下多個程序cookie共享的問題.

   

   程序下載 請加技術羣下載

相關文章
相關標籤/搜索