最近在做一个公众号, 通过公众号可以查询联盟优惠券的功能.  由于查券服务器很多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
usesSysUtils,Dialogs,Windows, WinSock, Classes;type//要HOOK的API函数定义TSockProc = function(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;PJmpCode = ^TJmpCode;TJmpCode = packed recordJmpCode: BYTE;Address: TSockProc;MovEAX: array[0..2] of BYTE;end;//--------------------函数声明---------------------------
procedure HookAPI;
procedure UnHookAPI;varFLoad: TStringList;
function recvout(var Rbuf; RLen: Integer): Integer;
varOldSend, 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='';implementationfunction GetStrEx(sSrc, sStart, sEnd: string): string;
varnPos1, nPos2: Integer;sStr: string;
beginResult := '';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 thenResult := Copy(sStr, 1, nPos1-1)elseResult := sStr;
end;function recvout(var Rbuf; RLen: Integer): Integer;
varbuf1: pchar;i: integer;ss: string;
begin// OutputDebugString(PChar('************:'));buf1 := @Rbuf;ss := buf1;//OutputDebugString(PChar('当前:'+ss));//取cookiegCookie := GetStrEx(ss, 'Cookie:', 'Host:');if Pos('t=', gCookie)>0 thenbeginif GetTickCount-gLastTime > 30*1000 thenbegingLastTime := GetTickCount;OutputDebugString(PChar('Cookie:'+gCookie));if gCookie <> gOldCook thenbegingOldCook := 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;
vardwSize: 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;
vardwSize: 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;
varDLLModule: THandle;dwSize: cardinal;
beginProcessHandle := 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;
vardwSize: Cardinal;
beginif FLoad <> nil thenFLoad.Free;WriteProcessMemory(ProcessHandle, AddSend, @OldProc[0], 8, dwSize);
//  WriteProcessMemory(ProcessHandle, AddRecv, @OldProc[1], 8, dwSize);
end;
end.

View Code

原理就是用钩子注入AliLogin.exe进程, 捕获这个进程所有的发送数据包, 从中间查找cookie, 然后保存下来.

至此cookie问题解决.

明天我们来解决一下多个程序cookie共享的问题.

程序下载 请加技术群下载

转载于:https://www.cnblogs.com/doorsky/p/6749723.html

阿里妈妈账号登录状态如何长时间保存相关推荐

  1. 阿里妈妈账号PID和淘宝账号PID的区别

    一.问题描述 做淘宝客,我们会遇到两种pid,一种是阿里妈妈账号的pid,一种是淘宝账号对应的pid 当我们访问 http://www.alimama.com/,看到右边的登录框,如图 (1)当我们使 ...

  2. 阿里云账号登录名修改方法(图文详解)

    阿里云账号注册后系统自动生成登录名可以修改吗?登录名是aliyun后面接数字组成的,这个账号可以自定义更改的,阿里云百科来详细说下阿里云账号名称修改方法: 阿里云账号登录名修改方法 阿里云账号注册成功 ...

  3. php 模拟登录淘宝taobao阿里妈妈|模拟登录淘宝联盟|curl模拟登录淘宝|模拟登陆淘宝采集数据

    php 模拟登录淘宝taobao阿里妈妈|模拟登录淘宝联盟|curl模拟登录淘宝|模拟登陆淘宝采集数据 在很多项目中我们可能要采集淘宝会员中心的一些数据.但是程序采集的时候会员中心必须是登录的,这里我 ...

  4. 阿里云子账号登录地址

    主账号登陆地址: https://account.aliyun.com/login/qr_login.htm 阿里云子账号登录地址: https://signin.aliyun.com/login.h ...

  5. 百度贴吧——因百度账号策略调整导致长时间未登录的账号(最后登录在2017年6月1日以前)网页端无法登陆、移动端异常解决方案

    问题描述 尝试登录一个最后登录在2017年6月1日以前的百度账号时, 网页端在完成登录程序以后,仍然没有登录状态. 移动端APP在完成登录程序后,可以进行一般操作(查看.发布等),但是不能进行账号安全 ...

  6. [淘宝客技术篇006]如何登录阿里妈妈-《登录淘宝网·二维码实现法》(下)

    <登录淘宝网·二维码实现法> 如下图所示,详解各步骤: 1.用户请求登录: 2.请求获取二维码.请求地址:https://qrlogin.taobao.com/qrcodelogin/ge ...

  7. 普通相片打印纸如何长时间保存

    因为现在普通彩色相片打印纸非常便宜,彩色打印机也很普及,我们经常把孩子的旅游的照片打印出来放在书桌上或者背景墙上面.但是没有覆膜的相纸很容易褪色.而我压在透明桌布(pvc桌布)下面的却没有褪色.究其原 ...

  8. 众人期盼的阿里妈妈自动登录来了!(2020-09-01)

    基于上一篇博客分享了如何破解淘宝修改机制后的滑块后,收到很多朋友反馈出现在1688登录时候滑块还是无法解决,博主私底下自己尝试了一下,得到了解决的办法,在这里跟大家分享一下. [注意]:一定要先看一下 ...

  9. python爬去淘宝客订单_如何采集阿里妈妈后台的淘客订单

    在这里小龙只提供一个可用的方法,具体代码需要亲们自主开发,小龙开发的不便放出,请见谅! 小龙在这里使用的语言是Python,版本是3.6.3,这里使用并发写入效果比较好的mongodb来存储数据. 用 ...

最新文章

  1. mac操作系统自带的文本编辑软件
  2. Java Zip压缩实现(亲测)
  3. Java小知识-----Map 按Key排序和按Value排序
  4. 背包——完全背包Warcraft III(哈理工1053)
  5. 云图说|玩转华为HiLens之端云协同AI开发
  6. 1000道Python题库系列分享25(40道Pandas客观题)
  7. Dreamweaver格式化html代码提高代码质量
  8. 一个做运营的朋友过来抱怨,现在HR谈薪都这么强硬吗?
  9. python内置函数下划线_python(内置函数)
  10. Java编程--如何突破程序员思维
  11. 8.2 GOF设计模式一: 单实例模式 SingleTon
  12. 反编译获取微信小程序源码
  13. 产品经理必修30本书
  14. 实验室计算机主机关,计算机综合实验室管理办法
  15. 肖邦 第一叙事曲 赏析
  16. ExpandableListView 添加分割线
  17. 大数据分析案例-对电信客户流失分析预警预测
  18. UVA1616 Caravan Robbers
  19. 认识VF--Visual FoxPro 漫谈
  20. 企业管理寓言:猎人与狗

热门文章

  1. 如何通过外网访问局域网的网站【路由器设置端口映射】
  2. Easyconnect 选路连接失败,可能当前连接网络异常,请稍后重
  3. 今日头条搜索优化是什么,头条seo怎么做?
  4. Linux 1.文件编程(open、creat、write、read、lseek)
  5. PLUTO SDR入门系列之八:LimeSDR公司荣誉出品”PothosSDR”-内置“gqrx”,GNU radio以及CubicSDR
  6. TouchGFX软件包下载
  7. html的评论功能,我的评论功能开发(含评论删除功能)
  8. Supplier接口
  9. 初级会议演讲者的建议
  10. DL-LN33使用笔记