首页
社区
课程
招聘
[求助]外壳的重定位问题
2006-12-25 16:08 4784

[求助]外壳的重定位问题

2006-12-25 16:08
4784
软件加密技术内幕第六章外壳其中一段代码如下:
ShellStart0:
        call        next0
;********************
ImportTableBegin:
ImportTable        DD        AddressFirst-ImportTable  
                DD        0,0
AppImpRVA1        DD        DllName-ImportTable   
AppImpRVA2        DD        AddressFirst-ImportTable
                DD        0,0,0,0,0
AddressFirst        DD        FirstFunc-ImportTable   
AddressSecond        DD        SecondFunc-ImportTable   
AddressThird        DD        ThirdFunc-ImportTable
                DD        0
DllName                DB        'KERNEL32.dll'
                DW        0
FirstFunc        DW        0       
                DB        'GetProcAddress',0
SecondFunc        DW        0
                DB        'GetModuleHandleA',0
ThirdFunc        DW        0
                DB        'LoadLibraryA',0
ImportTableEnd:
ShellBase        DD        0
ShellPackSize        DD        0
Virtualalloc        DB        'VirtualAlloc',0
VirtualallocADDR        DD        0
TlsTable        DB        18h dup (?)
next0:
        pop        ebp 这里把next0地址放到ebp中吧?
        sub        ebp,(ImportTable-ShellStart0) 这里注释为取得shellStart0的地址,请问ebp是如何成为shellStart0的地址的呢?
我至今换算不过来

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
打赏
分享
最新回复 (8)
雪    币: 214
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
girl 1 2006-12-25 19:07
2
0
pop  ebp 这里把next0地址放到ebp中吧?

是吧ImportTableBegin地址放到ebp中
push eip+5
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2006-12-25 19:12
3
0
现在假设:
shellStart0 = 00401000
ImportTable = 00401005

shellStart0:
call next0:
ImportTable
.....
.....
next0:
pop ebp ; 现在ebp保存的是ImportTable的值,也就是00401005
sub ebp,(ImportTable - shellStart0) ;这里反汇编代码后如如下形式:
sub ebp,5 ;此时ebp等于00401000,所以说上面的代码就是求shellStart0的地址。
雪    币: 154
活跃值: (70)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
icefall 1 2006-12-25 19:20
4
0
结合解释再次看了看汇编书中运行时堆栈的展开.终于懂了,谢楼上几位的指点

sub  ebp,(ImportTable-ShellStart0)这句执行减操作前ebp就放着ImportTable的地址,ImportTable-(ImportTable-ShellStart0)=ImportTable-ImportTable+ShellStart0=ShellStart0

Am I right?
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2006-12-25 19:53
5
0
假设:
shellStart0 = 00401000
ImportTable = 00401005

ImportTable-(ImportTable-ShellStart0) = 00401005 - (00401005 - 00401000)
                                      = 00401005 - 5
                                      = 00401000
经过上面的运算,ebp == 00401000
雪    币: 133
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gaoqing 2006-12-26 08:44
6
0
我觉得要得ShellStart0的地址,
直接
mov ebp,eip就行了
为什么搞得这么麻烦呀
雪    币: 2559
活跃值: (171)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
davidfoxhu 1 2006-12-26 09:29
7
0
eip这个寄存器不能直接读取的
雪    币: 2559
活跃值: (171)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
davidfoxhu 1 2006-12-26 09:45
8
0
由于我们无法直接获取EIP寄存器的值,因此执行一个call指令,它会把EIP寄存器的值保存到堆栈,下一条指令就直接把它从堆栈中弹出,保存在edx中
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2006-12-26 09:49
9
0
最初由 gaoqing 发布
我觉得要得ShellStart0的地址,
直接
mov ebp,eip就行了
为什么搞得这么麻烦呀

如果可以这么写,那就没有上面的重定位方法技巧了。
eip寄存器比其他寄存器特殊,不能直接读取。
游客
登录 | 注册 方可回帖
返回