ÈÈѪ´«Ææ¿Í»§¶Ë¹Ø¼üCALL¶¨Î»ÊµÂ¼£º·¢°ü»ØËÝ»ùÖ·Æ«ÒÆÑ°Â·¹¥»÷³ÔÒ©È«²ð½â

À´Ô´£º ×÷Õߣº µã»÷£º
ÈÈѪ´«Ææ£¨Mir2Client.exe£¬´°¿ÚÀà TFrmMain£¬±êÌâ legend of mir2£©Àï˵µÄ“¹Ø¼üCALL”£¬Ö¸¿Í»§¶ËÄÚ²¿´¥·¢¾ßÌ幦Äܺ¯ÊýµØÖ·£º×ß·¡¢Åܲ½¡¢ÆÕͨ¹¥»÷¡¢Êͷż¼ÄÜ¡¢Ñ¡¹Ö¡¢³ÔÒ©¡¢Ê°È¡¡¢»»×°¡¢º°»°¡¢Ñ°Â·¡¢·¢°ü¡£ÕÒCALL±¾ÖÊÊÇÔÚÓÎÏ·½ø³ÌÁì¿ÕÄÚ£¬´ÓÊý¾Ý±ä»¯»òÍøÂç·¢°ü·´Ïò»ØËݵ½¹¦Äܺ¯Êý£¬ÔÙËã³ö“Ä£¿é»ùÖ· + RVAÆ«ÒÆ”£¬ÓÃÔ¶³ÌÏß³Ì/DLL×¢Èëµ÷Óá£

Ò»¡¢Ïȸ㶮»ùÖ·ÓëÆ«ÒÆ¹ØÏµ
ÿ´ÎÆô¶¯¿Í»§¶ËÒòASLR»ò°æ±¾²»Í¬£¬º¯ÊýÄÚ´æµØÖ·»á±ä£¬µ«“Ö÷Ä£¿é»ùÖ· + Ïà¶ÔÆ«ÒÆRVA”²»±ä¡£ÊµÕ½È¡µØÖ·£º

uintptr_t base = (uintptr_t)GetModuleHandle(L"Mir2Client.exe");
void* pFunc = (void*)(base + 0x301620); // Àý£ºRVA 0x301620

ÀÏ°æ´«ÆæÖ÷Ä£¿é»ùÖ·³£¹Ì¶¨ÔÚ 0x400000£¬Ð°æÓà GetModuleHandle È¡ÕæÊµ»ùÖ·ÔÙÏà¼Ó¡£

¶þ¡¢±Ø±¸¹¤¾ßÁ´
x64dbg / OD£¨OllyDbg£©£ºÏ¶ϡ¢¿´µ÷ÓÃÕ»¡¢¸ú»ã±à
Cheat Engine£¨CE£©£ºÉ¨ÑªÁ¿¡¢×ø±ê¡¢×´Ì¬Öµ¡¢ÕÒ»ùÖ·
IDA Pro£º¾²Ì¬·´±àÒ룬¿´º¯ÊýÐòÑÔ/½áβ¡¢µ÷ÓÃÔ¼¶¨
Wireshark + Ìõ¼þ¶Ïµã£ºÅäºÏ send/WSASend ×¥Ã÷Îİü
×¢Èë¶Ë£ºCreateRemoteThread + LoadLibrary ×¢Èë DLL£¬»ò WriteProcessMemory µ÷²Î

Èý¡¢Í¨ÓÃÕÒCALLËÄÌõÖ÷Ïß
1. ·¢°ü»ØËÝ·¨£¨×î³£Óã©
ÔÚ ws2_32.send / send / WSASend Ï bp ¶Ïµã → »ØÓÎÏ·×ö¶¯×÷£¨¿³¹Ö¡¢³ÔÒ©¡¢Ëµ»°¡¢µãµØÍ¼Ñ°Â·£©→ ¶ÏϺó Alt+K ¿´µ÷ÓöÑÕ» → ´Ó send ÏòÉÏ Ctrl+F9 / F8 Öð²ã·µ»Ø → µÚ3~6²ã³öÏÖµÄ call µØÖ·¼´¹¦ÄÜCALL¡£´«ÆæÀද×÷Á´£ºÊó±êµã»÷ → Ñ¡¹ÖCALL → ×ß·CALL → ¹¥»÷CALL → ×é°ü → send¡£
Àý£ºÊͷż¼Äܶϵ㷵»Ø²ã£º

