ce吧 关注:194,521贴子:3,795,765
  • 15回复贴,共1

【诚心请教】为什么C++写成exe后一用汇编就停止工作

只看楼主收藏回复

如题,简单的不用汇编的功能如无敌霸体可以实现,但一用汇编call如透明就不行@大神们 求解答,谢谢~


IP属地:上海1楼2017-01-11 15:54回复
    【透明这么写一用就停止工作】
    void 透明call(int 触发基址, int 无敌开关)
    {
    //LPVOID 空白地址 = (LPVOID*)calloc(100, sizeof(LPVOID));
    __asm
    {
    //mov eax, dword ptr ds : [空白地址]
    mov ecx, 触发基址
    mov esi, ecx
    push - 1
    push 1
    push 无敌开关
    push 1
    mov edx, 无敌CALL //无敌call
    //push eax
    call edx
    }
    //free(空白地址);
    }
    int 读整数(int address)
    {
    LPVOID 返回数据;
    SIZE_T length = 4;//长度
    //hProcess = GetCurrentProcess(); //打开当前进程
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, (DWORD)pid);//PROCESS_VM_READ
    int abb;
    abb = ReadProcessMemory(hProcess, (LPCVOID)address, &返回数据, length, FALSE);//内存读整数
    CloseHandle(hProcess);
    return (int)返回数据;
    }
    int main(){
    HWND hWnd = FindWindow(TEXT("地下城与勇士"), TEXT("地下城与勇士"));//定义DNF的窗口句柄和类名
    GetWindowThreadProcessId(hWnd, &pid);//获取DNF进程句柄
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);//打开DNF进程 提升权限
    透明call(读整数(人物基址), 1);
    }


    IP属地:上海2楼2017-01-11 15:55
    回复
      好乱....


      3楼2017-01-11 16:27
      回复
        外部要远程汇编吧


        IP属地:浙江来自Android客户端4楼2017-01-11 16:42
        回复
          calloc 你申请的是你进程的内存 申请别的进程内存用 vistualalloc ,申请下,在用 writeprocessmemory 把汇编代码写入 进程内存, 再用 CreateRemoteThread 远程调用 过程就这样 去写吧


          IP属地:山西5楼2017-01-11 17:48
          收起回复
            IP属地:甘肃来自Android客户端6楼2017-01-11 17:55
            回复
              楼主可以指导下吗。


              IP属地:中国澳门来自iPhone客户端7楼2017-01-11 23:56
              回复
                好厉害的样子


                IP属地:湖南来自Android客户端8楼2017-01-12 00:01
                回复
                  【远程调用有参数的和无参数call都不行啊@大神宫在此 @各位大神,请求帮助】
                  typedef struct ParamData //参数结构
                  {
                  int Param1;
                  int Param2;
                  int Param3;
                  int Param4;
                  int Param5;
                  int Param6;
                  }ParamData, *Paramp;
                  //函数名:InfusionFunc
                  //功能 :封装远程注入的函数 //参数 1:进程ID
                  //参数 2:被注入函数指针<函数名> //参数 3:参数 //参数 4:参数长度
                  //**************************************************************************************
                  void Infusion(LPVOID mFunc, LPVOID Param = NULL, DWORD ParamSize = NULL)
                  {
                  //HANDLE hProcess;//远程句柄
                  LPVOID mFuncAddr;//申请函数内存地址
                  LPVOID ParamAddr;//申请参数内存地址
                  HANDLE hThread; //线程句柄
                  DWORD NumberOfByte; //辅助返回值
                  CString str;
                  //打开被注入的进程句柄
                  hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);//pid进程ID
                  //申请内存
                  mFuncAddr = VirtualAllocEx(hProcess, NULL, 128, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
                  ParamAddr = VirtualAllocEx(hProcess, NULL, ParamSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
                  //写内存
                  WriteProcessMemory(hProcess, mFuncAddr, mFunc, 128, &NumberOfByte);
                  WriteProcessMemory(hProcess, ParamAddr, Param, ParamSize, &NumberOfByte);//&NumberOfByte
                  //创建远程线程
                  hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)mFuncAddr,
                  ParamAddr, 0, &NumberOfByte);
                  if (NULL == hThread)
                  {
                  AfxMessageBox(L"CreateRemoteThread Error !");
                  }
                  WaitForSingleObject(hThread, INFINITE); //等待线程结束
                  //释放申请有内存
                  VirtualFreeEx(hProcess, mFuncAddr, 128, MEM_RELEASE);
                  VirtualFreeEx(hProcess, ParamAddr, ParamSize, MEM_RELEASE);
                  //释放远程句柄
                  CloseHandle(hThread);
                  CloseHandle(hProcess);
                  }
                  void 透明call()//无参call
                  {
                  int 触发基址 = 读整数(人物基址);
                  __asm
                  {
                  pushad
                  mov ecx, 触发基址
                  mov esi, ecx
                  push - 1
                  push 1
                  push 1
                  push 1
                  mov edx, 无敌CALL
                  call edx
                  popad
                  }
                  }
                  int main(){
                  HWND hWnd = FindWindow(TEXT("地下城与勇士"), TEXT("地下城与勇士"));//定义DNF的窗口句柄和类名
                  GetWindowThreadProcessId(hWnd, &pid);//获取DNF进程句柄
                  HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);//打开DNF进程 提升权限
                  Infusion((LPVOID)透明call);
                  }
                  第二种:有参数call
                  void 透明call(int 触发基址,int 无敌开关)//
                  {
                  ParamData * lp;
                  lp = (ParamData *)lParam;
                  int 触发基址 = (int)lp->Param1;
                  int 无敌开关 = (int)lp->Param2;
                  __asm
                  {
                  pushad
                  mov ecx, 触发基址
                  mov esi, ecx
                  push - 1
                  push 1
                  push 无敌开关
                  push 1
                  mov edx, 无敌CALL
                  call edx
                  popad
                  }
                  }
                  void 透明()
                  {
                  ParamData CallParam;
                  CallParam.Param1 = 读整数(人物基址);
                  CallParam.Param2 = 1;
                  Infusion((LPVOID)透明call, (LPVOID)&CallParam, (DWORD)sizeof(CallParam));
                  }


                  IP属地:上海9楼2017-01-12 13:00
                  回复
                    混个脸熟。,。,。,


                    IP属地:北京来自Android客户端10楼2017-01-12 13:11
                    回复
                      自己看吧 我不没 破图标 源码 不带搞exe


                      IP属地:山西11楼2017-01-19 16:50
                      回复
                        参数 参数是那个结构才能正确传参 所有的参数都放到结构里 把结构 指针穿进去才行


                        IP属地:山西来自Android客户端12楼2017-04-09 22:01
                        回复