首页
社区
课程
招聘
看Billy Belceb的病毒教程的疑惑?
发表于: 2010-1-5 00:37 4804

看Billy Belceb的病毒教程的疑惑?

2010-1-5 00:37
4804
汇编语言学的差不多了,我最近开始看Billy Belceb的病毒教程,有一个问题百思不得其解。
在其教程的第一篇,就是DOS病毒的基础理论部分中的第一个病毒的重定位技术,感觉它好像错了。
   
下面是病毒的开始

.model tiny
.code

org 100h
carrier: db 0e9h,0,0

start:
  mov  bp, sp      ; Antidebugging get ?offset!
  int  0003h      ; Int for breakpoints
next:
  mov  bp, ss:[bp-6]
  sub  bp, offset next

这就是病毒的重定位技术,因为病毒感染到其他程序后,其程序内所定义的变量都不在源病毒的内存位置了,不能正常访问。
从后文可以得知,添加到其他com文件后的源代码从start开始

sub  ax, 0003h                   ; Virus_size-3 ( jump size )
  mov  word ptr [bp+offset readbuffer+1], ax
  mov  dl, 00E9h                 ; Opcode of jmp
  mov  byte ptr [bp+offset readbuffer], dl

  lea  dx, [bp+offset start]      ; The beginning of what append
  mov  cx, heap-start             ; Size to append
  mov  ah, 0040h                  ; concatenate virus
  int  0021h

疑惑从此开始,源程序中(就是这个病毒程序)的变量可以认为它是相对于carrier开始,因为前面的psp是一样的,可以忽略不计。当我将start后的代码复制到其他com文件后,想要重新访问源程序中的变量(我们复制过去的事被编译的机器码,因此变量的偏移不在正确),就应该加上一个delta。我们将被感染文件的长度(不是真实文件大小,是除去psp后的,第一个代码开始的)称为m,carrier的跳转指令长3个字节,start到next的指令为x个字节(原谅我的懒),那么作者的意思就是delta=m+x-(x+3),其中(x+3)是源程序中被编译的offset next值,存于bp中,源程序中bp为0。我们在设变量到next的长度为y,那么在被感染文件中,变量的偏移就是m+x+y,但是按照作者的程序,则是m+x+y-3。
这正是我疑问的地方,看第二个程序,就不存在这个问题,因为没有类似carrier这个指令,复制到感染文件的代码直接从第一个指令开始。
还请论坛大牛们帮助我解决这个疑惑。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 164
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
没人帮忙么?可能发帖时间没有掌握好,重新顶一下,让大家看见。
2010-1-5 18:57
0
雪    币: 208
活跃值: (148)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
这个问题得换个角度思考
start:
  mov  bp, sp      ; Antidebugging get ?offset!
  int  0003h      ; Int for breakpoints
next:
  mov  bp, ss:[bp-6] ;运行时动态获取本条指令的偏移量
  sub  bp, offset next ;offset next 这个偏移量是在汇编过程中确定的

bp中是实际运行时next的地址的变化量,
若next的地址变化了delta,其他变量的地址也该变化delta.
所以要定位其他变量就可以用[bp+var]的形式了
2010-1-6 10:59
0
雪    币: 164
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
我明白楼上所说的,而且也同意。
但是,正如我在帖子中说的,他在计算这个delta时有差错。在病毒源程序中,我们认为start指令前面有个carrier的指令,在感染文件中,我们可以认为start前面有个另外的z指令长度。那么start的变化量因该是这个被感染文件的指令长度减去carrier指令的长度,也就是start前面的差值才对。
因此代码中有一行应该改变:
sub  bp, offset next - 3
2010-1-6 12:44
0
雪    币: 208
活跃值: (148)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
他是在计算next的变化量,又不是计算start的变化量,但是next的变化量和start的变化量相同
因为int 3指令依次将flag,cs,ip寄存器压入堆栈
2010-1-6 14:59
0
雪    币: 208
活跃值: (148)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
病毒中所有地址的变化量相同,随便计算一个地址的变化量就可以了
2010-1-6 15:01
0
雪    币: 164
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
秒明其妙的又懂了,是我思考错了,走进死胡同了。感谢楼上的解答!
2010-1-6 18:17
0
雪    币: 156
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
最近再翻旧代码,感谢!
2012-12-3 15:39
0
游客
登录 | 注册 方可回帖
返回
//