mov edx, esi ; ¹ÖÎïID
mov ecx, esi ; ½ÇÉ«¶ÔÏó(thiscall)
mov r8w, bx ; ¼¼ÄÜID
mov r9b, dil ; ¼¼Äܵȼ¶
call 0x7FF7F9B75260 ; ¼¼ÄÜCALL

2. Êý¾ÝдÈë¶Ïµã·¨
CEËѽÇɫ׸±ê(X,Y)¡¢ÑªÁ¿¡¢Ñ°Â·×´Ì¬£¨¾²Ö¹0/ÒÆ¶¯1/Õ½¶·2£©→ ÕÒµ½Îȶ¨µØÖ· → x64dbg¶Ô¸ÃµØÖ·ÏÂÓ²¼þдÈë¶Ïµã → ´¥·¢Òƶ¯/Ѱ· → ¶ÏµãÃüÖд¦ÏòÉÏ»ØËÝ → ¶¨Î»×ß·CALL / Ѱ·CALL¡£Ñ°Â·CALL²ÎÊý³£¼û£ºecx=½ÇÉ«¶ÔÏóÖ¸Õë¡¢edx/xmm=Ä¿±êX/Y¡¢±ê־λ=Ѱ·ģʽ£¬µ÷ÓÃÔ¼¶¨ __thiscall¡£
3. ¶ÔÏó½á¹¹×·×Ù·¨
Ñ¡ÖйÖÎï → CEËÑδ֪³õʼֵ → »»¹ÖËѱ䶯ֵ → Ëø¶¨¹ÖÎï¶ÔÏó»ùÖ· → Ï·ÃÎʶϵã → ¹¥»÷ʱ¶ÏÏ → »ØËݵ½¹¥»÷CALL¡£¼¼ÄÜID¡¢Ä¿±êID¡¢¹ÖÎï×ø±ê¶¼´Ó¶ÔÏó½á¹¹ÀïÈ¡¡£
4. ×Ö·û´®/ÏûÏ¢´°¿Ú·¨
OD¼ÓÔØ¿Í»§¶Ë½øÁì¿Õ → Ctrl+N ÕÒ Send / WSASend / OnLButtonDown / DefMainWndProc → ´Ó CGameProcess::OnLButtonDown ¿ªÊ¼¸úÊó±êµã»÷Âß¼­£¬´«ÆæÔ´ÂëÀïµã»÷µØÃæ→¼ÆËã×ø±ê→Ѱ·→×é°üÈ«ÔÚÕâÌõÁ´ÉÏ¡£

ËÄ¡¢ÈÈѪ´«ÆæµäÐ͹ؼüCALLÇåµ¥£¨²ÎÊýÌØÕ÷£©
• ×ß·/Åܲ½CALL£º8·½Ïò£¬²ÎÊýº¬Ä¿±êX¡¢Y¡¢·½Ïò¡¢Åܲ½±êÖ¾£»×ß·ÓëÅܲ½ÊÇͬһCALL²»Í¬²ÎÊý¡£

• ÆÕͨ¹¥»÷CALL£ºµÈͬ¼¼ÄÜID=0£¨F1£©£¬²ÎÊý ¹ÖÎïID/¶ÔÏó¡¢¼¼ÄÜID¡¢µÈ¼¶¡£

