程序分析 - task8

程序流程分析

首先通过start函数找到WinMain函数

image-20191108102701342

其中,能看到他要寻找资源文件,那么也就直接说明了资源文件还有东西,实际上是个没有被加密的dll代码,理论上Binwalk可以分离出来,这里我用静态winhex分离和动态直接取到他释放的做了对比,是一样的,所以这里没什么要注意的。


首先会去动态加载一个系统保护相关的dll,之后的GetProcAddress第二个参数是数字我也不知道这是啥用法,可能是取index下标的库函数吧,总之动态调试了之后看到他取出来的地址是函数SRSetRestorePointW,在上网查询之后发现这个函数的作用是创建一个系统还原点,常用于补丁或者更新的安装时用于在取消操作或者失败操作的时候回滚。


之后查询系统目录地址,保存,用于后面查询dll的时候拼接字符串使用。

同时会开始检索系统服务,需要检索的服务如下:

"AppMgmt"
"BITS"
"FastUserSwitchingCompatibility"
"WmdmPmSN"
"xmlprov"
"EventSystem"
"Ntmssvc"
"upnphost"
"SSDPSRV"
"Netman"
"Nla"
"Tapisrv"
"Browser"
"Themes"
"CryptSvc"
"helpsvc"
"RemoteRegistry"
"Schedule"

与之对应的dll名称为:

"appmgmts.dll"
"qmgr.dll"
"shsvcs.dll"
"mspmsnsv.dll"
"xmlprov.dll"
"es.dll"
"ntmssvc.dll"
"upnphost.dll"
"ssdpsrv.dll"
"netman.dll"
"mswsock.dll"
"tapisrv.dll"
"browser.dll"
"shsvcs.dll"
"cryptsvc.dll"
"pchsvc.dll"
"regsvc.dll"
"schedsvc.dll"

检索的服务项一共是18个,首先是检测系统中是否有这个服务如果没有就跳过,如果有则进入条件体。

如果存在服务则取服务的状态,判断当前状态和是否能取得控制权(?应该是),当都满足的时候,则拼接dll的系统地址,进入函数check_write_file


函数会判断文件是否存在

image-20191108104329475

如果文件存在则首先创建系统还原点再释放自己的dll覆盖系统服务的dll,之后取得dll的各种时间戳,进行修改,修改为2004年

image-20191108104615714

之后用资源文件里的内容写入dll,写入成功返回1,写入不成功返回0。


同时,这里的判断就是主要判断是否写成功,如果成功则启动服务,并且写出一个bash脚本删除当前程序并关闭,不执行后续代码。所以这里主要就是判断18个服务是否都存在并且能有一个写成功。如果写成功一个就退出。

bash脚本为:

:DELFILE
del "%s"
if exist "%s" goto DELFILE
del "%s"

解密函数sub_401641中的字符串,也就是上述bash脚本。

from idaapi import *
from idc import *

addr = 0x4023B0
len_t = 0x3a
for i in xrange(len_t):
    PatchByte(addr + i, Byte(addr + i) ^ 0xa9)

image-20191108105547809


如果全部服务都不可写,也就是都失败了的情况下会继续执行循环之后的代码

image-20191108105725767

取得SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Svchost注册表项下的所有服务字段

image-20191107165905569

CertPropSvc
SCPolicySvc
lanmanserver
gpsvc
IKEEXT
iphlpsvc
seclogon
msiscsi
EapHost
schedule
winmgmt
ProfSvc
SessionEnv
wercplsupport
PushToInstall
InstallService
TroubleshootingSvc
LxpSvc
shpamsvc
XblGameSave
DmEnrollmentSvc
Themes
WManSvc
TokenBroker
lfsvc
FastUserSwitchingCompatibility
Ias
Irmon
Nla
Ntmssvc
NWCWorkstation
Nwsapagent
Rasauto
Rasman
Remoteaccess
SENS
Sharedaccess
SRService
Tapisrv
Wmi
WmdmPmSp
wuauserv
BITS
ShellHWDetection
LogonHours
PCAudit
helpsvc
uploadmgr
dmwappushservice
wisvc
NetSetupSvc
WpnService
XboxNetApiSvc
UsoSvc
UserManager
DsmSvc
wlidsvc
XboxGipSvc
NcaSvc
AppInfo
XblAuthManager
NaturalAuthentication
AppMgmt
BDESVC
browser

