找回密码
 立即注册
GTA5修改器.风灵月影生化危机7修改器.风灵月影三国志13修改器.风灵月影讨鬼传2修改器.风灵月影猎天使魔女修改器.风灵月影
刺客信条修改器虐杀原形2修改器.风灵月影看门狗2修改器.风灵月影鬼泣5修改器.风灵月影上古卷轴5修改器
查看: 43|回复: 0

VC6剑侠世界一对多PK辅助源代码,新手推荐

[复制链接]

2604

主题

2627

帖子

8001

积分

论坛元老

Rank: 8Rank: 8

积分
8001
发表于 2017-7-3 21:07:50 | 显示全部楼层 |阅读模式


01.jpg
这个辅助的组成一共3个部分:自动加血(消息按键)+自动寻路跟随(调用游戏汇编CALL)+攻击敌人(消息按键)

原理简单说明(代码中有很详细的中文说明注释):

1.这个程序针对剑侠世界多开客户端,用多线程的方法一一对应.

一个线程对应一个游戏客户端读取数据,可以同时控制多个客户端角色.

2.吃药,加血功能用的windows消息功能实现.

3.跟随主角功能使用远程线程执行的方式调用了游戏客户端的自动寻路api功能,

这个API数据需要OD游戏客户端逆向得到,并确实私下调用了游戏客户端,

所以该程序并不一定合法,只做技术上的研究比较好.

4.对于对客户端数据的定位,有两种方法(其实还有另外一种象杀毒软件那种,特征码数据查找)
一种是内存块查找定位.
一种是通过基址定位.(我觉得这个大家说的基址,其实应该是一个对象指针)


从剑侠1,剑侠2到剑侠世界.

最后我终于学会去调用游戏里的功能,

但是由于JS的游戏更新太快,自己逆向和ASM比较差,所允许的时间也不多和合法性等等原因.

剑侠世界EM加血程序(多人版)仅仅作为一个简单的游戏辅助工具来出现了.

该程序基本也到了自己VC代码的最高水平了.

以后桌面的程序制作也会越来越少了,方向转向WEB方面,这个方面实用性更大.



