首页
社区
课程
招聘
[原创]Ring3内存清0杀进程
发表于: 2009-5-1 18:15 11083

[原创]Ring3内存清0杀进程

2009-5-1 18:15
11083
看到标题不要惊讶,这个东西很久很久以前就有人发过了,当时我完全没看懂。下面的代码是我根据题目按照自己的想法写的,只是因为最近很无聊,代码没有任何价值。
#include<stdio.h> 
#include<windows.h> 
#include<Tlhelp32.h> 
int kestrcmpi(char *str1,char *str2); 
BOOL EnableDebugPrivileges(); 
int main(void) 
{ 
    PROCESSENTRY32 pe32; 
    MODULEENTRY32 te32; 
    HANDLE hSnapshot,hSnapshot1,hTarget; 
    void *pNothing; 
    char *szTarget[31]; 
    DWORD dwStore,dwFillSize;
    printf("Input the name of process which you wanna kill(case sensitive):"); 
    scanf("%30s",szTarget); 
    EnableDebugPrivileges(); 
    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 
    if(hSnapshot == INVALID_HANDLE_VALUE) 
    { 
        printf("Create snapshot for processes failed!\n"); 
        system("pause"); 
        return 1; 
    } 
    pe32.dwSize = sizeof(PROCESSENTRY32); 
    if(Process32First(hSnapshot,&pe32)) 
        do 
        { 
            if(kestrcmpi(pe32.szExeFile,(char*)szTarget)) 
            { 
                hSnapshot1 = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pe32.th32ProcessID); 
                if(hSnapshot1 == INVALID_HANDLE_VALUE) 
                { 
                    printf("Create snapshot for modules failed!\n"); 
                    system("pause"); 
                    return 1; 
                } 
                te32.dwSize = sizeof(MODULEENTRY32); 
                if(Module32First(hSnapshot1,&te32)) 
                { 
                    hTarget = OpenProcess(PROCESS_ALL_ACCESS,0,pe32.th32ProcessID); 
                    if(!hTarget) 
                    { 
                        printf("open target process failed!\n"); 
                        system("pause"); 
                        return 1; 
                    } 
                    if(!ReadProcessMemory(hTarget,(void*)(te32.modBaseAddr+0x3c),&dwStore,4,NULL))
                    {
                        printf("ReadProcessMemory1 failed!\n");
                        system("pause");
                        return 1;
                    }
                    if(!ReadProcessMemory(hTarget,(void*)(te32.modBaseAddr+dwStore+0x28),&dwStore,4,NULL))
                    {
                        printf("ReadProcessMemory2 failed!\n");
                        system("pause");
                        return 1;
                    }
                    dwFillSize = (int)te32.modBaseSize-dwStore;
                    pNothing = calloc(dwFillSize,1); 
                    if(!WriteProcessMemory(hTarget,(void*)(te32.modBaseAddr+dwStore),pNothing,dwFillSize,NULL)) 
                    { 
                        printf("WriteProcessMemory failed!\n"); 
                        system("pause"); 
                        return 1; 
                    } 
                } 
            } 
        } 
        while(Process32Next(hSnapshot,&pe32)); 
    free(pNothing); 
    CloseHandle(hTarget);
    CloseHandle(hSnapshot); 
    CloseHandle(hSnapshot1); 
    return 0; 
} 
int kestrcmpi(char *str1,char *str2) 
{ 
    if(strlen(str1) != strlen(str2)) 
        return 0; 
    while(*str1 != 0) 
    { 
        if((*str1|0x20) != (*str2|0x20)) 
            return 0; 
        str1++; 
        str2++; 
    } 
    return 1; 
} 
BOOL EnableDebugPrivileges() 
{ 
  BOOL bRet; 
  HANDLE hToken; 
  bRet = OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken); 
  if(!bRet) 
    return 0; 
  TOKEN_PRIVILEGES tp; 
  tp.PrivilegeCount = 1; 
  LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tp.Privileges[0].Luid); 
  tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
  AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL); 
  if(GetLastError() != ERROR_SUCCESS) 
    return 0; 
  return 1; 
} 


附bin一个

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 7
支持
分享
最新回复 (14)
雪    币: 168
活跃值: (233)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
2
很好。旧货才是硬道理。
发挥作用,就是好代码!
2009-5-1 19:01
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
哇,居然把猪头三引来拉。
我在你的群里,不过你肯定不知道哪一个是我
2009-5-1 19:24
0
雪    币: 63
活跃值: (17)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
你在猪头群上的ID报上来。
大家X一下
2009-5-1 20:21
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
5
不如直接R0 改CR3清0威力大
2009-5-1 21:17
0
雪    币: 433
活跃值: (1875)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
6
黑防上的文章????
2009-5-1 21:22
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
7
请仔细区分,我只在最近有期上看到有篇ring0的。


完全看不懂
2009-5-2 06:08
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
8
就是在驱动中不用attach过去,直接更改CR3寄存器,然后填0就行了,基本不需要什么API.
所以威力大一些...
2009-5-2 09:47
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼上的厉害啊
2009-5-2 13:30
0
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
10
attach 函数里面应该也会该CR3的吧.

就是不知道怎么查对应进程的页目录.

有资料的兄弟分享一下哈
2009-5-2 14:55
0
雪    币: 91
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
看看NetRoc,那个文章,改点就是R0的KILL了。
http://bbs.pediy.com/showthread.php?t=64938&viewgoodnees=1&prefixid=phpforce_38
2009-5-2 16:42
0
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
12
多谢楼上的
2009-5-2 17:21
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
360的进程貌似penProcess(PROCESS_ALL_ACCESS,0,pe32.th32ProcessID)“不了
2009-5-2 19:15
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
14
如果你对360特别感兴趣,请咨询5楼。这个代码不是专门拿来xx进程的,只是对一种实现方法的练习。
2009-5-2 19:25
0
雪    币: 65
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
cr3好像是某某寄存器
2009-5-6 10:58
0
游客
登录 | 注册 方可回帖
返回
//