image-20191108105902565

取到服务名的列表之后遍历,使用CreateServiceA,来添加到服务控制管理器数据库

如果成功,同样是拼接处字符串检查dll是否存在,不存在则写出,存在则尝试覆盖。

之后通过遍历拼接注册表项,然后向其中添加键值来指定服务的dll,我是这样理解的,然后只要成功一个就退出


接下来是服务dll部分

image-20191108111610619

dll在启动的时候就会建立新线程,启动函数为StartAddress


image-20191108112219174

线程启动的时候就会通过遍历进程名的方式判断两个进程是否存在,如果存在则通过申请一块很大的内存空间,并向空间中填充nop,也就是0x90,之后在空间的最末尾塞入0xe9 xxxxxxxxx,也就是一个跳转

image-20191108112529908

难道这种方式能bypass那两种他想检测的进程?


再之后就会解密3个字符串,解密脚本为:

from idaapi import *
from idc import *

overflow_dword = lambda x: x & 0xffffffff
addr = 0x100041D0 # address must change
i = 0
while Dword(addr + i * 4):
    if Dword(addr + 4 + i * 4):
        v2 = overflow_dword(Dword(addr + 4 + i * 4) + ~Dword(addr + i * 4))
    else:
        v2 = overflow_dword(~Dword(addr + i * 4))
    PatchDword(addr + i * 4, v2)
    i += 1
print 'End'

解密出来的内容为:

.data:10004168 aHttpIpdownPolo db 'http://ipdown.poloi999.cn/bbs/asd.txt',0

.data:100041D0 aHttpWwwIpshoug db 'http://www.ipshougou.com/bbs/asd.txt',0

