小俊 发表于 2018-5-19 13:02

【流放X路】SPY v0.1 源码发布

本帖最后由 wushaominkk 于 2019-6-6 21:21 编辑

更新时间:2018年12月5日
POE SPY v0.2

#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;

      // 是否开启
      BOOL m_State = FALSE;

      // Hook
      void OnHook()
      {
                if (m_State == FALSE)
                {
                        // 设置状态为开启
                        m_State = TRUE;
                        // 保存原始代码
                        SetMemory(m_OldCode, (void*)m_HookAddr);
                        // Jmp 0xXXXXXXXX
                        char JmpCode = { 0xE9 };
                        *(DWORD*)&JmpCode = (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
      }
}

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

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

void __declspec(naked) Fake_Recv()
{
      __asm {
                pushad
                push
                push
                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;
}


注入器

#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

!(https://upload-images.jianshu.io/upload_images/6462920-61184517bcca6e17.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

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

完全看不懂
{:17_1068:}

那长未 发表于 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可惜看不懂
页: [1] 2 3 4
查看完整版本: 【流放X路】SPY v0.1 源码发布