郁金香初级班 5/15 1-10

目录

1.c++入口点(省略)

2.c++函数和转义(省略)

3-C,C++调用Windows系统API接口

4-C,C++ char,short,int,LPCTSTR与sizeof运算符

5-C,C++ 利用Windows API 操作游戏窗口

6-C,C++ 利用Windows API 获取进程PID

7-C,C++读取目标进程内存数据

008-C,C++读取目标内存数据 读4字节

009-CE分析基址偏移-精确数值-找阳光

010-CE分析基址偏移-未知初始值--阳光速度

{

https://blog.csdn.net/m0_60451234/article/details/127822344

}

内容

03.c++调用windows系统API

学习目标:

   了解Windows.h头文件      微软操作系统接口头文件

这些系统函数其实就是所谓的接口,我们就是调用的接口
   识记UINT类型

无符号整型 范围0-0xffffffff
   识记 多项目情况下 设置 启动项目
   项目规范化


   了解LPCTSTR 类型

所以LPCTSTR就表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。
   了解HWND类型
窗口句柄
   调用MessageBoxA函数
   
   int WINAPI MessageBox(
   HWND hWnd,//窗口句柄
   LPCTSTR lpText,   //字符串 描述
   LPCTSTR lpCaption, //字符串 标题
   UINT uType //窗口类型
   );

实例
   MessageBoxA(0, "内容", "标题", 0);

04.了解部分数据类型

了解数值类型char*与LPCTSTR

char* 的存储字符串的原理

    84:     const char* zm = "w1";
 mov         dword ptr [ebp-8],0F68B9Ch--这个地址内存储这字符串 我们是把这个字符串的地址给了zm

而这个地址是不可改的 对此加上了const

LPCTSTR: LP代表指针、 C代表不可改变、 T代表根据是否定义UNICODE宏而分别define
了解无符号整数unsigned

char a -有符号 大小 0x0--127

unsigned char 0x0-0x255

能够表示的正数范围变大

    char c = 256;
    unsigned  char c1 = 128;
    printf("%d,%d", c, c1);
区别

 05. 利用Windows API 操作游戏窗口

识记句柄的作用
了解窗口句柄类型HWND
了解FindWindowA
了解SetWindowTextA
了解GetWindowText

 

#include <iostream>
#include<Windows.h>
int main()
{
    
    HWND 窗口句柄 = FindWindowA("CalcFrame", NULL);// (HWND)0x0390AD0;
    printf("窗口句柄=%p\r\n", 窗口句柄);
    SetWindowTextA(窗口句柄, "1111222新标题名adfadfasdfs");
    printf("sizeof(窗口句柄)=%zd字节\r\n", sizeof(窗口句柄)); //eax,rax
    getchar();
}
代码演示

 

 06-C,C++ 利用Windows API 获取进程PID

学习目标:
认识进程PID
认识线程TID

FindWindowA
GetWindowThreadProcessId //返回线程TID和进程PID

 

#include <iostream>
#include<Windows.h>
int main()
{
     //1 通过窗口标题或者类名 获取目标窗口句柄
     //2 通过窗口句柄获取进程的PID,TID
    HWND h = FindWindowA("MainWindow", "植物大战僵尸中文版");
    printf("窗口句柄 h=%p\r\n", h);
    DWORD pid, tid;
    printf("&pid=%p\r\n", &pid);
    // int 和long是等价
    //DWORD  等价于 unsigned long 
    //DWORD* 等价于 LPDWORD
    tid=GetWindowThreadProcessId(h, &pid); // a&b
    printf("tid=%d pid=%d  16进制tid=%X 16进制pid=%X\r\n", tid, pid,tid,pid);
}
 
代码演示

 

 07-C,C++读取目标进程内存数据

认识进程句柄HANDLE
GetWindowThreadProcessId //返回线程TID和进程PID
OpenProcess //获取进程句柄的函数
ReadProcessMemory
了解数据的强制转换

DWORD GetWindowThreadProcessId(
HWND hWnd,
LPDWORD lpdwProcessId
);

