| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1532 人关注过本帖
标题:程序段中的变量
取消只看楼主 加入收藏
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
收藏
 问题点数:0 回复次数:3 
程序段中的变量
Windows应用程序捆绑核心编程 张争秋 清华大学出版社 page189
中使用一个子文件定义了一个汇编子程序
;文件:attach.asm.
;常量定义.
.const

;代码段开始.
.code

;以“_”开头,并以 API 函数名相接的,是用来贮存通过 GetProcAddress 得到的 API 线形地址.
    attach_start            equ        $
        OEP                             dd                0
    hLibUser32            dd        ?
    _GetProcAddress            dd        0
    _LoadLibrary            dd        0
    _FreeLibrary            dd        0
    _ExitProcess            dd        0
    _MessageBox            dd        0
    szLibUser32            db        "user32", 0
    szProcLoadLibrary        db        "LoadLibraryA", 0
    szProcFreeLibrary        db        "FreeLibrary", 0
    szProcExitProcess        db        "ExitProcess", 0
    szProcMessageBox        db        "MessageBoxA", 0
     _szAppTitle            db        "Shellcode Test", 0
        _szShowText                     db           "Shellcode Done!",0
    ;真正的代码开始.
     attach_code_start        equ        $
        call Attachment
;-----------------------------------------------------------------------------
;附加段的子程序处理模块.
Attachment proc
    ;以下是经典的查找 kernel32.dll 的基地址的代码.
        pop ebp
        sub ebp, offset Attachment
     mov    eax, [esp]
    and    eax, 0FFFF0000h
@@chk:
    cmp    dword ptr [eax], 00905A4Dh    
    je    @@fnd                
    sub    eax, 1000h            
    jmp    @@chk                
@@fnd:
    ;以下的涉及到 PE 格式的操作.
    push     ebp
    push     ebx
    push     esi
    push     edi
    mov    ebp, eax
    add    eax, [eax][IMAGE_DOS_HEADER.e_lfanew]
    mov    edi, [eax][IMAGE_NT_HEADERS.OptionalHeader.DataDirectory]
    add    edi, ebp
    mov    esi, [edi][IMAGE_EXPORT_DIRECTORY.AddressOfNames]
    add    esi, ebp
    ;在 kernel32.dll 里面查找 GetProcAddress 的API 的线形地址.
    xor    edx, edx
@@name:
    mov    eax, [esi]
    add    eax, ebp
@@chgp:    ; GetProcAddress()
    cmp    dword ptr [eax+00h], "PteG"    ; GetP
    jne    @@next
    cmp    dword ptr [eax+04h], "Acor"    ; rocA
    jne    @@next
    cmp    dword ptr [eax+08h], "erdd"    ; ddre
    jne    @@next
    cmp    word ptr [eax+0Ch], "ss"    ; ss
    jne    @@next
    mov    eax, [edi][IMAGE_EXPORT_DIRECTORY.AddressOfNameOrdinals]
    add    eax, ebp
    movzx ebx, word ptr [edx*2+eax]
    mov    eax, [edi][IMAGE_EXPORT_DIRECTORY.AddressOfFunctions]
    add    eax, ebp
    mov    eax, [ebx*4+eax]
    add    eax, ebp
    ; 找到GetProcAddress 的线形地址并保存.
    mov    [_GetProcAddress], eax
@@next:
    add    esi, 4
    inc    edx
    cmp    edx, [edi][IMAGE_EXPORT_DIRECTORY.NumberOfNames]
    jne    @@name
    ;下面的是通过 GetProcAddress 获得一些API 的线形地址,并储存起来,供后面使用.
    _call    [_GetProcAddress], ebp, offset szProcFreeLibrary
    mov    [_FreeLibrary], eax
    _call    [_GetProcAddress], ebp, offset szProcExitProcess
    mov    [_ExitProcess], eax
    _call    [_GetProcAddress], ebp, offset szProcLoadLibrary
    mov    [_LoadLibrary], eax
    ;载入 user32.dll ,并储存它的句柄.
    _call    eax, offset szLibUser32
    mov    [hLibUser32], eax
    _call    [_GetProcAddress], [hLibUser32], offset szProcMessageBox
     mov    [_MessageBox], eax
        ;调用加壳函数    
    _call ShellFunc
    ;返回原程序入口点
     mov eax, dword ptr [OEP]
    jmp eax
    _call    [_FreeLibrary], [hLibUser32]
    _call    [_ExitProcess], 0
Attachment endp
;-----------------------------------------------------------------------------
;计算加壳代码的长度.
attach_size    equ    $ - offset attach_start

我有一个疑问:
(1)变量 hLibUser32 dd ? 怎么被定义在程序段中,不是说程序段中的变量是不能修改的吗 ??
但是语句 mov    [hLibUser32], eax 却对其赋值?
搜索更多相关主题的帖子: 变量 程序段 常量 赋值 
2008-10-14 23:49
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 3# zklhp 的帖子
让代码段可写 ?是由什么连接器的 ?

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2008-10-15 14:06
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 6# 的帖子
我知道 #pragma comment(linker, "/SECTION: 是定义共享段
但是 上面的  汇编子程序  中你能看到这个 代码段 是属于共享段?还是凭常识得到的 ?

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2008-11-01 13:10
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 8# 的帖子
现在 操作系统支持虚拟内存,应该使用  交换技术吧
以前才使用 覆盖技术
不知道您这里的 段覆盖技术  和 覆盖技术  是不是一样?

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2008-11-02 15:45
快速回复:程序段中的变量
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.051626 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved