首页
社区
课程
招聘
[原创]PEID如何判断文件是有效PE
发表于: 2008-7-4 17:37 21267

[原创]PEID如何判断文件是有效PE

2008-7-4 17:37
21267
收藏
免费 0
支持
分享
最新回复 (40)
雪    币: 1946
活跃值: (248)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
26
啊,不好意思,我没说清楚,我说的是EXE,DLL的话得另外想些旁门左道的办法才行了。

另外,并不是用LoadDll来测试,LoadDll无论是DLL还是EXE Unlable都是必然的结果

我也发个程序

source:

procedure TForm2.FormCreate(Sender: TObject);
var
test:DWORD;
begin
    test := LoadLibrary('test_InjectDll.dll');
    MessageBox(0,Pchar(IntToHex(test,16)),'',MB_OK);
end;

LoadLibrary的功效其实是很神奇的
上传的附件:
2008-7-4 23:35
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
27
有效的PE?
2008-7-4 23:43
0
雪    币: 66
活跃值: (15)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
28
天热了, 雨停了, 做俯卧撑的也多起来了
2008-7-5 00:24
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
请问楼主,在B处还把文件长度和160h比较了,这个160h到底是什么啊?
004533C0  /$  55            push    ebp
004533C1  |.  8B6C24 0C     mov     ebp, dword ptr [esp+C]
004533C5  |.  81FD 60010000 cmp     ebp, 160
004533CB  |.  56            push    esi
004533CC  |.  8BF1          mov     esi, ecx
004533CE  |.  72 2D         jb      short 004533FD
004533D0  |.  8B5424 0C     mov     edx, dword ptr [esp+C]
004533D4  |.  8956 08       mov     dword ptr [esi+8], edx
004533D7  |.  66:813A 4D5A  cmp     word ptr [edx], 5A4D
004533DC  |.  75 1F         jnz     short 004533FD
2008-7-7 10:41
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
30
喝高了,点错附件了,上面那个是EXE,不是dll
EXE很强大啊~~~ LoadLibrary更强大
上传的附件:
2008-7-7 11:45
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
31
满足那3个条件的DLL在某时某刻某处能正常执行,为什么不叫有效的PE
2008-7-7 11:49
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
peid有时候很白痴的说
2008-7-7 16:23
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
33
[QUOTE=cham;477184]请问楼主,在B处还把文件长度和160h比较了,这个160h到底是什么啊?
004533C0  /$  55            push    ebp
004533C1  |.  8B6C24 0C     mov     ebp, dword ptr [esp+C]
004533C5  |...[/QUOTE]

嗯,多谢cham提醒,此处应该也是判断一个文件是有效PE的比较处。这个0X160应该是PEID默认的文件头的最小值。即DOS-stub+File Header+Optional Header+Data directories+Section Headers的最小值为0x160,就是说如果文件的大小小于最小文件头大小的话,也不是有效的PE,即下面的jb会跳走。
2008-7-7 17:36
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
34
何时何刻何处
2008-7-7 17:43
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
35
dll基址和加载到内存中的镜像基址一样的时候,重定位表是可以忽略的
2008-7-7 18:00
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
36
我要努力学习好和各位开怀畅谈
2008-7-7 18:45
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
37
楼主说的好像不对,应该是MZ Header+PE Signature+File Header+Optional Header+Data directories+Section Headers的最小值为0x160吧!MZ Header:64byte;PE Signature:4byte;File Header:20byte;Optional Header+Data directies:224byte;1个Section Header:40byte.所以64+4+20+224+40=352=0x160.这个好像是XP以下是可以的,但是XP最少需要2个段。
2008-7-8 08:48
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
38
你那个加法的算法是不对的,你可以尝试修改一下PE头,就像WinUpack那个壳一样,它的MZ Header和PE标志在同一区域内,你那么加就重复了,这样的程序peid一样认为是有效的PE。至于每个段的名字叫什么,可能是我不太专业吧,呵呵。
2008-7-8 09:31
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
39
如果结构重叠的话,我这样算确实是错的。还是自己去做个类似的PE吧,不然搞不清!
2008-7-8 09:51
0
雪    币: 563
活跃值: (95)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
40
《Windows程序设计》 的有关PE检测代码

///////////////////////////////////////
// ValidPE.cpp文件

#include <afxdlgs.h>

#include "ValidPE.h"

CMyApp theApp;

BOOL CMyApp::InitInstance()
{
        // 弹出选色文件对话框
        CFileDialog dlg(TRUE);
        if(dlg.DoModal() != IDOK)
                return FALSE;

        // 打开检查的文件
        HANDLE hFile = ::CreateFile(dlg.GetFileName(), GENERIC_READ,
                FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if(hFile == INVALID_HANDLE_VALUE)
        {
                MessageBox(NULL, "无效文件!", "ValidPE", MB_OK);
        }

        // 定义PE文件中的DOS头和NT头
        IMAGE_DOS_HEADER dosHeader;
        IMAGE_NT_HEADERS32 ntHeader;       
       
        // 验证过程
        BOOL bValid = FALSE;
        DWORD dwRead;
        // 读取DOS头
        ::ReadFile(hFile, &dosHeader, sizeof(dosHeader), &dwRead, NULL);
        if(dwRead == sizeof(dosHeader))
        {
                if(dosHeader.e_magic == IMAGE_DOS_SIGNATURE) // 是不是有效的DOS头?
                {
                        // 定位NT头
                        if(::SetFilePointer(hFile, dosHeader.e_lfanew, NULL, FILE_BEGIN) != -1)
                        {
                                // 读取NT头
                                ::ReadFile(hFile, &ntHeader, sizeof(ntHeader), &dwRead, NULL);
                                if(dwRead == sizeof(ntHeader))
                                {
                                        if(ntHeader.Signature == IMAGE_NT_SIGNATURE)        // 是不是有效的NT头
                                                bValid = TRUE;
                                }
                        }
                }
        }

        // 显示结果
        if(bValid)
                MessageBox(NULL, "是一个PE格式的文件!", "ValidPE", MB_OK);
        else
                MessageBox(NULL, "不是一个PE格式的文件!", "ValidPE", MB_OK);

        ::CloseHandle(hFile);
        return FALSE;
}
2008-7-8 20:37
0
雪    币: 219
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
41
牛人的精彩比评!!!
2008-7-9 00:04
0
游客
登录 | 注册 方可回帖
返回
//