HANDLE OpenProcess(
DWORD dwDesiredAccess, //渴望得到的访问权限(标志)
BOOL bInheritHandle, // 是否继承句柄 0
DWORD dwProcessId// 进程标示符PID
);

BOOL ReadProcessMemory(
HANDLE hProcess,//进程句柄 一般由OpenProcess返回
LPCVOID lpBaseAddress,//游戏数据地址 160D98A0
LPVOID lpBuffer,//用于存放数据的地址  存放阳光的地址 3333
DWORD nSize, //表示从lpBaseAddress地址开始 读取nSize字节  4
LPDWORD lpNumberOfBytesRead
);


dwDesiredAccess [1]  :获取的权限,可分为以下几种
PROCESS_ALL_ACCESS:获取所有权限
PROCESS_CREATE_PROCESS:创建进程
PROCESS_CREATE_THREAD:创建线程
PROCESS_DUP_HANDLE:使用DuplicateHandle()函数复制一个新句柄
PROCESS_QUERY_INFORMATION:获取进程的令牌、退出码和优先级等信息
PROCESS_QUERY_LIMITED_INFORMATION:获取进程特定的某个信息
PROCESS_SET_INFORMATION:设置进程的某种信息
PROCESS_SET_QUOTA:使用SetProcessWorkingSetSize函数设置内存限制
PROCESS_SUSPEND_RESUME:暂停或者恢复一个进程
PROCESS_TERMINATE:使用Terminate函数终止进程
PROCESS_VM_OPERATION:在进程的地址空间执行操作
PROCESS_VM_READ:使用ReadProcessMemory函数在进程中读取内存
PROCESS_VM_WRITE:使用WriteProcessMemory函数在进程中写入内存
SYNCHRONIZE:使用wait函数等待进程终止
代码演示

学习目标:
认识进程句柄HANDLE
GetWindowThreadProcessId //返回线程TID和进程PID
OpenProcess //获取进程句柄的函数
ReadProcessMemory
了解数据的强制转换

 

 08-C,C++读取目标内存数据 读4字节 

以植物大战僵尸为例子 进行读取

 

#include<stdio.h>
#include<Windows.h>
int R4(UINT_PTR 内存地址)
{
    
    /// uintptr_t能够存储指针的无符号整数类型。

    HWND 窗口句柄 = FindWindowA("MainWindow", "植物大战僵尸中文版");
    printf("窗口句柄 h=%p  行号=%d\r\n", 窗口句柄, __LINE__);
    DWORD PID = 0, TID = 0;
    TID = GetWindowThreadProcessId(窗口句柄, &PID);
    HANDLE 进程句柄 = OpenProcess(PROCESS_ALL_ACCESS, 0, PID);
    unsigned int 返回值 = 0;
    ReadProcessMemory(进程句柄, (LPCVOID)内存地址, &返回值, 4,0);

    return 返回值;
}
int main()
{

    int 阳光值 = R4(R4(R4(0x6A9EC0) + 0x768) + 0x5560);
    printf("阳光值=%d 行号=%d\r\n", 阳光值, __LINE__);




    return 0;
}
阳光获取

#include<stdio.h>
#include<Windows.h>
int R4(UINT_PTR 内存地址)
{
///uintptr_t能够存储指针的无符号整数类型。
    HWND 窗口句柄 = FindWindowA("MainWindow", "植物大战僵尸中文版");
    printf("窗口句柄 h=%p  行号=%d\r\n", 窗口句柄, __LINE__);
    DWORD PID = 0, TID = 0;
    TID = GetWindowThreadProcessId(窗口句柄, &PID);
    HANDLE 进程句柄 = OpenProcess(PROCESS_ALL_ACCESS, 0, PID);
    unsigned int 返回值 = 0;
    ReadProcessMemory(进程句柄, (LPCVOID)内存地址, &返回值, 4,0);

    return 返回值;
}
int main()
{

    int 阳光值 = R4(R4(R4(0x6A9EC0) + 0x768) + 0x5560);
    printf("阳光值=%d 行号=%d\r\n", 阳光值, __LINE__);




    return 0;
posted @ 2023-05-15 14:45  大橘|博客  阅读(35)  评论(0)    收藏  举报