//************************
UINT workthread(LPVOID pParam)
{
        CAbDlg *pdlg=(CAbDlg *)pParam;

        int n=pdlg->winnumber;

        CArray <C56jxplayer,C56jxplayer&> playerarray;        //玩家对象组

        int cdred=100,cd1=100,cd2=100;

        //-------写数据到目标进程,代码写在循环前面,只写一次---------
        //这里一定要先打开process
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,windows.GetAt(n).PID);               
        POINT p;
        DWORD        cbCodeSize=((LPBYTE)AfterMyFunc-(LPBYTE)MyFunc);
        void *pDataRemote=(DWORD*)VirtualAllocEx(hProcess,0,sizeof(p),MEM_COMMIT,PAGE_READWRITE );
        PDWORD        pCodeRemote=(PDWORD)VirtualAllocEx(hProcess,0,cbCodeSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE);

        //-------如果有问题,退出---------
        if (WriteProcessMemory(hProcess,pCodeRemote,&MyFunc,cbCodeSize,NULL)==0) return 0;



        while(pdlg->m_check1.GetCheck())
        {       
        Sleep(300);
        cdred++;
        cd1++;
        cd2++;


                       
                                       
        //----------读取----------------               
        playerarray.RemoveAll();

        //拿到人物的指针
        DWORD playerbaseaddress;
        ::ReadProcessMemory(hProcess,(LPCVOID)base,&playerbaseaddress,4,NULL);


        DWORD playeronesize=0xAC3C;

         DWORD pAddmaxblood=playerbaseaddress+0x334;
         DWORD pAddblood=playerbaseaddress+0x338;
         DWORD pAddax=playerbaseaddress+0xA89C-0xA0;         
         DWORD pAdday=playerbaseaddress+0xA89C-0xA0+4;         
         DWORD pAddname=playerbaseaddress+0xA89C;        //name
       
        for (int z=1;z<200;z++)     //10个               
                {
                C56jxplayer playerone;        //玩家对象
                ::ReadProcessMemory(hProcess,(LPCVOID)(pAddmaxblood+playeronesize*z),&playerone.maxblood,4,NULL);
                ::ReadProcessMemory(hProcess,(LPCVOID)(pAddblood+playeronesize*z),&playerone.blood,4,NULL);
                ::ReadProcessMemory(hProcess,(LPCVOID)(pAddax+playeronesize*z),&playerone.ax,4,NULL);
                ::ReadProcessMemory(hProcess,(LPCVOID)(pAdday+playeronesize*z),&playerone.ay,4,NULL);
                ::ReadProcessMemory(hProcess,(LPCVOID)(pAddname+playeronesize*z),&playerone.name,26,NULL);
               
                if (playerone.Getname()!="") playerarray.Add(playerone);
                }

        //-------------吃药--------------
        if ((cdred>15) && (windows.GetAt(n).isred) && (playerarray.GetAt(0).blood < (playerarray.GetAt(0).maxblood/2) ))
                {
                        char key='6';
                        ::PostMessage(windows.GetAt(n).hwnd,WM_KEYDOWN,(WPARAM)key,MAKELPARAM(1,(WORD)MapVirtualKey(key,0)));   
                        ::PostMessage(windows.GetAt(n).hwnd,WM_KEYUP,(WPARAM)key,MAKELPARAM(1,(WORD)MapVirtualKey(key,0)));
                        cdred=0;
                }
        //-------------加血--------------
        if ((cd1>10)&&(windows.GetAt(n).isblood))
                {
                for (int i=0;i<playerarray.GetSize();i++)
                                {                       
                                        if (windows.GetAt(n).aimname==playerarray.GetAt(i).Getname())
                                                {                                               
                                                        if (playerarray.GetAt(i).Getblood()<playerarray.GetAt(i).Getmaxblood())
                                                                {
                                                                //取自己坐标
                                                                int x=playerarray.GetAt(0).Getax();
                                                                int y=playerarray.GetAt(0).Getay();
                                                                //取队友坐标
                                                                int x1=playerarray.GetAt(i).Getax();
                                                                int y1=playerarray.GetAt(i).Getay();
                                                                //游戏里目标坐标点
                                                                int px=0,py=0;
                                                                //四个象限
                                                                if ((x<=x1)&&(y<=y1)) {px=400+(x1-x);py=300+(y1-y)/2;}
                                                                else if ((x>=x1)&&(y>=y1)) {px=400-(x-x1);py=300-(y-y1)/2;}
                                                                else if ((x>=x1)&&(y<=y1)) {px=400-(x-x1);py=300+(y1-y)/2;}
                                                                else if ((x<=x1)&&(y>=y1)) {px=400+(x1-x);py=300-(y-y1)/2;}

                                                                ::PostMessage(windows.GetAt(n).hwnd,WM_MOUSEMOVE,0,MAKELPARAM(px,py));
                                                                char key='2';
                                                                ::PostMessage(windows.GetAt(n).hwnd,WM_KEYDOWN,(WPARAM)key,MAKELPARAM(1,(WORD)MapVirtualKey(key,0)));   
                                                                ::PostMessage(windows.GetAt(n).hwnd,WM_KEYUP,(WPARAM)key,MAKELPARAM(1,(WORD)MapVirtualKey(key,0)));
                                                       
                                                                ::PostMessage(windows.GetAt(n).hwnd,WM_KEYDOWN,(WPARAM)key,MAKELPARAM(1,(WORD)MapVirtualKey(key,0)));   
                                                                ::PostMessage(windows.GetAt(n).hwnd,WM_KEYUP,(WPARAM)key,MAKELPARAM(1,(WORD)MapVirtualKey(key,0)));
                                                                cd1=0;
                                                                break;
                                                                }
                                                }
                                }
                }


        //-------------跟随call--------------
        if ((cd2>5)&&(windows.GetAt(n).isfollow) )
                {
                        for (int i=0;i<playerarray.GetSize();i++)
                                {
                                if (windows.GetAt(n).aimname==playerarray.GetAt(i).Getname())
                                        {
                                        if ((playerarray.GetAt(0).Getax()!=playerarray.GetAt(i).Getax())||(playerarray.GetAt(0).Getay()!=playerarray.GetAt(i).Getay()))
                                                {       
                                                p.x=playerarray.GetAt(i).Getax()/32;
                                                p.y=playerarray.GetAt(i).Getay()/32;                       

                                                if (WriteProcessMemory(hProcess,pDataRemote,&p,sizeof(p),NULL)!=0)
                                                        {                                                                       
                                                        HANDLE hthread=CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)pCodeRemote,pDataRemote,0,NULL);
                                                        if (hthread)
                                                                {
                                                                ::WaitForSingleObject( hthread, INFINITE );
                                                                ::CloseHandle(hthread);
                                                                }
                                                        }
                                                cd2=0;
                                                break;
                                                }
                                        }
                                }       
                }


                               
        //--while完--
        }
        //-------------线程关闭-------------
        ::VirtualFreeEx( hProcess, pDataRemote,sizeof(p),MEM_RELEASE);       
        ::VirtualFreeEx( hProcess, pCodeRemote,cbCodeSize,MEM_RELEASE);               
        CloseHandle(hProcess);
        return 0;
}


static void WINAPI MyFunc(LPVOID pData)
{


        POINT *pt=(POINT *)pData;
        DWORD x=pt->x;
        DWORD y=pt->y;
        //该call,是ctrl+F9按9次得到

        DWORD address=0x52EAD0; //走路call的地址
         _asm
         {
         pushad
         mov     edx, dword ptr ds:[0xDC24B0] //全局指针,用CE找值找到 0xDC24B0
         mov     dword ptr ds:[edx+0x5964],1

         mov     eax, dword ptr ds:[0xDC24B0]
         mov     ecx,x
         mov     dword ptr ds:[eax+0x5968],ecx

         mov     edx, dword ptr ds:[0xDC24B0]
         mov     eax,y
         mov     dword ptr ds:[edx+0x596C],eax

         mov     ecx, dword ptr ds:[0xDC24B0]

         call address
         popad

        }

}

剑侠世界VC6源码辅助.rar (46.52 KB, 下载次数: 0, 售价: 100 金钱)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表