.data:10004260 a360hotfixExe   db '360hotfix.exe',0    ; DATA XREF: StartAddress+38↑o
.data:10004260                                         ; sub_100019CE+151↑o ...
.data:1000426E a360rptExe      db '360rpt.exe',0
.data:10004279 a360safeExe     db '360safe.exe',0
.data:10004285 a360safeboxExe  db '360safebox.exe',0
.data:10004294 a360trayExe     db '360tray.exe',0
.data:100042A0 aAgentsvrExe    db 'agentsvr.exe',0
.data:100042AD aApvxdwinExe    db 'apvxdwin.exe',0
.data:100042BA aAstExe         db 'ast.exe',0
.data:100042C2 aAvcenterExe    db 'avcenter.exe',0
.data:100042CF aAvengineExe    db 'avengine.exe',0
.data:100042DC aAvgntExe       db 'avgnt.exe',0
.data:100042E6 aAvguardExe     db 'avguard.exe',0
.data:100042F2 aAvpExe_0       db 'avp.exe',0
.data:100042FA aAvltmainExe    db 'avltmain.exe',0
.data:10004307 aAvp32Exe       db 'avp32.exe',0
.data:10004311 aAvtaskExe      db 'avtask.exe',0
.data:1000431C aBdagentExe_0   db 'bdagent.exe',0
.data:10004328 aBdwizregExe    db 'bdwizreg.exe',0
.data:10004335 aBoxmodExe      db 'boxmod.exe',0
.data:10004340 aCcappExe       db 'ccapp.exe',0
.data:1000434A aCcenterExe     db 'ccenter.exe',0
.data:10004356 aCcevtmgrExe    db 'ccevtmgr.exe',0
.data:10004363 aCcregvfyExe    db 'ccregvfy.exe',0
.data:10004370 aCcsetmgrExe    db 'ccsetmgr.exe',0
.data:1000437D aCqw32Exe       db 'cqw32.exe',0
.data:10004387 aDrvantiExe     db 'DrvAnti.exe',0
.data:10004393 aEguiExe        db 'egui.exe',0
.data:1000439C aEkrnExe        db 'ekrn.exe',0
.data:100043A5 aEnc98Exe       db 'enc98.EXE',0
.data:100043AF aExtdbExe       db 'extdb.exe',0
.data:100043B9 aFrameworkservi db 'frameworkservice.exe',0
.data:100043CE aFrwstubExe     db 'frwstub.exe',0
.data:100043DA aGuardfieldExe  db 'guardfield.exe',0
.data:100043E9 aIparmorExe     db 'iparmor.exe',0
.data:100043F5 aKaccoreExe     db 'kaccore.exe',0
.data:10004401 aKasmainExe     db 'kasmain.exe',0
.data:1000440D aKav32Exe       db 'kav32.exe',0
.data:10004417 aKavstartExe    db 'kavstart.exe',0
.data:10004424 aKavsvcExe      db 'kavsvc.exe',0
.data:1000442F aKavsvcuiExe    db 'kavsvcui.exe',0
.data:1000443C aKislnchrExe    db 'kislnchr.exe',0
.data:10004449 aKissvcExe      db 'kissvc.exe',0
.data:10004454 aKmailmonExe    db 'kmailmon.exe',0
.data:10004461 aKnownsvrExe    db 'knownsvr.exe',0
.data:1000446E aKpfw32Exe      db 'kpfw32.exe',0
.data:10004479 aKpfwsvcExe     db 'kpfwsvc.exe',0
.data:10004485 aKregexExe      db 'kregex.exe',0
.data:10004490 aKvfwExe        db 'kvfw.exe',0
.data:10004499 aKvmonxpExe     db 'kvmonxp.exe',0
.data:100044A5 aKvmonxpKxp     db 'kvmonxp.kxp',0
.data:100044B1 aKvolExe        db 'kvol.exe',0
.data:100044BA aKvprescanExe   db 'kvprescan.exe',0
.data:100044C8 aKvsrvxpExe     db 'kvsrvxp.exe',0
.data:100044D4 aKvwscExe       db 'kvwsc.exe',0
.data:100044DE aKvxpKxp        db 'kvxp.kxp',0
.data:100044E7 aKwatchExe      db 'kwatch.exe',0
.data:100044F2 aLivesrvExe     db 'livesrv.exe',0
.data:100044FE aMcagentExe     db 'mcagent.exe',0
.data:1000450A aMcdashExe      db 'mcdash.exe',0
.data:10004515 aMcdetectExe    db 'mcdetect.exe',0
.data:10004522 aMcshieldExe    db 'mcshield.exe',0
.data:1000452F aMctskshdExe    db 'mctskshd.exe',0
.data:1000453C aMcvsescnExe    db 'mcvsescn.exe',0
.data:10004549 aMcvsshldExe    db 'mcvsshld.exe',0
.data:10004556 aMghtmlExe      db 'mghtml.exe',0
.data:10004561 aNaprdmgrExe    db 'naprdmgr.exe',0
.data:1000456E aNavapsvcExe    db 'navapsvc.exe',0
.data:1000457B aNavapw32Exe    db 'navapw32.exe',0
.data:10004588 aNavw32Exe      db 'navw32.exe',0
.data:10004593 aNmainExe       db 'nmain.exe',0
.data:1000459D aNod32Exe       db 'nod32.exe',0
.data:100045A7 aNod32krnExe    db 'nod32krn.exe',0
.data:100045B4 aNod32kuiExe    db 'nod32kui.exe',0
.data:100045C1 aNpfmntorExe    db 'npfmntor.exe',0
.data:100045CE aOasclntExe     db 'oasclnt.exe',0
.data:100045DA aPavsrv51Exe    db 'pavsrv51.exe',0
.data:100045E7 aPfwExe         db 'pfw.exe',0
.data:100045EF aPsctrlsExe     db 'psctrls.exe',0
.data:100045FB aPsimrealExe    db 'psimreal.exe',0
.data:10004608 aPsimsvcExe     db 'psimsvc.exe',0
.data:10004614 aQqdoctormainEx db 'qqdoctormain.exe',0
.data:10004625 aRasExe         db 'ras.exe',0
.data:1000462D aRavmonExe      db 'ravmon.exe',0
.data:10004638 aRavmondExe     db 'ravmond.exe',0
.data:10004644 aRavstubExe     db 'ravstub.exe',0
.data:10004650 aRavtaskExe     db 'ravtask.exe',0
.data:1000465C aRfwcfgExe      db 'rfwcfg.exe',0
.data:10004667 aRfwmainExe     db 'rfwmain.exe',0
.data:10004673 aRfwproxyExe    db 'rfwproxy.exe',0
.data:10004680 aRfwsrvExe      db 'rfwsrv.exe',0
.data:1000468B aRsagentExe     db 'rsagent.exe',0
.data:10004697 aRsmainExe      db 'rsmain.exe',0
.data:100046A2 aRsnetsvrExe    db 'rsnetsvr.exe',0
.data:100046AF aRssafetyExe    db 'rssafety.exe',0
.data:100046BC aRstrayExe      db 'rstray.exe',0
.data:100046C7 aSafebankExe    db 'safebank.exe',0
.data:100046D4 aSafeboxtrayExe db 'safeboxtray.exe',0
.data:100046E4 aScan32Exe      db 'scan32.exe',0
.data:100046EF aScanfrmExe     db 'scanfrm.exe',0
.data:100046FB aSchedExe       db 'sched.exe',0
.data:10004705 aSeccenterExe   db 'seccenter.exe',0
.data:10004713 aSecnotifierExe db 'secnotifier.exe',0
.data:10004723 aSetupldExe     db 'SetupLD.exe',0
.data:1000472F aShstatExe      db 'shstat.exe',0
.data:1000473A aSmartupExe     db 'smartup.exe',0
.data:10004746 aSndsrvcExe     db 'sndsrvc.exe',0
.data:10004752 aSpbbcsvcExe    db 'spbbcsvc.exe',0
.data:1000475F aSymlcsvcExe    db 'symlcsvc.exe',0
.data:1000476C aTbmonExe       db 'tbmon.exe',0
.data:10004776 aUihostExe      db 'uihost.exe',0
.data:10004781 aUlibcfgExe     db 'ulibcfg.exe',0
.data:1000478D aUpdateruiExe   db 'updaterui.exe',0
.data:1000479B aUpliveExe      db 'uplive.exe',0
.data:100047A6 aVcr32Exe       db 'vcr32.exe',0
.data:100047B0 aVcrmonExe      db 'vcrmon.exe',0
.data:100047BB aVptrayExe      db 'vptray.exe',0
.data:100047C6 aVsservExe      db 'vsserv.exe',0
.data:100047D1 aVstskmgrExe    db 'vstskmgr.exe',0
.data:100047DE aVstskmgrExe_0  db 'vstskmgr.exe',0
.data:100047EB aWebproxyExe    db 'webproxy.exe',0
.data:100047F8 aXcommsvrExe    db 'xcommsvr.exe',0
.data:10004805 aXnlscnExe      db 'xnlscn.exe',0
.data:10004810 aKvmonxpKxp_0   db 'KVMonXP.kxp',0
.data:1000481C aKvsrvxpExe_0   db 'KVSrvXP.exe',0
.data:10004828 aAvpExe_1       db 'avp.exe',0
.data:10004830 aAvpExe_2       db 'avp.exe',0
.data:10004838 aAvpExe_3       db 'avp.exe',0
.data:10004840 aRavmondExe_0   db 'RavMonD.exe',0
.data:1000484C aRavtaskExe_0   db 'RavTask.exe',0
.data:10004858 aRsagentExe_0   db 'RsAgent.exe',0
.data:10004864 aRsnetsvrExe_0  db 'rsnetsvr.exe',0
.data:10004871 aRstrayExe_0    db 'RsTray.exe',0
.data:1000487C aScanfrmExe_0   db 'ScanFrm.exe',0
.data:10004888 aCcenterExe_0   db 'CCenter.exe',0
.data:10004894 aKavstartExe_0  db 'kavstart.exe',0
.data:100048A1 aKissvcExe_0    db 'kissvc.exe',0
.data:100048AC aKpfw32Exe_0    db 'kpfw32.exe',0
.data:100048B7 aKpfwsvcExe_0   db 'kpfwsvc.exe',0
.data:100048C3 aKswebshieldExe db 'kswebshield.exe',0
.data:100048D3 aKwatchExe_0    db 'kwatch.exe',0
.data:100048DE aKmailmonExe_0  db 'kmailmon.exe',0
.data:100048EB aEguiExe_0      db 'egui.exe',0
.data:100048F4 aEkrnExe_0      db 'ekrn.exe',0
.data:100048FD aCcsvchstExe    db 'ccSvcHst.exe',0
.data:1000490A aCcsvchstExe_0  db 'ccSvcHst.exe',0
.data:10004917 aCcsvchstExe_1  db 'ccSvcHst.exe',0
.data:10004924 aMcagentExe_0   db 'Mcagent.exe',0
.data:10004930 aMcmscsvcExe    db 'mcmscsvc.exe',0
.data:1000493D aMcnasvcExe     db 'McNASvc.exe',0
.data:10004949 aMcodsExe       db 'Mcods.exe',0
.data:10004953 aMcproxyExe     db 'McProxy.exe',0
.data:1000495F aMcshieldExe_0  db 'Mcshield.exe',0
.data:1000496C aMcsysmonExe    db 'mcsysmon.exe',0
.data:10004979 aMcvsshldExe_0  db 'mcvsshld.exe',0
.data:10004986 aMpfsrvExe      db 'MpfSrv.exe',0
.data:10004991 aMcsacoreExe    db 'McSACore.exe',0
.data:1000499E aMsksrverExe    db 'msksrver.exe',0
.data:100049AB aSchedExe_0     db 'sched.exe',0
.data:100049B5 aAvguardExe_0   db 'avguard.exe',0
.data:100049C1 aAvmailcExe     db 'avmailc.exe',0
.data:100049CD aAvwebgrdExe    db 'avwebgrd.exe',0
.data:100049DA aAvgntExe_0     db 'avgnt.exe',0
.data:100049E4 aSchedExe_1     db 'sched.exe',0
.data:100049EE aAvguardExe_1   db 'avguard.exe',0
.data:100049FA aAvcenterExe_0  db 'avcenter.exe',0
.data:10004A07 aUfseagntExe    db 'UfSeAgnt.exe',0
.data:10004A14 aTmbmsrvExe     db 'TMBMSRV.exe',0
.data:10004A20 aSfctlcomExe    db 'SfCtlCom.exe',0
.data:10004A2D aTmproxyExe     db 'TmProxy.exe',0
.data:10004A39 a360softmgrsvcE db '360SoftMgrSvc.exe',0
.data:10004A4B a360trayExe_0   db '360tray.exe',0

