阿里媽媽賬號登錄狀態如何長時間保存


   最近在做一個公眾號, 通過公眾號可以查詢聯盟優惠券的功能.  由於查券服務器很多api需要聯盟的cookie, 這就需要這個登錄狀態保持.

   開始覺得應該定時刷新一個聯盟API就好了, 事實是不行.

   那就自己做自動登錄吧, 這個好像挺復雜的, 懶.(因為有各種驗證碼, js點擊), 還有一點就是我使用了另外的方法.

   是什么方法呢? 就是用現成的登錄程序.

   舉個例子, 大淘客都知道吧, 大淘客的登錄程序做的不錯, 拿來用就是了.

   

    這個都熟悉吧, 不熟悉就拿一個你覺得熟悉的登錄程序吧, 大同小異.

   等等, 你說這個AliLogin.exe怎么雙擊啟動不了啊, 好像是啊, 那大淘客怎么啟動的呢?

    哈哈, 那就是命令參數了,  怎么看命令參數呢, 

    百度里搜索: 如何獲得軟件的啟動參數

    然后得到結果:  1、先啟動程序2、在開始–>運行–>輸入 cmd 回車 進入命令行3、輸入: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共享的問題.

   

   程序下載 請加技術群下載

    

    

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM