agopoe吧 关注:35,982贴子:549,283

【c++ 打造属于自己的辅助】第二课 3SSS+三速写法 开教!

取消只看楼主收藏回复

首先感谢 @yk4441 @释摩陀 分享的源码 然后 开教!


IP属地:广东1楼2015-10-14 23:21回复
    #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


    IP属地:广东6楼2015-10-14 23:40
    回复
      函数还有一种写法 不过函数一定要放在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;
      }


      IP属地:广东7楼2015-10-14 23:42
      收起回复
        再讲讲头文件 第一课讲过头文件 像Windows.h 这种就是头文件 头文件里有很多函数可以调用 这种就是头文件
        现在我们就写一个头文件 并用函数来调用 创建方法跟c++source file差不多 只是选的是这个


        IP属地:广东8楼2015-10-14 23:47
        回复
          在头文件add.h里写上刚才的那个函数
          int add(int a,int b);
          int add(int a,int b)
          {
          int num=0;
          num=a+b;
          return num;
          }
          关掉 保存


          IP属地:广东9楼2015-10-14 23:50
          回复
            再建立个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 结果跟上面的一样不同的是把函数放头文件来调用了


            IP属地:广东10楼2015-10-14 23:53
            回复
              这里粗略讲下程序是怎样运行 #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;
              }


              IP属地:广东11楼2015-10-15 00:05
              回复
                到了这里 我自己都忍不住要bb两句 说那么多干啥 快入正片
                其实正片都要用到以上的知识 所以讲下···


                IP属地:广东13楼2015-10-15 00:07
                收起回复
                  好了 开始正片


                  IP属地:广东14楼2015-10-15 00:08
                  收起回复
                    因为要用到加密 为了方便调用 就写到头文件了 与第一节课不同 这里的读写内存函数 也做了个包装 放到头文件里 也是为了方便+美观 函数如下
                    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);


                    IP属地:广东15楼2015-10-15 00:13
                    收起回复
                      加解密函数就不说了 主要讲下调用方法 首先3s写法

                      (用评分基址的值) 加上 (十六进制的110转十进制的值) 得出一个需要加密写入的地址 (110是3sss偏移)
                      99999999是待需要修改的值 就是把评分修改成这个


                      IP属地:广东17楼2015-10-15 00:19
                      回复
                        //加密函数
                        int EnCode(DWORD Address, DWORD Data,HANDLE hProcss);
                        Address即 上面算出那个地址
                        Data 是99999999
                        hProcss是主函数那边那个句柄
                        在主函数调用
                        EnCode(tmp,ne,hProcss);//tmp即上面算出那个地址 ne是99999999 hProcss是dnf进程句柄


                        IP属地:广东18楼2015-10-15 00:25
                        收起回复
                          下面放完整代码
                          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;
                          }


                          IP属地:广东19楼2015-10-15 00:26
                          收起回复
                            #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;
                            }


                            IP属地:广东20楼2015-10-15 00:28
                            收起回复
                              源码加成品地址
                              http://tieba.baidu.com/p/4101959691


                              IP属地:广东21楼2015-10-15 00:38
                              收起回复