首页
社区
课程
招聘
[求助]关于PE文件添加新节,并给出启动信息问题
发表于: 2007-12-7 09:13 4473

[求助]关于PE文件添加新节,并给出启动信息问题

2007-12-7 09:13
4473
我的思路是这样的:
1.在exe文件中添加新节,然后更改OEP,让它指向我的那部分代码,然后返回到OldEp.
但是在我的shellcode里面首先要找到Kernel32.dll的地址,然后得到GetProcAddress的函数地址,然后再LoadLibraryA("User32.dll"),再得到MessageBoxA的函数地址。

现在我的问题是 :
如果这个目标.exe里面本身启动了User32.dll的话,我的shellcode执行正确,但是如果目标.exe没有启动User32.dll的话,那么shellcode在LoadLibraryA("User32.dll")的时候会给eax的返回值为0,为什么会这样呢?
下面是我的shellcode:
                MOV  EAX,DWORD PTR FS:[30H]  ;FS:[30H]指向PEB
                MOV  EAX,DWORD PTR [EAX+0CH]  ;获取PEB_LDR_DATA结构的指针
                MOV  EAX,DWORD PTR [EAX+1CH] ;获取LDR_MODULE链表表首结点的inInitializeOrderModuleList成员的指针
                MOV  EAX,DWORD PTR [EAX]  ;LDR_MODULE链表第二个结点的inInitializeOrderModuleList成员的指针
                MOV  EAX,DWORD PTR [EAX+08H]  ;inInitializeOrderModuleList偏移8h便得到Kernel32.dll的模块基址
                MOV  EBP,EAX    ;  将Kernel32.dll模块基址地址放至kernel中
                MOV  EAX,DWORD PTR [EAX+3CH]  ;指向IMAGE_NT_HEADERS
                MOV  EAX,DWORD PTR [EBP+EAX+120]  ;指向导出表
                MOV  ECX,[EBP+EAX+24]  ;取导出表中导出函数名字的数目
                MOV  EBX,[EBP+EAX+32]    ;取导出表中名字表的地址
                ADD  EBX,EBP
                PUSH WORD  PTR 0X00      ;构造GetProcAddress字符串
                PUSH DWORD PTR 0X73736572
                PUSH DWORD PTR 0X64644163
                PUSH DWORD PTR 0X6F725074
                PUSH WORD PTR 0X6547;空压栈16
                MOV  EDX,ESP
                PUSH ECX

   
        F1:  
                MOV  EDI,EDX
                POP  ECX
                DEC  ECX
                TEST  ECX,ECX
                JZ  EXIT
                MOV  ESI,[EBX+ECX*4]   
                ADD  ESI,EBP
                PUSH  ECX
                MOV  ECX,15
                REPZ  CMPSB
                TEST  ECX,ECX
                JNZ  F1;F1过程为查找GetProcAddress的地址
  
                POP  ECX
                MOV  ESI,[EBP+EAX+36]  ;取得导出表中序号表的地址
                ADD  ESI,EBP
                MOVZX  ESI,WORD PTR[ESI+ECX*2]    ;取得进入函数地址表的序号
                MOV  EDI,[EBP+EAX+28]  ;取得函数地址表的地址
                ADD  EDI,EBP
                MOV  EDI,[EDI+ESI*4]    ;取得GetProcAddress函数的地址
                ADD  EDI,EBP      
   
                PUSH WORD PTR 0X00      ;构造LoadLibraryA字符串
                PUSH DWORD PTR 0X41797261
                PUSH DWORD PTR 0X7262694C
                PUSH DWORD PTR 0X64616F4C//空压栈14
                PUSH ESP
                PUSH  EBP
                CALL  EDI      ;调用GetProcAddress取得LoadLibraryA函数的地址,
                                                ;EAX存放的是LoadLibrary函数的地址
                PUSH  WORD PTR 0X00    ;构造字符串,测试新增节后的EXE是否能正常加载User32.dll
                PUSH  DWORD PTR 0X6C6C642E
                PUSH  DWORD PTR 0X32334944
                PUSH  WORD PTR        0X7355//空压栈12
                PUSH  ESP
                CALL  EAX
               
                TEST  EAX,EAX        ;如果没有正确加载User32.dll的话,那么就直接退出
                JE          EXIT
                ADD   ESP,42        ;如果不这么做的,可能会发生堆栈溢出的问题。
                PUSH  DWORD PTR 0x0041786F
                PUSH  DWORD PTR 0x42656761
                PUSH  DWORD PTR 0x7373654D
                PUSH  ESP
                PUSH  EAX
                CALL  EDI
                MOV   EDI,EAX
                MOV   EAX,ESP
                PUSH  0       
                PUSH  EAX
                PUSH  EAX
                PUSH  0

                CALL  EDI       
                SUB   ESP,30   ;平衡堆栈,关于这边平衡堆栈的问题
        EXIT:  ADD ESP,42   ;平衡堆栈,关于这边平衡堆栈的问题

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

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
难道我的第一个帖子就没有回答?
2007-12-7 09:33
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
3
GetLastError
2007-12-7 09:34
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
能说得具体一点吗?
2007-12-7 09:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
问题解决了,和GetLastError是一点都没有关系,主要是因为要修改目标.exe的引入表
添加User32.dll和函数MessageBoxA的一个IMAGE_THUNK_DATA
2007-12-7 10:11
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6

PUSH WORD PTR 0X00 ;构造字符串,测试新增节后的EXE是否能正常加载User32.dll
PUSH DWORD PTR 0X6C6C642E
PUSH DWORD PTR 0X32334944
PUSH WORD PTR 0X7355//空压栈12
PUSH ESP

   //这里有问题吧,esp加2才是User32.dll字串,esp应该是空串
2007-12-7 19:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
似乎看不太懂瓦
2007-12-7 19:51
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
对于我来说,似乎难了,看来还要学汇编
2007-12-7 20:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
gooooooogle:
    PUSH  WORD PTR 0X00    ;构造字符串,测试新增节后的EXE是否能正常加载User32.dll
    PUSH  DWORD PTR 0X6C6C642E
    PUSH  DWORD PTR 0X32334944
    PUSH  WORD PTR  0X7355//空压栈12
    PUSH  ESP   
这样子是对的,User32.dll字符串后面当然要+结束符号了
2007-12-8 08:09
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
主要的问题是如果目标.exe的引入表如果没有User32.dll的话,还需要修改目标.exe的引入表,然后添加一个MessageBoxA的IMAGE_THUNK_DATA
2007-12-8 08:10
0
游客
登录 | 注册 方可回帖
返回
//