- Êͷż¼ÄÜCALL£º¼¼ÄÜID£¨ÁÒ»ð0x..¡¢±ùÅØÏø..£©¡¢Ä¿±êID¡¢ecx=½ÇÉ«¶ÔÏó¡£
• Ñ¡¹ÖCALL£ºÊó±êµã»÷ÃüÖкóÏÈÑ¡¹ÖÔÙ×ß·ÔÙ¹¥»÷£¬µÚÒ»²ã·µ»Ø¶àΪѡ¹ÖCALL¡£

• ³ÔÒ©CALL£ºÒ©Æ·±³°üË÷Òý¡¢ÀàÐÍ£¨ºì/À¶/Ì«ÑôË®£©¡¢ÊýÁ¿£»×¢ÒâÁ÷³ÌÊÇ“¹¦ÄÜCALL→·¢°ü→·þÎñÆ÷»Ø°ü→¿ÛѪ/¼ÓѪ”£¬Ö±½Ó׷ѪÁ¿µØÖ·Ö»ÄÜÕÒµ½±íÏֲ㣬²»ÊdzÔÒ©CALL±¾Éí¡£

- ʰȡCALL£ºµØÃæÎïÆ·¶ÔÏóÖ¸Õë/Ë÷Òý£»»ØËÝ send °üÀàÐÍ 0x0A ×óÓÒ£¨¼ñÎïÖ¸Á¡£
• »»×°CALL£º±³°üÎïÆ·»ùÖ· + ×°±¸²Ûλ£»ÏÈÕÒ“ÎïÆ·¸´ÖƵ½Êó±ê”CALL£¬ÔÙÕÒÕæÕý´©´÷CALL¡£

• º°»°CALL£ºÆµµÀºÅ¡¢×Ö·û´®Ö¸Õë¡¢³¤¶È£»·¢°üÀàÐÍ 0x1F¡£

- Ѱ·CALL£ºÄ¿±êX/Y¡¢Ñ°Â·Ä£Ê½¡¢½ÇÉ«¶ÔÏóecx£»×´Ì¬Î» 1 ʱÉúЧ¡£
• Ã÷ÎÄ·¢°üCALL£º»º³åÇøÖ¸Õë¡¢³¤¶È¡¢¼ÓÃܱêÖ¾£»ÔÚ send ÉÏ·½Ìù½üĩβ϶Ï×îÎÈ£¬±Ü¿ª·´µ÷ÊÔ¼ì²â¡£

Îå¡¢µ÷ÓÃÔ¼¶¨Óë²ÎÊýÅж¨
- __cdecl£º²ÎÊýÓÒ→×óѹջ£¬µ÷ÓÃÕ߯½Õ»£¨add esp, x£©
• __stdcall£º±»µ÷ÓÃÕ߯½Õ»£¨retn 0Ch£©

• __thiscall£ºecx=this£¨½ÇÉ«/¶ÔÏóÖ¸Õ룩£¬Ê£ÓàÓÒ→×óѹջ

- __fastcall£ºecx+edx ǰÁ©²ÎÊý£¬ÆäÓàѹջ
½ø CALL ÄÚ²¿¿´ ret n / add esp,n Ëã²ÎÊý¸öÊý£¬ÁÙʱ±äÁ¿¿´ [ebp-xx]£¬´«Èë²ÎÊý¿´ [esp+xx]£¨×¢Òâ CALL ±¾Éíѹ·µ»ØµØÖ·Õ¼4×Ö½Ú£©¡£

Áù¡¢¾­µä»ùÖ·ÏßË÷£¨Àϰæ1.76¿Í»§¶Ë²Î¿¼£©
Ö÷½ÇÉ«¶ÔÏóÖ¸Õ룺[[0x59C7CC]+0x4C] = HP£¬+0x50 = MaxHP£¬+0x54 = MP£¬+0x58 = MaxMP£¬+0xD8 = X×ø±ê£¬+0xDC = Y×ø±ê£»µØÍ¼ÃûÖ¸Õ룺[0x59C7CC+0x10] → ×Ö·û´®µØÖ·¡£
×¢Ò⣺²»Í¬²¹¶¡/ÖÜÄê°æÆ«ÒÆ»á±ä£¬±ØÐë±¾»ú֨ɍ£¬²»ÄÜÖ±½Ó³­ÀϽ̵̳ØÖ·¡£

