吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11452|回复: 37
收起左侧

[C&C++ 转载] 【流放X路】SPY v0.1 源码发布

[复制链接]
小俊 发表于 2018-5-19 13:02
本帖最后由 wushaominkk 于 2019-6-6 21:21 编辑

更新时间:2018年12月5日
POE SPY v0.2
[C++] 纯文本查看 复制代码
#include <Windows.h>
#include <stdio.h>
#pragma warning(disable:4996)

#define SEND_RVA 0x6B2878 // 83 C1 0C 50 50 8B 11 FF 52 1C C2 08 00
#define RECV_RVA 0x6B28A5 // 81 C1 9C 00 00 00 50 50 8B 11 FF 52 1C C2 08 00

class HOOK
{
public:
        HOOK(DWORD HookAddr, DWORD FakeAddr)
        {
                // 获取游戏模块基址
                m_HookAddr = (DWORD)GetModuleHandle(NULL);
                m_HookAddr += HookAddr;
                m_FakeAddr = FakeAddr;
        }

        // 需要Hook的地址
        DWORD m_HookAddr;

        // 需要跳转的地址
        DWORD m_FakeAddr;

        // 原始代码
        byte m_OldCode[5];

        // 是否开启
        BOOL m_State = FALSE;

        // Hook
        void OnHook()
        {
                if (m_State == FALSE)
                {
                        // 设置状态为开启
                        m_State = TRUE;
                        // 保存原始代码
                        SetMemory(m_OldCode, (void*)m_HookAddr);
                        // Jmp 0xXXXXXXXX
                        char JmpCode[5] = { 0xE9 };
                        *(DWORD*)&JmpCode[1] = (m_FakeAddr - m_HookAddr) - 5;
                        // 修改代码
                        SetMemory((void*)m_HookAddr, JmpCode);
                }
        }

        // UnHook
        void UnHook()
        {
                if (m_State == TRUE)
                {
                        // 设置状态为关闭
                        m_State = FALSE;
                        // 还原代码
                        SetMemory((void*)m_HookAddr, m_OldCode);
                }
        }

        // 绕过页保护属性修改内存
        static void SetMemory(void * Dst, void * Src, size_t size = 5)
        {
                // 用来保存内存页属性
                DWORD OldProtect;
                // 修改页保护属性
                VirtualProtect((LPVOID)Dst, size, PAGE_EXECUTE_READWRITE, &OldProtect);
                // 内存拷贝
                memcpy(Dst, Src, size);
                // 还原页保护属性
                VirtualProtect((LPVOID)Dst, size, OldProtect, &OldProtect);
        }
};


// ================================ Hook Send ================================

void __stdcall SendHandler(byte * buf, size_t len)
{
        printf("发送字节数:%d\n", len);
}

DWORD SendBackAddr;
void __declspec(naked) Fake_Send()
{
        __asm {
                pushad
                push edi
                push eax
                call SendHandler
                popad

                add ecx, 0xC
                push eax
                push eax
                jmp[SendBackAddr]
        }
}

// ================================ Hook Recv ================================

void __stdcall RecvHandler(byte * buf, size_t len)
{
        printf("接收字节数:%d\n", len);
}

void __declspec(naked) Fake_Recv()
{
        __asm {
                pushad
                push[esp + 0x28]
                push[esp + 0x24]
                call RecvHandler
                popad

                ret 8
        }
}


// 工作线程
DWORD WINAPI DllThread(LPVOID lpParam)
{
        printf("F1:FreeLibrary And UnHook All\n");
        printf("F2:Hook Send\n");
        printf("F3:Hook Recv\n");
        printf("F4:UnHook All\n");

        // Init HOOK
        SendBackAddr = (DWORD)GetModuleHandle(NULL) + SEND_RVA + 5;
        HOOK SendHook(SEND_RVA, (DWORD)Fake_Send);
        HOOK RecvHook(RECV_RVA, (DWORD)Fake_Recv);

        // 主循环
        while (!GetAsyncKeyState(VK_F1))
        {
                if (GetAsyncKeyState(VK_F2))
                {
                        printf("Hook Send\n");
                        SendHook.OnHook();
                }
                if (GetAsyncKeyState(VK_F3))
                {
                        printf("Hook Recv\n");
                        RecvHook.OnHook();
                }
                if (GetAsyncKeyState(VK_F4))
                {
                        printf("UnHook All\n");
                        SendHook.UnHook();
                        RecvHook.UnHook();
                }
                Sleep(100);
        }

        // UnHook All
        printf("FreeLibrary And UnHook All\n");
        SendHook.UnHook();
        RecvHook.UnHook();

        // 卸载模块,并安全退出线程
        FreeLibraryAndExitThread((HMODULE)lpParam, 0);
        return 0;
}

