C#LVM#u从listview中删除项

C#LVM#u从listview中删除项,c#,winapi,hook,C#,Winapi,Hook,因此,我正在用C#编程,并试图从SysListView32中获取一个项id,然后发送一条LVM_DELETEITEM消息以从列表视图中删除该项 我的代码: using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Diagnostics; using Microsoft.Win32.SafeHandles; using System.Runti

因此,我正在用C#编程,并试图从SysListView32中获取一个项id,然后发送一条LVM_DELETEITEM消息以从列表视图中删除该项

我的代码:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using Microsoft.Win32.SafeHandles;
using System.Runtime.InteropServices;
using System.Text;
using System.ComponentModel;
using System.Windows.Forms;

namespace projone
{

    class Hooker
    {
        [DllImport("user32.dll", EntryPoint = "FindWindowA")]
        private static extern Int32 apiFindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll", EntryPoint = "FindWindowExA")]
        private static extern Int32 apiFindWindowEx(Int32 hWnd1, Int32 hWnd2, string lpsz1, string lpsz2);

        [DllImport("user32.dll", EntryPoint = "SendMessageA")]
        private static extern Int32 apiSendMessage(int hWnd, int wMsg, int wParam, int lParam);

        [DllImport("user32.dll", EntryPoint = "GetDesktopWindow")]
        private static extern Int32 apiGetDesktopWindow();

        static Int32 LVM_FIRST = 4096;
        static Int32 LVM_DELETEITEM = LVM_FIRST + 8;
        static Int32 LVM_SORTITEMS = LVM_FIRST + 48;
        static Int32 LVM_DELETECOLUMN = LVM_FIRST + 28;
        static Int32 LVM_FINDITEM = LVM_FIRST + 13;
        static Int32 LVM_GETITEMTEXT = LVM_FIRST + 45;


        public static void withdrawProcess()
        {
            Int32 lhWndParent = apiFindWindow(null, "Windows Task Manager");
            Int32 lhWndProcessList = 0;
            Int32 lhWndDialog = 0;

            for (int i = 1; (i < 7); i++)
            {
                lhWndDialog = apiFindWindowEx(lhWndParent, lhWndDialog, null, null);

                if((lhWndProcessList == 0))
                {
                    lhWndProcessList = apiFindWindowEx(lhWndDialog, 0, "SysListView32", "Processes");
                }
            }

            // Create List

            List<string> processes = new List<string>();

            // Loops

            int processItemCount = 0;
            Process[] processlist = Process.GetProcesses();
            foreach (Process theprocess in processlist)
            {
                processItemCount += 1;
                processes.Add(theprocess.ProcessName.ToString());
                if (theprocess.ProcessName.Equals("notepad"))
                {
                    apiSendMessage(lhWndProcessList, LVM_SORTITEMS, 0, 0);
                    apiSendMessage(lhWndProcessList, LVM_DELETEITEM, theprocess.Id, 0);
                }
            }

            Console.WriteLine(processItemCount);
            //processes.ForEach(Console.WriteLine);

            //apiSendMessage(lhWndProcessList, LVM_DELETEITEM, 0, "0"); // third entry is item id in listview
        }
    }
}
使用系统;
使用系统集合;
使用System.Collections.Generic;
使用系统数据;
使用系统诊断;
使用Microsoft.Win32.SafeHandles;
使用System.Runtime.InteropServices;
使用系统文本;
使用系统组件模型;
使用System.Windows.Forms;
名称空间projone
{
妓女阶级
{
[DllImport(“user32.dll”,EntryPoint=“FindWindowA”)]
私有静态外部程序Int32 apiFindWindow(字符串lpClassName,字符串lpWindowName);
[DllImport(“user32.dll”,EntryPoint=“FindWindowExA”)]
私有静态外部程序Int32-apiFindWindowEx(Int32-hWnd1、Int32-hWnd2、字符串lpsz1、字符串lpsz2);
[DllImport(“user32.dll”,EntryPoint=“SendMessageA”)]
私有静态外部程序Int32 apiSendMessage(inthwnd、intwmsg、intwparam、intlparam);
[DllImport(“user32.dll”,EntryPoint=“GetDesktopWindow”)]
私有静态外部程序Int32 apiGetDesktopWindow();
静态Int32 LVM_FIRST=4096;
静态Int32 LVM_DELETEITEM=LVM_FIRST+8;
静态Int32 LVM_SORTITEMS=LVM_FIRST+48;
静态Int32 LVM_DELETECOLUMN=LVM_FIRST+28;
静态Int32 LVM_FINDITEM=LVM_FIRST+13;
静态Int32 LVM_GETITEMTEXT=LVM_FIRST+45;
公共静态进程()
{
Int32 lhWndParent=apiFindWindow(null,“Windows任务管理器”);
Int32 lhWndProcessList=0;
Int32 lhWndDialog=0;
对于(int i=1;(i<7);i++)
{
lhWndDialog=apiFindWindowEx(lhWndParent,lhWndDialog,null,null);
if((lhWndProcessList==0))
{
lhWndProcessList=apiFindWindowEx(lhWndDialog,0,“SysListView32”,“进程”);
}
}
//创建列表
列表进程=新列表();
//循环
int processItemCount=0;
Process[]processlist=Process.getprocesss();
foreach(处理进程列表中的进程)
{
processItemCount+=1;
processs.Add(process.ProcessName.ToString());
if(process.ProcessName.Equals(“记事本”))
{
apiSendMessage(lhWndProcessList,LVM_SORTITEMS,0,0);
apiSendMessage(lhWndProcessList,LVM_DELETEITEM,进程Id,0);
}
}
Console.WriteLine(processItemCount);
//processs.ForEach(Console.WriteLine);
//apiSendMessage(lhWndProcessList,LVM_DELETEITEM,0,“0”);//第三个条目是listview中的项id
}
}
}

