zoukankan      html  css  js  c++  java
  • Hook API-之进程保护

    原文标题为:Hook API-之进程保护 出处就不知道了!
    用过卡巴斯基的朋友都知道,卡巴斯基的进程是无法杀掉的,在任务管理器中杀卡巴进程的话,会弹出一个消息框提示拒绝访问!那么这是怎么实现的呢?很简单,就是使用了HOOK API的方法。

    我用delphi来写程序好了,先写个dll。


    const
    PRG_NAME = 'ddos.exe';

    var TerminateProcessNext : function (processHandle, exitCode: dword) : bool; stdcall;
    NtTerminateProcessNext : function (processHandle, exitCode: dword) : dword; stdcall;


    {$R *.res}
    function ThisIsOurProcess(processHandle: dword) : boolean;
    var pid : dword;
    arrCh : array [0..MAX_PATH] of char;
    begin
    pid := ProcessHandleToId(processHandle);
    result := (pid <> 0) and ProcessIdToFileName(pid, arrCh) and
    (PosText(PRG_NAME, arrCh) > 0);
    end;

    function TerminateProcessCallback(processHandle, exitCode: dword) : bool; stdcall;
    begin
    if ThisIsOurProcess(processHandle) then
    begin
    result := false;
    SetLastError(ERROR_ACCESS_DENIED);
    end
    else
    result := TerminateProcessNext(processHandle, exitCode);

    end;

    function NtTerminateProcessCallback(processHandle, exitCode: dword) : dword; stdcall;
    const STATUS_ACCESS_DENIED = $C0000022;
    begin
    if ThisIsOurProcess(processHandle) then
    begin
    result := STATUS_ACCESS_DENIED
    end
    else
    result := NtTerminateProcessNext(processHandle, exitCode);
    end;

    begin
    if GetVersion and $80000000 = 0 then
    HookAPI( 'ntdll.dll', 'NtTerminateProcess', @NtTerminateProcessCallback, @NtTerminateProcessNext)
    else HookAPI('kernel32.dll', 'TerminateProcess', @TerminateProcessCallback, @TerminateProcessNext);
    end.

    再写个exe调用这个dll,把这个dll插入到系统进程中去。
    procedure inject;
    begin
    try
    if not InjectLibrary((CURRENT_SESSION or CURRENT_PROCESS), 'hook.dll') then
    begin
    ExitProcess(0); //如果没有把hook.dll插入到进程中去,那么程序就自动关闭
    end;
    except
    //
    end;
    end;


    procedure uninject; //把hook.dll从插入的进程中卸载掉
    begin
    try
    UninjectLibrary((CURRENT_SESSION or CURRENT_PROCESS), 'hook.dll');
    except
    end;
    end;


    procedure TForm1.FormCreate(Sender: TObject);
    begin
    inject; //程序一启动就插入dll
    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    uninject; //程序退出把dll从进程中卸载,保护进程功能也就失效了。
    end;

  • 相关阅读:
    计算一路话音消耗的带宽
    谋哥:我跟CEO们都说了啥
    wchar与char字符转换的探究
    pl/sql配置连接远程数据库oracle,本地没有安装oracle数据库的情况下
    围住浮动元素的三种方法
    Chromium浏览器组件设计意图
    tonymillion/Reachability的使用
    赵雅智_名片夹(3)_下拉刷新载入很多其它
    动态创建菜单和动态关联菜单项事件
    delphi创建动态菜单
  • 原文地址:https://www.cnblogs.com/cloudstep/p/1518922.html
Copyright © 2011-2022 走看看