首页
社区
课程
招聘
[原创]手写PE导入表,打造超小快速关机程序
发表于: 2008-5-2 12:09 14784

[原创]手写PE导入表,打造超小快速关机程序

2008-5-2 12:09
14784
收藏
免费 7
支持
分享
最新回复 (18)
雪    币: 290
活跃值: (11)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
2
太有学问了。。
这就是传说中的举一反三吧!!!
2008-5-2 20:31
0
雪    币: 197
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
精彩~~~!
2008-5-2 21:34
0
雪    币: 140
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不错,我正想找呢,学习了,不过我想问一下ntdll.inc和ntdll.lib这些头文件在哪里有,我装了MASM32没有这些头文件
2008-5-3 00:55
0
雪    币: 191
活跃值: (345)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
5
这个 &XX  这里的 XX 之前就直接 int 一下就 OK ?
2008-5-3 03:29
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
6
精彩,学习。
2008-5-3 05:16
0
雪    币: 82
活跃值: (516)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
写的好,超详细。喜欢
2008-5-3 10:06
0
雪    币: 224
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
这个是不是没有进行磁盘保存之类的???
直接就关机了?
2008-5-4 01:59
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
9
用ntdll的序号很难跨平台吧。。

如果仅仅在xp sp2下用,还不如直接硬编码

call 7c949e8c  (ntdll.RtlAdjustPrivilege)

call 7c92e7e6  (ntdll.ZwShutdownSystem)

我改一个试试,没测试,不知道能跨几个平台
上传的附件:
2008-5-4 09:04
0
雪    币: 144
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
不知这样解决跨平台问题没

.386
.model flat, stdcall
option casemap:none
include windows.inc

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
ShutDown dd ?
RtlAdjustPrivilege db 'RtlAdjustPrivilege',0
BaseNtdll dd ?
ZwShutdownSystem   db 'ZwShutdownSystem',0
lby db 'LoadLibraryA',0
gpa db 'GetProcAddress',0
apiaddr dd ?
apiaddr1 dd ?
apiaddr2 dd ?
apiaddr3 dd ?
baseKernel  dd ?
szntdll db 'ntdll.dll',0
.code
GetApiAddress   proc uses ecx ebx edx esi edi hModule:DWORD, szApiName:DWORD
    LOCAL dwReturn: DWORD
    LOCAL dwApiLength: DWORD

    mov dwReturn, 0

    ;计算 API 字符串的长度(带尾部的0)
    mov esi, szApiName
    mov edx, esi
Continue_Searching_Null:
    cmp byte ptr [esi], 0           ; 是否为 Null-terminated char ?
    jz We_Got_The_Length            ; Yeah, we got it.  :)
    inc esi                         ; No, continue searching.
    jmp Continue_Searching_Null     ; searching.......
We_Got_The_Length:
    inc esi                         ; 呵呵, 别忘了还有最后一个“0”的长度。
    sub esi, edx                    ; esi = API Name size
    mov dwApiLength, esi            ; dwApiLength = API Name size

    ;从 PE 文件头的数据目录获取输出表的地址
    mov esi, hModule
    add esi, [esi + 3ch]
    assume esi: ptr IMAGE_NT_HEADERS
    mov esi, [esi].OptionalHeader.DataDirectory.VirtualAddress
    add esi, hModule
    assume esi:ptr IMAGE_EXPORT_DIRECTORY   ; esi 指向 Kernel32.dll 的输出表

    ;遍历 AddressOfNames 指向的数组匹配名字:
    mov ebx, [esi].AddressOfNames
    add ebx, hModule                ; 别忘了加上基地址,AddressOfNames 是 RVA
    xor edx, edx                    ; edx = "函数计数",初始化为0
    .repeat
        push esi                    ; 保存esi,后面会用到。
        mov edi, [ebx]              ; edi = 输出表中的当前函数名字
        add edi, hModule            ; 别忘了加上基地址
        mov esi, szApiName          ; 函数名字的首地址
        mov ecx, dwApiLength        ; 函数名字的长度
        cld                         ; 设置方向标志
        repz cmpsb                  ; 开始查找,我们先去喝杯咖啡吧  :)
        .if ZERO?                   ; 找到啦?
            pop esi                 ; 恢复 esi
            jmp _Find_Index         ; 查找该函数的地址索引
        .endif
        pop esi                     ; 恢复 esi
        add ebx, 4                  ; 下一个函数(每个函数的地址占用4个字节)
        inc edx                     ; 增加函数计数
    .until edx >= [esi].NumberOfNames
    jmp _Exit                       ; faint,没找到,凄然退出……

    ;函数名称索引 -> 序号索引 -> 地址索引
    ;公式:
    ;API’s Address = ( API’s Ordinal * 4 ) + AddressOfFunctions’ VA + Kernel32 imagebase
