首页
社区
课程
招聘
[原创]vxasm的第1阶段第1题
发表于: 2008-10-4 00:19 2773

[原创]vxasm的第1阶段第1题

2008-10-4 00:19
2773
打开一个网页所能用到的常用API有:WinExec,ShellExecute,CreateProcess。但是因为WinExec和CreateProcess都需要指明绝对路径,所以我开始采用的API是ShellExecute,但是ShellExecute有6个参数,这样6次PUSH操作下来,要使用很多的指令才能完成。

    后来看到ShellExecute函数还有一个增加的函数版本叫ShellExecuteEx,而且只需要一个参数即可完成,自然就是使用它了。没有增加节,没有改变文件大小,增加了输出表,输入表,重定位表,使用LordPE和UltraEdit完成以上操作。下面是采用过的2种办法。

第1种:12字节,将ShellExecuteEx的参数预先放在数据区,直接调用即可。数据区的布局用数组表示为如下:

//sizeof(SHELLEXECUTEINFO)=0x3c,15个DWORD
DWORD ShellEx[] = {
    0x0000003C, //1,cbSize
    0x00000000, //2
    0x00000000, //3
    0x00000000, //4
    0x00424a30, //5, lpFile,指向"http://bbs.pediy.com",地址需要重定位;
    0x00000000, //6
    0x00000000, //7
    0x00000000, //8
    0x00000000, //9
    0x00000000, //10
    0x00000000, //11
    0x00000000, //12
    0x00000000, //13
    0x00000000, //14
    0x00000000 //15   
};

在OpenUrlA函数填充的代码表示如下,实际可能略有不同,还需要重定位:

.text:00401000                   sub_401000 proc near                    ; CODE XREF: _mainp
.text:00401000 68 58 60 40 00            push    offset ExecInfo         ; lpExecInfo
.text:00401005 FF 15 9C 50 40 00         call    ds:ShellExecuteExA
.text:0040100B C3                        retn
.text:0040100B                   sub_401000 endp

第2种:12字节,将参数预先放在数据区,本来是只需要10字节,但是因为使用了ESI寄存器,所以加上必要的头尾后,还是12字节。数据区的布局用数组表示为如下:

//16个DWORD
DWORD ShellEx[] = {
    0x00402014, //指向ShellExecuteExA的地址,实际运行时还需要经过重定位。
    0x0000003C, //1,cbSize
    0x00000000, //2
    0x00000000, //3
    0x00000000, //4
    0x00424a30, //5, lpFile,指向"http://bbs.pediy.com",地址需要重定位;
    0x00000000, //6
    0x00000000, //7
    0x00000000, //8
    0x00000000, //9
    0x00000000, //10
    0x00000000, //11
    0x00000000, //12
    0x00000000, //13
    0x00000000, //14
    0x00000000 //15   
};

在OpenUrlA函数填充的代码表示如下,实际可能略有不同,还需要重定位:

.text:00401000                   sub_401000 proc near                    ; CODE XREF: _mainp
.text:00401000 56                        push    esi
.text:00401001 BE 58 60 40 00            mov     esi, offset aXA         ; "錦ra}<"
.text:00401006 AD                        lodsd            ;取出ShellExecuteExA的地址,ESI->ESI+4
.text:00401007 56                        push    esi      ;此时ESI正好指向函数的参数地址
.text:00401008 FF 10                     call    [eax]    ;调用ShellExecuteExA函数
.text:0040100A 5E                        pop     esi
.text:0040100B C3                        retn
.text:0040100B                   sub_401000 endp

在这里的提交文件中我使用的是第2种方法,经测试可以在2000/XP上正确运行。详见提交的附件。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
2
OpenUrlA 函数大小 = 12 字节
附件提交次数 = 1
得分 = min[1.0, 13/12]x100 - (1 -1 )x5 = 100.0

ps.讲的好详细:)
2008-10-4 12:55
0
雪    币: 2056
活跃值: (13)
能力值: ( LV13,RANK:250 )
在线值:
发帖
回帖
粉丝
3
谢谢版主,呵呵.
2008-10-4 20:33
0
游客
登录 | 注册 方可回帖
返回
//