首页
社区
课程
招聘
请教汇编代码中的问题,发现我是个菜鸟,呵呵
2006-6-9 08:56 3798

请教汇编代码中的问题,发现我是个菜鸟,呵呵

2006-6-9 08:56
3798
以下代码是<Win32 PE病毒原理分析> 这篇文章中的部分代码,有个指令我实在搞不懂它的意思,请教高手

.........
_Start:
    call   _delta
_delta:
    pop ebp                        ;得到delta地址
    sub ebp,offset _delta                ;以便于后面变量重定位
    mov dword ptr [ebp+appBase],ebp        ;在appBase保存重定位值

    mov eax,[esp]                        ;返回地址
    xor edx,edx
getK32Base:
    dec  eax        ;逐字节比较验证,速度比较慢,不过功能一样
    mov  dx,word ptr [eax+IMAGE_DOS_HEADER.e_lfanew]        ;找PE头的地址
    test dx,0xf000h                                             
       ;假如找到了eax为kernel32模块的头地址,那么dx为文件的首地址
       ;那么根据PE文件被装入内存时是按内存页对齐的这一特性
       ;如果这个地址是页的其始地址,就进行下步判断               
       ;如果不是,那么这个地址就肯定不是PE文件的起始地址       
       ;一个页为4KB,就是说PE起始地址应该为XXXXX000的格式
    jnz  getK32Base
    cmp  eax,dword ptr [eax+edx+IMAGE_NT_HEADERS.OptionalHeader.ImageBase]
        jnz  getK32Base                       
        ;看Image_Base(模块的建议装入地址)值是否等于ecx,即模块起始值
        ;这里判断kernel32模块的实际装入地址与PE头结构中的建议装入地址相等,就认为找到模块
    mov  [ebp+k32Base],eax        ;保存kernel32的起始地址
    lea  edi,[ebp+aGetModuleHandle] ;edi指向API函数地址存放位置的起始
    lea  esi,[ebp+lpApiAddrs]        ;esi指向API函数名字串偏移的起始地址
lop_get:
    lodsd                ;在这个循环中esi是由lodsd自动增加的
    cmp  eax,0        ;判断函数是否搜索完毕
    jz   End_Get
    add  eax,ebp        ;这时eax=kernel32模块的起始地址,而ebp是当前模块的重定位值。两个不同模块,这样相加是个什么意思?
.........

就是最后一句代码,到底是做什么的啊?

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞0
打赏
分享
最新回复 (1)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
土行孙 2006-6-9 09:18
2
0
不好意思啊,忘记lodsd这个指令了,呵呵,现在知道了
游客
登录 | 注册 方可回帖
返回