Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 2 của 18 Đầu tiênĐầu tiên 123412 ... CuốiCuối
Kết quả 11 đến 20 của 176
  1. #11
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi gianghoplus
    Ở phần đóng băng, có 1 số cách khá đơn giản

    Ví dụ có 1 biến timer được thiết đặt sẵn (fix cứng hoặc đặt khi runtime)

    C++ code:
    _header<font color="#000000">:
    timer = timer - 1
    if (timer <= 0)
    {
    //Do some thing
    }

    sleep(1000);
    goto _header:</font>




    Ta có 1 vài cách
    1. Thay số 1 thành 0 (timer = timer - 0)
    2. Tay phép trừ thành cộng (SUB [0xEC] thành ADD [0xC4])

    Hồi trước, gặp 1 thằng điên nó xét DK như sau

    if (timer == 0) ....

    thế là mình set luôn giá trị của timer (nó fix cứng là 100000) là -1. Trừ mãi mà biến timer cũng != 0 =))

    </div>
    </div>
    </div>cám ơn giang hồ, tớ hiểu ý giang hồ rồi, hay lắm, thêm 1 ý tưởng nữa vô...

  2. #12
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    đính kèm pikachu sau khi đã full mod và project code hack pikachu
    đính kèm cả source code auto pikachu ( win32api) phát triển với tú cu te

    Mã:
    #include <windows.h>#include "resource.h"#include <process.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; #pragma comment( linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' \version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"" )   /////////////////////////////////////////////////////////////#define ROW 11#define COLUMN 18 int countMonster; //---------------------------------------------typedef struct {     int *pointAddress;    int *timeAddress;    int *turnAddress;    HWND hwndGame; }Pointer;  //---------------------------------------------typedef struct {     int Address;    int ValueAddress;    int StatusAddress;    int CountMonster;    HWND hPikachu; }Resource;  //---------------------------------------------typedef struct {     int iValue;    int iStatus; }MONSTER; //---------------------------------------------typedef struct {     int x;    int y; }Point;  //---------------------------------------------typedef struct{     BOOL bPoint;    BOOL bTime;    BOOL bTurn;    BOOL bAuto; } StatusButton ; //---------------------------------------------typedef struct{     float point;    int turn;    int time; } ValueGame; ////////////////////////////////////////////////////////////////////////// Pointer Node;Resource Obj;MONSTER monster[ROW][COLUMN];StatusButton sButton;ValueGame vGame;HANDLE hProcess;HWND hWin; //////////////////////////////////////////////////////////////////////////int CheckPath(int ,int ,int ,int);void Auto();void ReadMap();  //////////////////////////////////////////////////////////////////////////int Initialize(){     Node.pointAddress = (int*)0x004B6088;    Node.timeAddress = (int*)0x004B6084;    Node.turnAddress = (int*)0x004B60AA;     //---------------------------------------------    Obj.Address = 0x04B6044;    Obj.CountMonster = 0x04B6078;     sButton.bPoint = sButton.bTime = sButton.bTurn = FALSE;     vGame.point = vGame.time = vGame.turn = 0;     Node.hwndGame = FindWindow(TEXT("ThunderRT6FormDC"),TEXT("³s³s¬Ý2"));     if ( !Node.hwndGame )   {         MessageBox(NULL,TEXT("Open Game Please !!..."), TEXT("Test"), MB_OK );        return FALSE;     }         while ( true ) {            if ( !FindWindowEx(Node.hwndGame,Obj.hPikachu,NULL,NULL) ) break;         Obj.hPikachu = FindWindowEx(Node.hwndGame,Obj.hPikachu,NULL,NULL);     } // ------------------- Close While Loop -------------------     DWORD dwProcessID;     GetWindowThreadProcessId(Node.hwndGame,&dwProcessID);    hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID);     if ( !hProcess )        return FALSE;         ReadProcessMemory(hProcess,(int*)Obj.Address,&Obj.ValueAddress,sizeof(int),NULL);    Obj.ValueAddress += 0x76;     ReadProcessMemory(hProcess,(int*)Obj.Address,&Obj.StatusAddress,sizeof(int),NULL);    Obj.StatusAddress +=  0x72;      return TRUE;}  int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,                    PSTR szCmdLine, int iCmdShow){    static TCHAR szAppName[] = TEXT ("TuMeoBox") ;    HWND         hwnd ;    MSG          msg ;    WNDCLASS     wndclass ;     // Khoi tao bien    if ( !Initialize() )        return 0;     TCHAR szBuffer[MAX_PATH];     if ( !Node.hwndGame ){        wsprintf(szBuffer, TEXT("Don't Found Window Game !...")  );        MessageBox(NULL,szBuffer, TEXT("Test"), MB_OK );        return 0;    }     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;    wndclass.lpfnWndProc   = WndProc ;    wndclass.cbClsExtra    = 0 ;    wndclass.cbWndExtra    = DLGWINDOWEXTRA ;    wndclass.hInstance     = hInstance ;    wndclass.hIcon         = LoadIcon (hInstance, TEXT("TuMeoIcon")) ;    wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;    wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE+1);    wndclass.lpszMenuName  = NULL ;    wndclass.lpszClassName = szAppName ;      if (!RegisterClass (&wndclass))    {        MessageBeep(0);        return 0 ;    }        hwnd = CreateDialog(hInstance,TEXT("TuMeoDlg"),NULL,NULL);      ShowWindow (hwnd, iCmdShow) ;    UpdateWindow (hwnd) ;     while (GetMessage (&msg, NULL, 0, 0))    {        TranslateMessage (&msg) ;        DispatchMessage (&msg) ;    }    return msg.wParam ;}    //////////////////////////////////////////////////////////////////////////void ThreadPoint(PVOID pVoid){      WriteProcessMemory(hProcess,Node.pointAddress,&vGame.point,sizeof(float),NULL);     while ( sButton.bPoint ){         //GetWindowThreadProcessId(Node.hwndGame,&pId);        //hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pId);        WriteProcessMemory(hProcess,Node.pointAddress,&vGame.point,sizeof(float),NULL);        Sleep(500);    }        _endthread(); }  //////////////////////////////////////////////////////////////////////////void ThreadTime(PVOID pVoid){      while ( sButton.bTime ) {            WriteProcessMemory(hProcess,Node.timeAddress,&vGame.time,sizeof(int),NULL);        Sleep(999);    } // ------------------- Close While Loop -------------------     _endthread(); } //////////////////////////////////////////////////////////////////////////void ThreadTurn(PVOID pVoid){      WriteProcessMemory(hProcess,Node.turnAddress,&vGame.turn,sizeof(int),NULL);     while ( sButton.bTurn ) {         WriteProcessMemory(hProcess,Node.turnAddress,&vGame.turn,sizeof(int),NULL);        Sleep(999);     } // ------------------- Close While Loop -------------------     _endthread(); }  //////////////////////////////////////////////////////////////////////////void ThreadAuto(PVOID pVoid){    while ( sButton.bAuto ) {            Auto();          } // ------------------- Close While Loop -------------------        _endthread();}   //---------------------------------------------LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){    HDC         hdc ;    PAINTSTRUCT ps ;    static      RECT  rect ;    TEXTMETRIC  tm;    static int cxClient, cyClient , cxChar , cyChar ;    static TCHAR szBuffer[1024];    static HINSTANCE hInst;    DWORD pId;    HANDLE hProcess;    float point = 100;    static HWND hButton;     switch ( message ){            case WM_CREATE:            hInst = ( (LPCREATESTRUCT) lParam)->hInstance;                        break;         case WM_SIZE:            cxClient = LOWORD(lParam);            cyClient = HIWORD(lParam);            break;             case WM_COMMAND:             switch ( LOWORD(wParam) ){                            case IDC_POINT:                    sButton.bPoint ^= 1;                     if ( sButton.bPoint )                        _beginthread(ThreadPoint,0,0);                     break;                 case IDC_SETPOINT:                    vGame.point = GetDlgItemInt(hwnd,IDC_VALUEPOINT,NULL,FALSE);                    _beginthread(ThreadPoint,0,0);                     break;                 case IDC_TIME:                    sButton.bTime ^= 1;//( sButton.bTime) ? FALSE : TRUE;                    vGame.time = 0;                     if ( sButton.bTime )                        _beginthread(ThreadTime,0,0);                     break;                                    case IDC_TURN:                    sButton.bTurn ^= 1;                     if ( sButton.bTurn )                        _beginthread(ThreadTurn,0,0);                     break;                case IDC_SETTURN:                    vGame.turn = GetDlgItemInt(hwnd,IDC_TURNVALUE,NULL,FALSE);                    _beginthread(ThreadTurn,0,0);                    break;                 case IDC_AUTO:                                     sButton.bAuto = TRUE;                    hButton = GetDlgItem(hwnd,IDC_AUTO);                     SetWindowLong(hButton,GWL_ID,IDC_CANCEL);                    SetWindowText(hButton,TEXT("Cancel"));                     _beginthread(ThreadAuto,0,0);                    break;                 case IDC_CANCEL:                                         sButton.bAuto = FALSE;                    hButton = GetDlgItem(hwnd,IDC_CANCEL);                     SetWindowLong(hButton,GWL_ID,IDC_AUTO);                    SetWindowText(hButton,TEXT("Auto Play"));                    break;                  case IDOK:                    DestroyWindow(hwnd);                    break;                                                                                                                    } // -------------------End Switch -------------------             break;                    case WM_DESTROY:            PostQuitMessage(0);             break;        default:            return DefWindowProc (hwnd, message, wParam, lParam) ;     } // ------------- End Switch -----------     return 0;    }  //////////////////////////////////////////////////////////////////////////void ReadMap(){     for ( int i = 0;i<ROW;i++ )          for ( int j = 0;j<COLUMN;j++ ) {                    ReadProcessMemory(hProcess,(int*)( Obj.ValueAddress - 19*6 + ( i*18 + j )*6 ),&monster[i][j].iValue,1,NULL);            ReadProcessMemory(hProcess,(int*)( Obj.StatusAddress - 19*6 + ( i*18 + j )*6 ),&monster[i][j].iStatus,2,NULL);                } // ------------------- Close For Loop -------------------            ReadProcessMemory(hProcess,(int*)Obj.CountMonster,&countMonster,1,NULL);} //////////////////////////////////////////////////////////////////////////int Inside(int x1,int y1){      if ( x1 >= 0 && x1 < ROW && y1 >= 0 && y1 < COLUMN )        return TRUE;     return FALSE;} //////////////////////////////////////////////////////////////////////////int CheckPath(int x1,int y1,int x2,int y2){     int i,j;    BOOL CanGo[4] , Check[ROW][COLUMN] ;    int cx[4] = {0,0,1,-1};    int cy[4] = {1,-1,0,0};    int first , last;     int Path[ROW][COLUMN];    Point Queue[198];    int varX[4] , varY[4];     // 2 o trung nhau    if ( x1 == x2 && y1 == y2 ) return FALSE;    // 2 o khac gia tri nhau    if ( monster[x1][y1].iValue != monster[x2][y2].iValue ) return FALSE;    // 1 trong 2 o khong ton tai    if ( !monster[x1][y1].iStatus || !monster[x2][y2].iStatus ) return FALSE;     first = last = 0;     Queue[last].x  = x1;    Queue[last++].y  = y1;       for ( int i1 = 0 ; i1<ROW; i1++ )         for ( int j1 = 0 ;j1<COLUMN;j1++ ) {                    Check[i1][j1] = FALSE;            Path[i1][j1] = FALSE;                } // ------------------- Close For Loop -------------------             Check[x1][y1] = TRUE;     while ( first < last ) {         i = Queue[first].x;        j = Queue[first++].y;                 for ( int t = 0 ;t<4;t++ ) {            CanGo[t] = TRUE;            varX[t] = i;            varY[t] = j;        }         do {                    for ( int t = 0 ; t<4; t++ ) {                            if ( CanGo[t] ){                     varX[t] += cx[t];                    varY[t] += cy[t];                     if ( !Inside(varX[t],varY[t]) ){ CanGo[t] = FALSE ; continue; }                    if ( varX[t] == x2 && varY[t] == y2  ) return TRUE;                    if ( monster[varX[t]][varY[t]].iStatus  ) { CanGo[t] = FALSE ; continue; }                     if ( Check[varX[t]][varY[t]] ) continue;                    if ( Path[i][j] == 2 ) continue;                     Queue[last].x = varX[t];                    Queue[last++].y = varY[t];                                        Check[varX[t]][varY[t]] = TRUE;                    Path[varX[t]][varY[t]]  = Path[i][j] + 1;                }                        } // ------------------- Close For Loop -------------------                } while ( CanGo[0] || CanGo[1] || CanGo[2] || CanGo[3] );        // ------------------- Close Do Loop -------------------        } // ------------------- Close While Loop -------------------     return FALSE;}      //////////////////////////////////////////////////////////////////////////void Auto(){     int x1,x2,y1,y2;     ReadMap();    HWND hwndOk;        if ( !countMonster ){          hWin = FindWindow(TEXT("#32770"),TEXT("??"));         if ( hWin ){             hWin = GetWindow(hWin,GW_CHILD);             SendMessage(hWin,WM_LBUTTONDOWN,1,MAKELONG(3,3));            SendMessage(hWin,WM_LBUTTONUP,1,MAKELONG(3,3));                        SendMessage(hWin,WM_LBUTTONDOWN,1,MAKELONG(3,3));            SendMessage(hWin,WM_LBUTTONUP,1,MAKELONG(3,3));        }     }     for ( int i = 0 ; i< 16*9 - 1;i++ ) {            x1 = i/16 + 1;        y1 = i%16 + 1;         for ( int j = i+1; j<16*9 ;j++ ) {                    x2 = j/16 + 1;            y2 = j%16 + 1;             if ( CheckPath(x1,y1,x2,y2) ){                 SendMessage(Obj.hPikachu,WM_LBUTTONDOWN,1,MAKELONG( (y1-1)*40 + 80 , (x1-1)*50 + 80) );                SendMessage(Obj.hPikachu,WM_LBUTTONDOWN,1,MAKELONG( (y2-1)*40 + 80 , (x2-1)*50 + 80) );                return;            }                } // ------------------- Close For Loop -------------------        } // ------------------- Close For Loop -------------------}

  3. #13
    Ngày tham gia
    Sep 2015
    Đang ở
    Số 60 Thái Hà, Đống Đa, Hà Nội
    Bài viết
    0
    Trích dẫn Gửi bởi langman
    đã thử theo cách của giang hồ, cũng vô hạn time , hờ hờ hờ

    mà có 1 vấn đề nhỏ xíu : thanh timebar lại ko ở dạng nguyên thể (nó cứ tụt hẳn đi, trông ko đẹp) và new game thì new game thì nó lại set timer về giá trị mặc định nên phải set lại lần nữa
    hj hj hj
    code demo luôn được không cậu [IMG]images/smilies/biggrin.png[/IMG] (mình không có biết ASM > không coi được code sau khi decompiler nền chỉ biết chờ kậu demo thôi :"> )
    thank vì bài viết chi tiết, có ích :">

    p/s : ngoài ra với những game full screen có thể tìm processID theo tên chương trình bằng hàm dưới này :


    Mã:
    DWORD GetPID(WCHAR pname[])   {         PROCESSENTRY32 pEntry;         HANDLE hSnapshot = NULL;         pEntry.dwSize = sizeof(PROCESSENTRY32);         hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);    Process32First(hSnapshot,&pEntry);         do {                 if(wcscmp(pEntry.szExeFile, pname) == 0)            return pEntry.th32ProcessID;         } while(Process32Next(hSnapshot,&pEntry));    return 0;   }
    Mong sớm được đọc chap 5 của kậu :">

  4. #14
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    hay quá,mở manh dc nhiều cái
    cho mình hỏi ngu tí,cái cơ chế của mấy chương trình như auto võ lâm..nó có giống như trình bày trên ko nhỉ

  5. #15
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi Taylaptrinh
    hay quá,mở manh dc nhiều cái
    cho mình hỏi ngu tí,cái cơ chế của mấy chương trình như auto võ lâm..nó có giống như trình bày trên ko nhỉ
    Auto mấy game kiểu võ lâm
    + Kiểm tra chương trình có chạy hay không, nếu có, get handle của window để send các key auto
    + Kiểm tra độ phân giải, xem Võ lâm chạy full screen hay window với kích thứoc là bao nhiêu
    + Xác định các điểm pixel và vị trí các thứ trong game. Ví dụ như skill, gold, coord
    + Chọn thao tác và kiểm tra, nếu good thì send key auto, không thì tìm cách khác để xem điều kiện auto
    ....blah blah ..

  6. #16
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi Xcross87
    Auto mấy game kiểu võ lâm
    + Kiểm tra chương trình có chạy hay không, nếu có, get handle của window để send các key auto
    + Kiểm tra độ phân giải, xem Võ lâm chạy full screen hay window với kích thứoc là bao nhiêu
    + Xác định các điểm pixel và vị trí các thứ trong game. Ví dụ như skill, gold, coord
    + Chọn thao tác và kiểm tra, nếu good thì send key auto, không thì tìm cách khác để xem điều kiện auto
    ....blah blah ..
    Các ý cậu nói đều đúng rồi, tớ chỉ xin bổ xung thêm chút xíu
    + 1 số auto thì quyết định gửi key vào thông qua các hàm api chuẩn
    + ở trong võ lâm có xây dựng lên 1 hệ thống Command giống như là cmd, 1 số auto quyết định send lệnh vô command này ví dụ ngồi, xuống ngựa, ......
    + với các auto xịn như vl auto thì nó ko send key auto mà nó thực hiện lời gọi đến các hàm có sẵn trong võ lâm phục vụ cho các việc auto

  7. #17
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    đã thử theo cách của giang hồ, cũng vô hạn time , hờ hờ hờ

    mà có 1 vấn đề nhỏ xíu : thanh timebar lại ko ở dạng nguyên thể (nó cứ tụt hẳn đi, trông ko đẹp) và new game thì new game thì nó lại set timer về giá trị mặc định nên phải set lại lần nữa
    hj hj hj

  8. #18
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi Con Nít
    code demo luôn được không cậu [IMG]images/smilies/biggrin.png[/IMG] (mình không có biết ASM > không coi được code sau khi decompiler nền chỉ biết chờ kậu demo thôi :"> )
    thank vì bài viết chi tiết, có ích :">

    p/s : ngoài ra với những game full screen có thể tìm processID theo tên chương trình bằng hàm dưới này :


    Mã:
    DWORD GetPID(WCHAR pname[])   {         PROCESSENTRY32 pEntry;         HANDLE hSnapshot = NULL;         pEntry.dwSize = sizeof(PROCESSENTRY32);         hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);    Process32First(hSnapshot,&pEntry);         do {                 if(wcscmp(pEntry.szExeFile, pname) == 0)            return pEntry.th32ProcessID;         } while(Process32Next(hSnapshot,&pEntry));    return 0;   }
    Mong sớm được đọc chap 5 của kậu :">
    ok cậu tớ sẽ cố gắng sớm up demo lên sớm nhất(hum nay cuối tuần tớ vìa quê oy)
    cám ơn cậu đã share code với tìm process với pe file name hj hj hj

    [IMG]images/smilies/1.gif[/IMG][IMG]images/smilies/1.gif[/IMG] về asm thì ở chap 4 tớ có phân tích sơ sơ đủ để các bạn ko thích asm cũng có thể hiểu mà.......

    thật ra cái biến time này nó là 1 biến float nhưng khi memory map tớ còn phát hiện ra như sau :
    giả sử 4 byte của biến float đó là abcd
    bỏ qua 2 byte a,b quan tâm đến c d tớ thấy
    + c chạy từ 0 đến 1 giá trị max rồi lại trở về 0 chạy tiếp, theo nhịp của trò chơi,
    + d càng nhỏ thì c chạy càng nhanh, khi d bằng 69 thì bắt đầu chạy từ từ, khi d cao đến gần 80 thì c chạy chậm hẳn
    + d=0 thì c chạy cực nhanh, cỡ mini dây, vụt 1 phát, d thành 69 luôn và c bắt đầu chạy từ từ với tộc dộ chậm dần


    và vì vậy :
    + nếu set d thành số nhỏ thì ngay lập tức trở về bình thường
    + nếu set d thành -1 thì có nghĩa d chính là 255 (vì nó là 8bit mà) sẽ overflow ngay
    + nếu set cả biến float 4byte này thành 1 số âm thì theo cách tớ vừa mô tả ở trên d sẽ rất nhanh chóng phục hồi lại thành 69 và ko có tác dụng
    + nếu set cả biến float 4byte này thành 1 số lớn hơn mức cực đại thì sẽ kết thúc trận đấu luôn

    ==> thay đổi biến time này ko có hiệu quả
    nhưng suy ra 1 cách đó là ta làm đóng băng giống như các cheat engine đóng băng : cứ 100ms thì lại set d=0 một lần, như thế thanh time bar vẫn max, time vẫn vô cùng





    2. thay đổi bản chất biểu thức tính toán :
    + tham số, biểu thức ở đây hơi loằng ngoằng nên việc thay đổi chắc hơi nan giải tí
    + đổi phép toán hôm trước tớ có demo đổi thử giá trị biểu thức, chả hiểu sao thanh time bar nó dài dãi dài dài ra, để mai tớ lên tớ xem còn đoạn đó ko up lên

  9. #19
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    ơ mà set đóng băng thời gian tớ có demo ở bên chap4 rồi mà

  10. #20
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi Con Nít
    tớ có đọc rồi [IMG]images/smilies/biggrin.png[/IMG] ý tớ là demo theo nhiều kiểu đó [IMG]images/smilies/biggrin.png[/IMG] theo cả cácb giangho nói đó [IMG]images/smilies/smile.png[/IMG] (làm phiền cậu rồi :P)

    P/s : ASM có phải hiểu sâu mới đọc được code để có thể hiểu được cụ thể chương trình xử lý biến đó ở đâu và xử lý như thế nào không ? vì như vậy mới có thể tự chỉnh sửa được theo ý mình :">
    trong các cách inv time thì cách tớ đưa ra là nhẹ nhàng và ổn rồi mà, còn giangho chỉ đưa ra ý tưởng thôi chứ đâu đã thành cách được?

    p/s : pikachu là 1 game nhỏ thôi nhưng mà tớ nghĩ là để đọc và hiểu hết code của nó thì khá là mệt, theo tớ ta chỉ cần chú trọng vào cái ta cần, có kĩ năng tìm cái ta muốn thôi chứ......... (ý kiến cá nhân[IMG]images/smilies/tongue.png[/IMG][IMG]images/smilies/tongue.png[/IMG][IMG]images/smilies/tongue.png[/IMG])

 

 
Trang 2 của 18 Đầu tiênĐầu tiên 123412 ... CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •