level 12
顶了
-- 与其临渊羡鱼,不如退而结网。若不给自己设限,则人生中就没有限制你发挥的藩篱。
2015年10月14日 15点10分
4
level 7
#include <iostream>
using namespace std;
int add(int a,int b);
int add(int a,int b)
{
int num=0;
num=a+b;
return num;
}
int main()
{
int c=0;
c=add(1,2);
cout<<c<<endl;
return 0;
}
可以看到结果输出3
2015年10月14日 15点10分
6
level 7
函数还有一种写法 不过函数一定要放在int main上面 这种是省去定义的
#include <iostream>
using namespace std;
int add(int a,int b)//只有函数体
{
int num=0;
num=a+b;
return num;
}
int main()
{
int c=0;
c=add(1,2);//调用函数add 把1和2放进去 并把返回的结果给c
cout<<c<<endl;//输出c 换行
return 0;
}
2015年10月14日 15点10分
7
菜菜想说下win32 函数可以向前声明
2015年11月15日 05点11分
level 7
在头文件add.h里写上刚才的那个函数
int add(int a,int b);
int add(int a,int b)
{
int num=0;
num=a+b;
return num;
}
关掉 保存
2015年10月14日 15点10分
9
level 7
再建立个c++ source file 取名 add.cpp(名字其实没啥关系 只是为了美观点··)
在里面写上
#include <iostream>
#include "add.h"
using namespace std;
int main()
{
int c=0;
c=add(1,2);
cout<<c<<endl;
return 0;
}
编译 运行 你就会看到输出结果3 结果跟上面的一样不同的是把函数放头文件来调用了
2015年10月14日 15点10分
10
level 7
这里粗略讲下程序是怎样运行 #include<iostream> 就不讲了 理解为iostream.h这个头文件的函数都已经在程序里 主要讲下main的运行
首先 int c=0; 定义c为int型(整数)
c=add(1,2);这里分两部分 调用add()函数 这时就会跳到int add(int a,int b) 这个函数里 把1和2作为参数给int a和int b 这时a就是1 b就是2 然后执行函数体 int num=0;定义个num int型并赋值为0
然后num=a+b; 就是1+2然后赋值给num(右边开始读) 这是num就是3
return num;就是把这个3返回去主函数 这时主函数main里的c就是3
cout<<c<<endl;输出c到屏幕 换行
#include <iostream>
using namespace std;
int add(int a,int b)
{
int num=0;
num=a+b;
return num;
}
int main()
{
int c=0;
c=add(1,2);
cout<<c<<endl;
return 0;
}
2015年10月14日 16点10分
11
level 7
因为要用到加密 为了方便调用 就写到头文件了 与第一节课不同 这里的读写内存函数 也做了个包装 放到头文件里 也是为了方便+美观 函数如下
dnf_code.h
//写内存
DWORD WriteMemory(DWORD Address,DWORD n,HANDLE hProcss)
{
WriteProcessMemory(hProcss, (LPVOID)Address, &n, sizeof(n), NULL);
return 0;
}
//读内存
DWORD ReadMemory(DWORD Address,HANDLE hProcss)
{
DWORD tmp=0;
ReadProcessMemory(hProcss, (LPCVOID)Address, &tmp, sizeof(tmp), NULL);
return tmp;
}
dnf_code.cpp //调用
WeadMemory(ENCODE_BASE_ADDRESS,hProcss);
ReadMemory(ENCODE_BASE_ADDRESS,hProcss);
2015年10月14日 16点10分
15
虽然是坟贴了,但是我还是想问问这个个ReadMemory的参数是什么情况
2016年03月10日 03点03分
@Ly源n 写错,是WriteMemory,这个和那个WeadMemory是什么情况
2016年03月10日 03点03分
level 7
//加密函数
int EnCode(DWORD Address, DWORD Data,HANDLE hProcss);
Address即 上面算出那个地址
Data 是99999999
hProcss是主函数那边那个句柄
在主函数调用
EnCode(tmp,ne,hProcss);//tmp即上面算出那个地址 ne是99999999 hProcss是dnf进程句柄
2015年10月14日 16点10分
18
地址是指的评分的基址吗?
2015年11月15日 05点11分
level 7
下面放完整代码
dnf_code.h
#include <Windows.h>
//写内存
DWORD WriteMemory(DWORD Address,DWORD n,HANDLE hProcss)
{
WriteProcessMemory(hProcss, (LPVOID)Address, &n, sizeof(n), NULL);
return 0;
}
//读内存
DWORD ReadMemory(DWORD Address,HANDLE hProcss)
{
DWORD tmp=0;
ReadProcessMemory(hProcss, (LPCVOID)Address, &tmp, sizeof(tmp), NULL);//读取人物基址
return tmp;
}
//加密函数
int EnCode(DWORD Address, DWORD Data,HANDLE hProcss)
{
DWORD ENCODE_BASE_ADDRESS = 0x31A6558; //加密基址
DWORD ENCODE_PARAMETER1 = 0x02CED558; //加密参数1
DWORD ENCODE_PARAMETER2 = 0x02CED758; //加密参数2
DWORD DECODE_BASE_ADDRESS = 0x031A64F8; //解密基址
DWORD nEdi, nEcx, nEax, nEsi, nEdx, nSs;
nEcx = Address;
nEax = ReadMemory(ENCODE_BASE_ADDRESS,hProcss);
nEax += 1;
WriteMemory(ENCODE_BASE_ADDRESS, nEax,hProcss);
nEdx = nEax;
nEdx >>= 8;
nEdx <<= 24;
nEdx >>= 24;
nEdx = ReadMemory(nEdx * 2 + ENCODE_PARAMETER1,hProcss);
nEdx &= 0xFFFF;
nEax <<= 24;
nEax >>= 24;
nSs = ReadMemory(nEax * 2 + ENCODE_PARAMETER2,hProcss);
nSs &= 0xFFFF;
nEax = nEdx ^ nSs;
nEax &= 0xFFFF;
nEsi = Data;
nEdx = nEsi >> 16;
nSs = nEsi & 0xFFFF;
nEdx += nSs;
nEdi = nEdx ^ nEax;
nEdx = nEax;
nEax <<= 16;
nEax += nEdx;
nEsi = Data;
nEax ^= nEsi;
nEsi = Address + 4;
WriteMemory(nEsi, nEax,hProcss);
nEax = ReadMemory(Address,hProcss);
nEsi = ReadMemory(DECODE_BASE_ADDRESS,hProcss);
nEcx = nEdi;
nEcx <<= 16;
nEcx += nEdx;
nEdx = nEax;
nEdx >>= 16;
nEdx = ReadMemory(nEsi + nEdx * 4 + 36,hProcss);
nEax &= 0xFFFF;
WriteMemory(nEdx + nEax * 4 + 8468, nEcx,hProcss);
return 1;
}
//解密函数
int DeCode(DWORD Address,HANDLE hProcss)
{
DWORD DECODE_BASE_ADDRESS=0x031A64F8; //解密基址
DWORD nEax, nEsi, nEdx;
nEax = ReadMemory(Address,hProcss);
nEsi = ReadMemory(DECODE_BASE_ADDRESS,hProcss);
nEdx = nEax;
nEdx >>= 16;
nEdx = ReadMemory(nEsi + nEdx * 4 + 36,hProcss);
nEax &= 0xFFFF;
nEax = ReadMemory(nEdx + nEax * 4 + 8468,hProcss);
nEax &= 0xFFFF;
nEdx = nEax;
nEsi = nEdx;
nEsi <<= 16;
nEsi += nEdx;
nEdx = ReadMemory(Address + 4,hProcss);
nEax = nEsi ^ nEdx;
return nEax;
}
2015年10月14日 16点10分
19
加密函数和解密函数是不是都是封装好了???算法不会变?还有加密参数、解密基址都不会变么?
2015年10月26日 01点10分
@三思而先行_ 不是 每次更新自己改 ce吧有人会放基址
2015年10月26日 04点10分
回复 Timsqin :我看了你10月22号更新的常量,是不是所有的常量都有可能在某次更新以后发生变化???还是有些是不会变的???比如技能栏和物品栏
2015年10月26日 07点10分
level 7
#include "dnf_code.h"
#include <Windows.h>
int main()
{
DWORD pf_base = 0x309053C;//评分基址
DWORD pf_de = 0x110;//三SSS偏移
DWORD tmp = 0;
DWORD pid = 0;
HWND hWnd = FindWindow(TEXT("地下城与勇士"),TEXT("地下城与勇士")); //窗口句柄
GetWindowThreadProcessId(hWnd,&pid);
HANDLE hProcss = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
//3sss评分
tmp=ReadMemory(pf_base,hProcss);//读取人物基址的值
tmp += pf_de;//值和偏移相加得出地址
DWORD ne = 99999999;
EnCode(tmp,ne,hProcss);
CloseHandle(hProcss);
return 0;
}
2015年10月14日 16点10分
20
dnf_code.cpp
2015年10月14日 16点10分