_Find_Index:
    sub ebx, [esi].AddressOfNames   ; 上面的 repz cmpsb 那里,如果匹配的话,
                                    ; esi 就指向了下一个函数的首地址,所以要先减掉它。
    sub ebx, hModule                ; 减掉基地址,得到 RVA
    shr ebx, 1                      ; 要除以 2 ,还是因为 repz cmpsb 那行
    add ebx, [esi].AddressOfNameOrdinals    ; AddressOfNameOrdinals
    add ebx, hModule                ; 别忘了基地址
    movzx eax, word ptr [ebx]       ; Now, eax = API’s Ordinal
    shl eax, 2                      ; 要乘以 4 才得到偏移
    add eax,[esi].AddressOfFunctions; + AddressOfFunctions’ VA
    add eax, hModule                ; + Kernel32 imagebase

    ;从地址表得到导出函数地址
    mov eax, [eax]                  ; 得到函数的 RVA
    add eax, hModule                ; 别忘了基地址(说了很多次了,呵呵)
    mov dwReturn, eax               ; 最终得到的函数的线性地址。(呼……好累啊,终于完成了)
_Exit:
    mov eax, dwReturn               ; done!  :)

    ret
GetApiAddress       endp

strat:
    db 64h,8Bh,40h,30h,8Bh,40h,0Ch,8Bh,70h,0Ch,0ADh,8Bh,00h,8Bh,40h,18h
    mov baseKernel,eax
    invoke GetApiAddress,baseKernel,addr lby
    mov apiaddr2,eax
    lea eax,dword ptr ds:[szntdll]
    push eax
    call apiaddr2
    mov BaseNtdll,eax
    invoke GetApiAddress,baseKernel,offset gpa
    mov apiaddr3,eax
    ;lea eax,dword ptr ds:[RtlAdjustPrivilege]
    push offset RtlAdjustPrivilege
    push BaseNtdll
    call apiaddr3
    mov apiaddr,eax
    lea eax,dword ptr ds:[ZwShutdownSystem]
    push eax
    push BaseNtdll
    call apiaddr3
    mov apiaddr1,eax
    lea eax,dword ptr ds:[ShutDown]
    push eax
    push 0
    push 1
    push 13h
    call apiaddr
    push 2
    call apiaddr1
   
end strat
2008-5-4 13:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
RtlAdjustPrivilege(0x13,1,0,&XX);//照抄来的数据,不知其意
0x13=SE_SHUTDOWN_PRIVILEGE取得关机的最优先权
2008-5-4 18:29
0
雪    币: 9
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
RtlAdjustPrivilege
我要提权~~~~~~~
2008-7-24 08:10
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
13
文章很漂亮!
2008-7-24 09:29
0
雪    币: 251
活跃值: (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
14
楼主发表的几篇文章都看过了,大受启发,谢谢楼主的分享
2008-10-8 09:59
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
学习了,谢谢
2009-6-8 17:27
0
雪    币: 125
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
LZ为什么输入表还没做好,,,,我在WINXP下编译不小心运行了。。。也可以关机了。。。什么原因啊
2009-6-22 22:18
0
雪    币: 314
活跃值: (271)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
观望中...
2009-10-9 17:54
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
咱也写了个240 字节的秒关程序 TinyShutdown (测试平台XP SP3)
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F

00000000 4D 5A 00 00 50 45 00 00 4C 01 01 00 4E 54 44 4C MZ..PE..L...NTDL
00000010 4C 2E 44 4C 4C 00 00 00 78 00 0F 01 0B 01 54 69 L.DLL...x.....Ti
00000020 6E 79 53 68 75 74 64 6F 77 6E 21 00 BC 00 00 00 nyShutdown!.?..
00000030 4A 75 6E 63 6F 4A 65 74 00 00 40 00 04 00 00 00 JuncoJet..@.....
00000040 04 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 ................
00000050 00 00 00 00 F0 00 00 00 BC 00 00 00 00 00 00 00 ....?..?......
00000060 02 00 00 00 00 10 00 00 00 10 00 00 00 10 00 00 ................
00000070 00 10 00 00 00 00 00 00 02 00 00 00 00 00 00 00 ................
00000080 00 00 00 00 D4 00 00 00 1C 00 00 00 00 00 00 00 ....?..........
00000090 00 00 00 00 2E 74 65 78 74 00 00 00 1C 00 00 00 .....text.......
000000A0 BC 00 00 00 1C 00 00 00 BC 00 00 00 00 00 00 00 ?......?......
000000B0 00 00 00 00 00 00 00 00 20 00 00 E0 60 54 6A 00 ........ ..郹Tj.
000000C0 6A 01 6A 13 FF 15 E8 00 40 00 6A 02 FF 15 EC 00 j.j..?@.j..?
000000D0 40 00 61 C3 00 00 00 00 00 00 00 00 00 00 00 00 @.a?...........
000000E0 0C 00 00 00 E8 00 00 00 92 01 00 80 7D 04 00 80 ....?..?.€}..€


TinyShutdown.rar
上传的附件:
2009-10-15 13:26
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
重在参与 相信论坛里将会有更强的能人出现更小的Shutdown
2009-10-15 13:29
0
游客
登录 | 注册 方可回帖
返回
//