游戏安全实验室 首页 技术入门 查看内容

 阅读目录

疾风之刃实现自动登陆

发布于:2016-6-29 15:11   |    147777次阅读 作者: 管理员    |   原作者: TP   |   来自: 原创

一、利用TASLogin.exe的勾子函数 输入密码的原理解释

    

       通过xt,我们发现此进程利用SetWindowsHookEx安装了一个WH_KEYBOARD_LL的低层键盘勾子,用来捕获键盘输入,回调函数声明如下

代码:

LRESULT CALLBACK LowLevelKeyboardProc(

    _In_  int nCode,

    _In_  WPARAM wParam,

    _In_  LPARAM lParam

  );

    参数简单说明:

         第一个用处不大,

      第二个wParam,代表是按下还是弹起,

      第三个lParam,是一个指向 KBDLLHOOKSTRUCT 的指针. 也是利用他来做为输入的

 

代码:

  typedef struct tagKBDLLHOOKSTRUCT {

    DWORD     vkCode;  //当前按下的键

    DWORD     scanCode;  

    DWORD     flags;

    DWORD     time;

    ULONG_PTR dwExtraInfo;

  } KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT, *LPKBDLLHOOKSTRUCT;

 

二、利用方法

 

代码:

一、构造参数,

二、设置输入焦点窗口

三、调用回调函数


三、构造参数

 

代码:

     int nCode = HC_ACTION;

     WPARAM wParamDown =WM_KEYDOWN;

     WPARAM wParamUp =WM_KEYUP;

     KBDLLHOOKSTRUCT pKdb={0};

 

 

 

四、设置输入焦点窗口


   要设置焦点窗口,肯定必须要先有窗口句柄,我采用的方法是在这个进程刚创建的时候就注入一个DLL,然后利用SetWindowsHookEx安装一个WH_GETMESSAGE勾子,在密码框窗口已经有消息的时候,说明这个窗口已经创建成功,那么我们就安装一个定时器,为什么要安装定时器呢,因为这个进程很恶心的说,创建的线程,被此进程的其它函数强制结束了,

 

代码:

LRESULT CALLBACK GetMsgProc(__in  int code,__in  WPARAM wParam,__in  LPARAM lParam

  )

{

  if( code == HC_ACTION )

  {

    MSG * pMsg =(MSG*)lParam;

 

    LONG dwStyle = GetWindowLong(pMsg->hwnd,GWL_STYLE);

    if( !g_hPwd &&  

      dwStyle & ES_PASSWORD &&

      !( dwStyle&ES_MULTILINE) )

    {

      TCHAR tcText[100];

      _stprintf_s(tcText,_T("密码框句柄:%x"),pMsg->hwnd);

      OutputDebugString(tcText);

 

      g_hPwd=pMsg->hwnd;

      if( !dwTimerId )

        dwTimerId = SetTimer(g_hPwd,0x1000,0x10,InputPwdTimer);

    }

  }

  return CallNextHookEx(0,code,wParam,lParam);

}

好了,密码框句柄也有了,设置焦点就太简单了吧,

 

 

五、调用勾子回调函数


   通过XT,我们发现勾子回调函数位于 +0x16A645偏移处,

 

代码:

    DWORD dwModuleHanlde = (DWORD)GetModuleHandle(_T("fszwd.dat"));

    if(!dwModuleHanlde)

    {

      OutputDebugString(_T("模块还没有加载"));

      __leave;

    }

    

    if( ::GetFocus() != g_hPwd) 

    {

      ::SetWindowPos(GetParent(g_hPwd),HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);

      ::SetFocus(g_hPwd);

    }

 

    bInputChar =true;

    OutputDebugString(_T("已经执行"));

 

    g_dwCallbackAddr = dwModuleHanlde +0x16A645;

用  g_dwCallbackAddr 来保存 “勾子回调函数” 地址

 

代码:

typedef LRESULT  ( CALLBACK *  LowLevelKeyboardProc)(_In_  int nCode,

_In_  WPARAM wParam,_In_  LPARAM lParam);

 

pKdb.vkCode = 'A';  //设置虚键码

LowLevelKeyboardProc Proc=(LowLevelKeyboardProc)g_dwCallbackAddr; //

//输入字符

Proc(nCode,wParamDown,(LPARAM)&pKdb);

Proc(nCode,wParamUp,(LPARAM)&pKdb);

那么这样就输入了,'A'这个字母,其它的同理了


*转载请注明来自游戏安全实验室(GSLAB.QQ.COM)

分享到:
踩0 赞1

收藏

上一篇:lol英雄显血外挂实战

下一篇:植物大战僵尸游戏分析:部分功能相关逻辑分析

最新评论
引用 xdm1957 2017-2-5 02:11
Taslogin是你们自己的程序,居然把自己恶心到了!
引用 tstscan 2016-6-30 19:00
tstscan

查看全部评论(2)

B Color Image Link Quote Code Smilies

发表评论