flying2008
驱动牛犊
驱动牛犊
  • 注册日期2005-12-15
  • 最后登录2010-04-02
  • 粉丝0
  • 关注0
  • 积分695分
  • 威望85点
  • 贡献值0点
  • 好评度67点
  • 原创分0分
  • 专家分0分
阅读:2383回复:5

基于内存扫描的方法检测内核对象(进程、驱动等)。

楼主#
更多 发布于:2007-04-28 11:07
  基于内存扫描的方法检测内核对象,如进程对象,该如何扫描内存
查了很多资料,找不到头绪,暴力搜索总是蓝屏,期待高手指点:)
uuuty
驱动牛犊
驱动牛犊
  • 注册日期2005-02-04
  • 最后登录2010-09-15
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望25点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-04-30 12:18
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
板凳#
发布于:2007-04-30 12:41
uty~~
没有战争就没有进步 X3工作组 为您提供最好的军火
uuuty
驱动牛犊
驱动牛犊
  • 注册日期2005-02-04
  • 最后登录2010-09-15
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望25点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-04-30 12:51
;p


 
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
地下室#
发布于:2007-04-30 20:59
直接转过来...
3月15日 搜索内存枚举进程
找隐藏进程的方法很多,系统中有那么多个链表把进程们连在一起.所以隐藏进程总觉得太不划算了
    搜索virtuAl memory这个方法比较懒,本想从NonpAgedPool分配出去的内存的链表中找,可他们并不全连来一起,还不怎么了解.偷个懒,没定位几个表示nonpAged位置的变量,直接从头搜到尾了 -____- 留着以后改进
    windbg中!zombies感觉就是在搜nonpAged pool的链表,,找tAg是pro的内存块. 
    这里搜0x7ffdf000,然后得到eprocess的object heAder ,判断其中的type是否是process,这两个位置改动都会影响到进程,当然搜其他的地方或者通过别的部分判断也可以.在搜virtuAl memory的时候先判断pte和pde中的entry时候vAlid,不分页内存这个位应该总是1,在pAsssive level上访问被置换到pAge file的内存直接就蓝了,,mm的部分还没搞清楚,,唉...为何是mm都要和我过不去 :``|
    一般进程结束后EPROCESS的peb的部分就变了. 有一回搜出三个csrss.exe,其中有一个是正常的,其他的两个eprocess块也有数据,nAme的地方也是csrss.exe.object heAder的PointerCount和HAndleCount都不为0.type也是process..很奇怪
 
程序很简单,在虚拟机xp sp1下ok
结果
i'm coming :>
EPROCESS: 0x80d85da8  process nAme: smss.exe
EPROCESS: 0x80e33578  process nAme: csrss.exe
EPROCESS: 0xffad98d8  process nAme: ctfmon.exe
EPROCESS: 0xffae38b8  process nAme: VMwareUser.exe
EPROCESS: 0xffae4850  process nAme: VMwareTray.exe
EPROCESS: 0xffaf0020  process nAme: cmd.exe
EPROCESS: 0xffb0bb88  process nAme: explorer.exe
EPROCESS: 0xffb19da8  process nAme: VMwareService.e
EPROCESS: 0xffb65da8  process nAme: spoolsv.exe
EPROCESS: 0xffb7ada8  process nAme: conime.exe
EPROCESS: 0xffb881c0  process nAme: svchost.exe
EPROCESS: 0xffb90020  process nAme: svchost.exe
EPROCESS: 0xffb9e5d8  process nAme: svchost.exe
EPROCESS: 0xffbaeda8  process nAme: svchost.exe
EPROCESS: 0xffbc3020  process nAme: lsass.exe
EPROCESS: 0xffbcf2a0  process nAme: services.exe
EPROCESS: 0xffbd19f8  process nAme: winlogon.exe
seArching finish 

哦,没有0,4号进程
回找到重复的进程,就像csrss.exe那样的......还不清楚是那些是干什么的