// 入口点
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID)
{
        switch (dwReason)
        {
        case DLL_PROCESS_ATTACH:
                // 分配一个控制台
                AllocConsole();
                // 设置控制台标题
                SetConsoleTitleA("POE_Spy 0.2");
                // 重定向输出流到控制台
                freopen("CONOUT$", "w", stdout);
                // 创建线程
                CreateThread(0, 0, DllThread, hModule, 0, 0);
                break;
        case DLL_PROCESS_DETACH:
                // 释放控制台
                FreeConsole();
                break;
        }
        return TRUE;
}


注入器
[C] 纯文本查看 复制代码
#include <Windows.h>
#include <TlHelp32.h> 

int main()
{
        // 遍历进程
        HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) };
        Process32First(hProcessSnap, &pe32);
        do
        {
                if (!strcmp(pe32.szExeFile, "PathOfExile.exe"))
                        break;
        } while (Process32Next(hProcessSnap, &pe32));
        CloseHandle(hProcessSnap);
 
        // 打开进程
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
 
        // 在目标进程申请内存
        LPVOID pRemoteAddress = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
 
        CHAR Path[] = "SPY.dll";
        // 将DLL路径写入目标进程
        WriteProcessMemory(hProcess, pRemoteAddress, Path, sizeof(Path), NULL);
 
        // 创建远程线程
        HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0,
                (LPTHREAD_START_ROUTINE)LoadLibraryA, pRemoteAddress, 0, NULL);
 
        // 等待线程结束
        WaitForSingleObject(hThread, -1);
 
        // 释放申请的内存
        VirtualFreeEx(hProcess, pRemoteAddress, 1, MEM_DECOMMIT);
 
        // 关闭句柄
        CloseHandle(hProcess);
        CloseHandle(hThread);
 
        return 0;
}

支持国际服 3.2.4b
需要配合 Dbgview


spy.png

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
云梦墨溪 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
丶十年之约 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zy3683398 发表于 2019-4-18 18:47
莫zzzzz 发表于 2019-3-11 19:48
大佬   不求这么高大上的。。。 只求下无限视距和地图高亮的基址     以前不知道在哪里弄的
国际服开了3. ...

老哥你先在弄到了吗 能分享一手吗
zy3683398 发表于 2019-4-18 18:46
莫zzzzz 发表于 2019-3-11 19:48
大佬   不求这么高大上的。。。 只求下无限视距和地图高亮的基址     以前不知道在哪里弄的
国际服开了3. ...

老哥你先在弄到了吗 能分享一手吗
默笙哥哥 发表于 2018-5-19 13:24
那长未 发表于 2018-5-19 13:27
然而我把你发的都看过了,就是看不懂
小2b 发表于 2018-5-19 13:28
不玩流放了,东西是好东西
 楼主| 小俊 发表于 2018-5-19 13:33
那长未 发表于 2018-5-19 13:27
然而我把你发的都看过了,就是看不懂

马上高考了,学习太忙了,发帖的时间都是挤出来的。
没打算详细讲,所以发个帖子当做笔记

放暑假的时候可能会出一些比较详细的教程帖
csl2438883838 发表于 2018-5-19 13:41
来个成品。。。
pt1314 发表于 2018-5-19 13:45
小俊 发表于 2018-5-19 13:33
马上高考了,学习太忙了,发帖的时间都是挤出来的。
没打算详细讲,所以发个帖子当做笔记

没用过你的那个编程语言,有直接用的吗?
手起刀落嘤嘤怪 发表于 2018-5-19 14:14
大佬能带路吗 想学习
chenpengxj8 发表于 2018-5-19 14:48
看不懂,请解释
cai8588329 发表于 2018-5-19 15:51
在玩POE  可惜看不懂
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 10:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表