能力值:
( LV13,RANK:350 )
|
-
-
2 楼
学习了,谢谢了,期待下篇
|
能力值:
( LV6,RANK:90 )
|
-
-
3 楼
期待,期待,支持楼主
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
[QUOTE=;]...[/QUOTE]
淋漓尽致的感觉!学习…
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
学习中,期待后面更精彩
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
“代码很简单很好理解,通过调用call dels, 然后通过pop ebx获得dels的偏移"
这里是不是写错了?你明明是call dels2啊
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
顶楼主,不过有一疑问,麻烦解答一下:
求调用地址的公式是
调用地址 - (call指令所处偏移 +5) = 相对偏移
我不太明白这个公式,尤其是后面的 +5,调用地址 - call指令所处偏移不就是相对偏移么?为什么还要加5?
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
call + 地址
长度为5
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
我帮楼主解答下,call指令占5个字节,CPU在执行指令时是这样计算的
(1) 下一条指令地址 EIP = 当前EIP + 当前指令长度
(2) PUSH EIP
(3) JMP EIP + 相对偏移
所以,当跳转时,EIP已经指向call下一条指令的地址了
不晓得说的对不,我是这样理解的
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
明白了,谢谢!
|
能力值:
( LV5,RANK:60 )
|
-
-
11 楼
很详细.帮顶.
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
szText db 'Virus Dels Demo', 0
__Entry:
call Dels2
Dels:
int 3
int 3
Dels2:
pop ebx
lea edx, [ebx + szText - Dels] ; edx = szText
ret
call Dels2 ,下一句就是 Dels: int 3 ,这里call把 Dels:的地址压入堆栈了
所以 pop ebx ,ebp的值是dels的偏移
不过 “通过调用call dels” 这里好像是要加个 2
|
能力值:
( LV9,RANK:220 )
|
-
-
13 楼
你应该就是我所说的不了解基础的人哈哈。。
注意下:
__Entry:
call Dels2
Dels:
int 3
int 3
Dels2:
call是将所处偏移的下句指令偏移压入堆栈,当调用call Dels2的时候, 是将dels偏移压入堆栈,然后设置eip寄存器为Dels2。。
此时在Dels2偏移处通过pop ebx取得的就是dels的偏移,明白了吗?
|
能力值:
( LV9,RANK:220 )
|
-
-
14 楼
因为这个相对偏移要减去call 地址所占的字节数。
举个例子
00401000 |$ E8 00000000 call 00401005 ;5字节
;0字节
00401005 |$ 5B pop ebx
call 00401005,因为call 地址所占字节是5字节,所以这个例子的相对偏移是0。
不知道这样表达明白了不?
|
能力值:
( LV9,RANK:220 )
|
-
-
15 楼
恩对。。
不过表达的有点问题。
下一条指令地址 EIP ,这个叫做下一条指令地址 就可以了,不要加上eip。
(1) 下一条指令地址 = 当前EIP + 当前指令长度
(2) push 下一条指令地址
(3) JMP eip + 5 + 相对偏移
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
在LZ的帮助下,终于完全弄明白了。支持你下。不是那种发完贴就闪人的高手。
|
能力值:
( LV2,RANK:140 )
|
-
-
17 楼
先顶后看~~~~~
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
3中的eip是1中的当前eip.host白客3中的eip是1中的下一条指令eip,其实都是一样的啊!
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
szText db 'Virus Dels Demo', 0
__Entry:
call Dels2
Dels:
int 3
int 3
Dels2:
pop ebx
lea edx, [ebx + szText - Dels] ; edx = szText
ret
szText是个全局变量,地址是在编译的时候定的,但是插入被感染对象后地址就变了,所以我们要重定位。而局部变量是运行时分配的,所以无需考虑。也就是说lea edx, [ebx + szText - Dels],这里的szText是在病毒体内编译时确定的地址,Dels应该也是在病毒体内编译是就确定的,ebx的值是被感染对象中Dels的地址。ebx-Dels也就是这段代码在被感染对象的地址和在病毒体中地址的差值,再加上szText在病毒体中的地址,就是szText在被感染对象中的地址。所以我们写重地位代码是无需考虑szText,只要看ebx-Dels的值是不是那个差值就好了,随便变化都可以吧!晕,不知道我这样理解对不对!
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
这里写写本人的理解,不知对不对。
szText db 'Virus Dels Demo', 0
__Entry:
call Dels2
Dels:
int 3
int 3
Dels2:
pop ebx
lea edx, [ebx + szText - Dels] ; edx = szText
ret
既然:调用地址 - (call指令所处偏移 +5) = 相对偏移
则有:调用地址 = (call指令所处偏移 +5) + 相对偏移
其中:ebx即为 (call指令所处偏移 +5) [执行call指令,call指令会将下一句指令的偏移压入堆栈,call指令本身长度为5,压入堆栈的其实就是call指令所处偏移 +5了;pop ebx取得的也就是call指令所处偏移 +5了];szText - Dels 即szText变量基于Dels的相对偏移
ebx= (call指令所处偏移 +5),szText - Dels=相对偏移
lea edx, [ebx + szText - Dels] ; edx = szText的调用地址
[edx]=[ebx + szText - Dels]
szText的调用地址=[Dels的偏移(=call指令所处偏移 +5)+ szText - Dels]
szText在运行进程中的地址=Dels在运行进程中的地址+szText变量基于Dels的相对偏移
|
能力值:
( LV9,RANK:220 )
|
-
-
21 楼
to cham:
1: 前面已经说了,host白客3表达上面的问题。
2: 理解是正确的。不过大部分为了更加优化,所以通过+ 一个偏移的相对偏移更加要好些。
to pat:
恩,正确。
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
不错,简单明了!支持楼主!
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
这只是一段程序编译好再感染进去的吧?
直接反汇编感染的话怎么弄啊?
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
写得不错, 继续啊!
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
这段:
szText db 'Virus Dels Demo', 0
__Entry:
call Dels2
Dels:
int 3
int 3
Dels2:
pop ebx
lea edx, [ebx + szText - Dels] ; edx = szText
ret
改成:
szText db 'Virus Dels Demo', 0
__Entry:
call Dels2
Dels:
int 3
int 3
Dels2:
pop ebx
lea ebx, [ebx - Dels]
lea edx, [ebx + szText] ; edx = szText
ret
是不是更好些? 这样以后变量直接加上ebx就可以算出位移了。
|
|
|