//findprocess.c//        by uty@uaty//#include <ntddk.h>#define PDE_INVALID 2#define PTE_INVALID 1#define VALID        0#define PEB_OFFSET                    0x1b0#define OBJECT_HEADER_SIZE            0x18#define OBJECT_TYPE_OFFSET            0x8#define EPROCESS_NAME_OFFSET        0x174VOID WorkThreAd(IN PVOID pContext);VOID DriverUnloAd(IN PDRIVER_OBJECT Driver_object);VOID seArchprocess(VOID);VOID getnAme(ULONG Addr);ULONG vAlidpAge(ULONG Addr);BOOLEAN IsAReAlProcess(ULONG i);NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath){    NTSTATUS    dwStAtus;    HANDLE        hThreAd;    DbgPrint("i'm coming :>\n");        DriverObject->DriverUnload = DriverUnloAd;        dwStAtus = PsCreateSystemThread(&hThreAd,        (ACCESS_MASK)0,        NULL,        (HANDLE)0,        NULL,        WorkThreAd,        NULL        );            return STATUS_SUCCESS;}//--------------------------------------------------------------------VOID DriverUnloAd(IN PDRIVER_OBJECT Driver_object){}//--------------------------------------------------------------------VOID WorkThreAd(IN PVOID pContext){    seArchprocess();        PsTerminateSystemThread(STATUS_SUCCESS);    DbgPrint("Never be here ?\n");}//--------------------------------------------------------------------VOID seArchprocess(void){    ULONG    i;    ULONG    result;        for (i = 0x80000000 ;i<0x90000000;i+=4){        result = vAlidpAge(i);        if (result == VALID){            if (*(PULONG)i == 0x7ffdf000){                if(IsAReAlProcess(i)){                    DbgPrint("EPROCESS: 0x%x  ",i-PEB_OFFSET);                    getnAme(i);                }            }        }        else if(result == PTE_INVALID){            i -=4;            i += 0x1000;//4k        }        else{            i-=4;            i+= 0x400000;//4mb        }            }    for (i = 0xf0000000 ;i<0xffbe0000;i+=4){        result = vAlidpAge(i);        if (result == VALID){            if (*(PULONG)i == 0x7ffdf000){                if(IsAReAlProcess(i)){                    DbgPrint("EPROCESS: 0x%x  ",i-PEB_OFFSET);                    getnAme(i);                }            }        }        else if(result == PTE_INVALID){            i -=4;            i += 0x1000;//4k        }        else{            i-=4;            i+= 0x400000;//4mb        }            }    DbgPrint("seArching finish \n");}//--------------------------------------------------------------------VOID getnAme(ULONG Addr){    DbgPrint("process nAme: %s\n",(PCHAR)(Addr-PEB_OFFSET+EPROCESS_NAME_OFFSET));}//--------------------------------------------------------------------ULONG vAlidpAge(ULONG Addr){    ULONG    pte;    ULONG    pde;        pde = 0xc0300000 + (Addr>>22)*4;    if((*(PULONG)pde & 0x1) != 0){        //lArge pAge        if((*(PULONG)pde & 0x80) != 0){            return VALID;        }        pte = 0xc0000000 + (Addr>>12)*4;        if((*(PULONG)pte & 0x1) != 0){            return VALID;        }        else{            return PTE_INVALID;        }    }    return PDE_INVALID;}//--------------------------------------------------------------------BOOLEAN IsAReAlProcess(ULONG i){    NTSTATUS            stAtus;    PUNICODE_STRING        pUnicode;    UNICODE_STRING        Process;    ULONG                pObjectType;    ULONG                pObjectTypeProcess;            pObjectTypeProcess = *(PULONG)((ULONG)PsGetCurrentProcess() -OBJECT_HEADER_SIZE +OBJECT_TYPE_OFFSET);    if (vAlidpAge(i-PEB_OFFSET) != VALID){        return FALSE;    }        if (vAlidpAge(i-PEB_OFFSET - OBJECT_HEADER_SIZE + OBJECT_TYPE_OFFSET) == VALID){        pObjectType = *(PULONG)(i-PEB_OFFSET - OBJECT_HEADER_SIZE + OBJECT_TYPE_OFFSET);    }    else{        return FALSE;    }        if(pObjectTypeProcess == pObjectType){                return TRUE;    }    return FALSE;    }//--------------------------------------------------------------------
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
scut_duoluo
驱动牛犊
驱动牛犊
  • 注册日期2007-01-09
  • 最后登录2007-09-13
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-05-16 15:02
上面的代码有问题 不适合XP及以上版本
PEB地址不能硬编码为一个固定值
游客

返回顶部