之后取到两个API地址放置在全局变量上

image-20191108113837207

image-20191108062409874

接下来会用新线程执行这个函数。

image-20191108062447761

函数内容大概是释放一个驱动文件然后创建服务项,启动服务项,之后删除文件只在内存运行,测试连接,如果成功则查询系统的信息并做啥操作

这结构体挺大的我不太清楚,调试的时候在创建服务的时候失败了走的失败那一条,不过驱动文件拿到了。这里好像就是与驱动层通信的。

image-20191108061944974


image-20191108062715624

当检测到标记为已经通过的时候创建两个新线程

image-20191108062751150

第一个大概为取到之前那18个服务的注册表项,然后全部设置为自动启动,之后更改注册表权限,然后通过修改debugger的键值,来阻止程序正常运行

image-20191108062854603


image-20191108063112154

第二个线程循环访问两个txt文件取到txt文件内容保存为文件,然后读取文件内容之后删除文件


image-20191108063532928

这一块创建窗口站啥的,不太清楚具体要干啥


接下来

image-20191108063721650

解密获取到的文本信息,解密出新的网址,然后下载,这次是未加密的可执行程序

image-20191108063802019

并且先判断是否为标准DOS头,然后执行文件,这里传入了刚刚获得的窗口站的token,难道是隐藏窗口?


驱动文件中

image-20191108065746702

没有特别多的代码,不过不是很熟悉调试过程

在对比查看逻辑的过程中发现了之前服务dll里面的比较多结构体操作的部分好像就是病毒程序用于r0和r3,系统层和用户层进行通信的方式


用不同的控制代码控制执行不同的函数

image-20191108070031547

image-20191108070201122

具体干了啥不太清楚,不会调试驱动


image-20191108070758298

这里分别保存着的从SSDT系统调用表中获取的函数地址


病毒的驱动做的主要的事情就是通信和这三个不同控制代码对应的函数,就没了

总结

周末看看咋调驱动好了