在给MM朋友做了个诛仙外挂(脚本写的 )后,再应她要求,小试一下劲舞团!

2G的劲舞一个通宵下载下来后安装,先注册一个ID吧,进游戏,CPU好卡!!!!!
打开CE准备搜索内存了,选中游戏进程,我搜!! 咔--------居然说无法打开进程!!!
预料之中,看了NP的介绍,觉得问题不大,但仔细一看,好像不是NP,  SSDT有以下几个地方被HOOK了:
NtOpenProcess              ;防止你打开游戏进程
NtReadVirtualMemory     ;防止你读游戏内存
NtWriteVirtualMemory    ;防止你写游戏内存
NtSuspendThread          ;游戏有一个线程不停的反外挂检测,防止被你停掉了!!!
NtTerminateThread        ;防止进程被意外终止后驱动不能正常退出,SSDT不能恢复!!

写驱动注入NtOpenProcess和NtReadVirtualMemory,
OK,可以打开游戏了,继续读内存试试,
怪事来了,返回EAX=1,好像成功了!但读出的东西全是0!怀疑根本没读成功!!!

这还不是最怪的,用VirtualQueryEx查询游戏内存情况,这时反外挂跳出来了!游戏终止,
VirtualQueryEx===>NtQueryVirtualMemory都没有被HOOK啊!!!是怎么被发现的??

还有用冰刃查看进程,也会被游戏侦查到,然后提示反外挂出现问题后退出,
冰刃查看进程用了比较底层的东西了,但仍会被检查到!!!
SSDT就只有以上的地方被HOOK,  NtQuerySystemInformation没有遭毒手!

在冰刃的进线程监控中得到的游戏PID和任务管理器里的一样,我openprocess和ReadVirtualMemory完全绕过了SSDT,但就是读不出东西!然后一调用VirtualQueryEx就会被游戏发现!
openprocess得到的句柄绝对是正确的!因为我可以在游戏中创建远线程!!

  • 标 题:答复
  • 作 者:austinzq
  • 时 间:2007-11-18 20:27

嗯,inline hook 哪里可能都会躲。
不然就自己实现一下 ReadVirtualMemory 

==================================
NTSTATUS
NtReadVirtualMemory (
     IN HANDLE ProcessHandle,
     IN PVOID BaseAddress,
     OUT PVOID Buffer,
     IN ULONG BufferSize,
     OUT PULONG NumberOfBytesRead OPTIONAL
     )
{
    ULONG BytesCopied;
    KPROCESSOR_MODE PreviousMode;
    PEPROCESS Process;
    NTSTATUS Status;

    PAGED_CODE();

    PreviousMode = KeGetPreviousMode();
    if (PreviousMode != KernelMode) {

        Status = MiValidateUserTransfer(BaseAddress, Buffer, BufferSize);
        if (Status != STATUS_SUCCESS) {
            return Status;
        }

        if (ARGUMENT_PRESENT(NumberOfBytesRead)) {
            try {
                ProbeForWriteUlong(NumberOfBytesRead);

            } except(EXCEPTION_EXECUTE_HANDLER) {
                return GetExceptionCode();
            }
        }
    }

    BytesCopied = 0;
    Status = STATUS_SUCCESS;
    if (BufferSize != 0) {

        Status = ObReferenceObjectByHandle(ProcessHandle,
                                           PROCESS_VM_READ,
                                           PsProcessType,
                                           PreviousMode,
                                           (PVOID *)&Process,
                                           NULL);

        if (Status == STATUS_SUCCESS) {

            Status = MmCopyVirtualMemory (Process,
                                          BaseAddress,
                                          PsGetCurrentProcess(),
                                          Buffer,
                                          BufferSize,
                                          PreviousMode,
                                          &BytesCopied);

            ObDereferenceObject(Process);
        }
    }

    if (ARGUMENT_PRESENT(NumberOfBytesRead)) {
        try {
            *NumberOfBytesRead = BytesCopied;

        } except(EXCEPTION_EXECUTE_HANDLER) {
            NOTHING;
        }
    }

    return Status;
}

  • 标 题:答复
  • 作 者:bujin888
  • 时 间:2007-11-23 23:49

HS 的反外挂一共核心态拦截了14个NTAPI
其中9个是过滤 5个是监控 而且 3.2版的游戏还检测了钩子链  与钩子链所插入的DLL的5个监控API的调用规则