有没有关于如何更正它以便成功删除该项目的想法?不,这不是针对任何类型的“病毒”,我正在尝试查看是否有可能在不直接挂接和拦截NtQuerySystem信息的情况下执行此操作。

发送LVM_DELETEITEM时SendMessage调用的wparam参数必须是要删除项的索引;您正在传递进程id


发送LVM_DELETEITEM时SendMessage调用的lparam参数必须为零;您正在传递一个指向字符串的指针。

如果任务管理器有保护措施阻止您执行您试图执行的操作,我不会感到惊讶。如果它没有,我会感到惊讶

有什么问题?它在哪里失败?它是如何失败的?它不会从列表视图中删除该项。你为什么要编写恶意软件?@DavidHeffernan,正如我指出的,这不是恶意软件。这是一个测试,看看是否确实可以不挂接NtQuerySystemInformation。因此,我已将LPRAM更改为int,现在对于wparam,如何根据进程名称获取项的索引?您需要发送LVM_u消息来枚举所有项,并搜索具有您感兴趣的名称的项目,但我不确定是否可以跨进程枚举listview项目,因为你不能在进程间传递指针。可能有一些疯狂的黑客方法在另一个进程内分配内存,并获取指向该内存的指针,而该内存在另一个进程的上下文中是有意义的。我不知道如何做这样的事情,但如果你真的感兴趣,(而且你的生活中没有任何更有用的东西),那么这些信息应该足以让你开始谷歌搜索。那么有没有办法获取所有项目的索引,创建一个循环,然后删除listview中的每个项目?好吧,回到绘图板。谢谢你的帮助,迈克!是的,当然它有办法阻止它,但实际上有两种方法阻止人们看到物品。1是挂接NtQuerySystemInformation,让所有内容都通过自定义函数查找条目,在其显示之前将其删除;2是在计时器上设置函数,查找任务管理器是否打开,并在用户看到该条目之前删除该条目。现在,您正在讨论如何处理系统调用;从这里开始这会变得更疯狂。