Æß¡¢¶¨Î»ÍêÕû²½Ö裨ÒÔ“×ß·CALL”ΪÀý£©
1. CE Ëѵ±Ç°X×ø±ê→Î¢ÒÆ→Ëѱ䶯→Ëø¶¨×ø±êµØÖ· A
2. x64dbg ¸½¼Ó Mir2Client.exe£¬¶Ô A ÏÂÓ²¼þдÈë¶Ïµã
3. ÓÎÏ·ÀïµãµØÃæÒƶ¯ → ¶ÏÏ → ¿´µ÷ÓÃÕ»·µ»Øµ½ÓÎÏ·Áì¿Õº¯Êý FuncA
4. FuncA Í·²¿¼ÇÏ RVA = FuncA - Ä£¿é»ùÖ·
5. ·ÖÎö FuncA ²ÎÊý£ºecx£¨½ÇÉ«¶ÔÏ󣩡¢push Ä¿±êX¡¢push Ä¿±êY¡¢push ·½Ïò
6. DLL×¢Èë²âÊÔ£º¹¹Ôì ecx + ²ÎÊý → call(base+RVA) → ½ÇÉ«ÒÆ¶¯¼´ÃüÖÐ

°Ë¡¢³£¼û¿Óµã
• Ï̷߳¢°ü£º²»Ö±½Ó×ß send£¬ÁíÆðÏß³Ì×é°ü£¬ÐèÏÈ×·Ïß³ÌÊý¾ÝÀ´Ô´ÔÙ»ØËݹ¦ÄÜCALL¡£

- °üÌå¼ÓÃÜ£ºÒì»ò/RC4/²é±í£¬Wireshark×¥µ½ÂÒÂ룬ÐèÔÚ send ǰÕÒ¼ÓÃܺ¯ÊýÄ£Äâ×é°ü¡£
• Èí¼þ¶Ïµã±»¼ì²â£º»»Ó²¼þ¶Ïµã£¨DR0~DR3£©¡¢Ìõ¼þ¶Ïµã¡¢Òþ²Øµ÷ÊÔÆ÷²å¼þ¡£

• ״ֵ̬ÎóÅУº×·ÑªÁ¿ÕÒµ½µÄÊDZíÏÖº¯Êý²»ÊdzÔÒ©CALL£¬±ØÐëÑØ“¹¦ÄÜ→·¢°ü→»Ø°ü→¸ÄÖµ”ÕýÏòÁ´ÕÒ¡£

- Æ«ÒÆÊ§Ð§£º¿Í»§¶Ë¸üС¢²¹¶¡ÖØ´ò°ü¡¢ASLR¿ªÆô£¬±ØÐëÖØËã RVA¡£

¾Å¡¢µ÷ÓÃÑéÖ¤×îС´úÂë¿ò¼Ü

DWORD base = (DWORD)GetModuleHandle(L"Mir2Client.exe");
DWORD walkCall = base + 0xABCDEF; // RVA
__asm {
mov ecx, roleObj // ½ÇÉ«¶ÔÏóÖ¸Õë
push dir // ·½Ïò
push y // Ä¿±êY
push x // Ä¿±êX
call walkCall
add esp, 0xC
}

½ÇÉ«ÒÆ¶¯¼´CALLÕýÈ·£»±Àµ÷ÓÃÔ¼¶¨»òecx´íλ¡£

ÕÒÈ«CALLºó£¬×ß·+Ñ¡¹Ö+¹¥»÷+ʰȡ+³ÔÒ©+Ѱ·×éºÏ£¬¾ÍÊÇÍêÕû×Ô¶¯´ò¹Ö±Õ»·£¬Ê£ÏÂÖ»ÊǼÆÊ±Æ÷ÓëÅжÏÂß¼­¡£