ããããŒã°
Tãã©ãŒã©ã ã®å人ã®1人ããå°æ¬ãããxkorã®èè
ãšããŠãäžæ£è¡çºã®äžçå
šäœã«ç¥ãããŠããl2phxããã°ã©ã ãæžãæããããšãææ¡ãããšããããã¯ãã¹ãŠ1幎åã«å§ãŸããŸããã
L2phxèªäœïŒl2ãã±ããããã¯ããã±ãããã¹ã©ã ïŒã¯ã系統2ã¯ã©ã€ã¢ã³ãïŒä»ã®mmorpgã®ããŒãžã§ã³ããããŸãïŒã®çä¿¡ããã³çºä¿¡ãã±ããïŒãã¹ãŠãLSPã§å®è£
ãããŠããïŒã®ã¹ããã¡ãŒã§ãããåã
ã®ãã±ãããéä¿¡/眮æããæ©èœãåããŠããŸãã Xkorã¯æ¬¡ã®ããã«è©Šã¿ãŸããïŒæå·åãã€ãã¹ã¡ãœããã®å®è£
ãçŸããGUIãªã©ã ããããfrisheksã®æªæã®ãã管çè
ã¯ãã®ãããªã¢ããªã±ãŒã·ã§ã³ã奜ãŸãªãã£ããããã¯æ¬¡ã®1æ¥ã®ã€ãã³ãã®éå§æã«åœŒãã®åå
¥ãèããæ®ºããã ã¯ããã¯ããåå以å€ã®äººãã©ã®ãµãŒããŒã«ãã¢ã¯ã»ã¹ããŠããã®ããŒã«ã§å®å
šãªä¹±äº€ãæé
ããããšãã§ããŸããã åæã«ãããããçš®é¡ã®åçšä¿è·ãããããã±ããã®äœ¿çšã
æ£åžžã«ãããã¯
ã§ããŸããã§ãããããããã®äžã§æãå·§åŠãªãã©ãã£ãã¯ã¯ããã«æå·åãããŠããŸãã ãã®ãããªä¿è·ã®1ã€ã¯ãSãä¿è·ã«å¯Ÿå¿ããŠããŸãã仿¥ãSä¿è·ã¯ãã¹ãŠã®ããããªããŒãž2ãµãŒããŒã«ãããŸãããšããã§ãxkorã¯ãã®ãããªçµæãæäŸãããã±ãã埩å·åã¢ãžã¥ãŒã«ïŒnewxor.dllïŒãç¬èªã«äœæããæ©èœãå®è£
ããŸããã ã¯ãããããæžããã ãã§ã¯åççã§ã¯ãããŸããã§ããïŒæ°ãããµãŒããŒ==æ°ããnewxorã åå¿è
ã¯ã¯ã©ã€ã¢ã³ãã®ã¡ã¢ãªïŒHxDãããŒããšã³ãžã³ãªã©ïŒã倿ŽããŠãã±ãããéä¿¡ã§ããªãã£ããããl2ã§ã®äžæ£è¡çºã¯æ¬¡ç¬¬ã«æ»ã«å§ããŸããã
ãããããç§ã¯ãã®ãã³ãã£ãŒãããŸãçå£ã«åãæ¢ããŸããã§ããïŒç§ã¯ã¯ã©ã€ã¢ã³ã->ãµãŒããŒãã±ãããã£ããã£ã¢ãžã¥ãŒã«ãæžãããããæŸæ£ããŸããã ãªãã§ïŒ ãªããªãã ããããã»ãã®3æ¥åãç§ã¯ãã®ãããžã§ã¯ãã®äœæ¥ãåéãããã®èšäºãå
¬éããããšã«ããŸããã ãªãã§ïŒ çŸåšãl2è©æ¬ºåž«ã³ãã¥ããã£ã¯æ»ãã§ããŸãã ãã¹ãŠã®ãã°ãšæŽæ¿¯æ©ã¯ãSkypeãšãã©ãŒã©ã Tã§äºãã«éä¿¡ãã10äººã®æã«ãããŸãããããŠãç§ãå»ãããšã«ããŸããã ãããŠãããªããå»ããªããããã¯çŸããã ãã§ãïŒïŒ2幎åãç§ã¯ã¯ãŒãã³ã°ããã°ã倢èŠãŸãããã仿¥ã¯ãããå¿
èŠãšããŸããã
å
責äºé
9æã¯ãã®å¹Žéœ¢ãèæ
®ããŠéåžžã«ããã«çãäžãããŸããã€ãŸãã9æ1æ¥ã«ã¢ã¹ã¯ã¯ã®åŠæ ¡ã®1ã€ã§æšå¹Žã«äŒããŸãã åŠæ ¡ã®æåŠã®ãªã¹ãã¯éãããã詊éšã®æºåãããæ¬ã¯ã¯ããŒãŒããã®äžã«æ£ãã°ã£ãŠããŸãã æéããããŸããã ã³ãŒãã®äžéšã¯æ¥ãã§æããããŸããããã¯ãéåžžã«æ¥œãããã¥ãŒã¹ãäœæ¥ã®å®äºåŸã«åããŠæããã«ãªã£ãããã§ãããããã«ã€ããŠã¯åŸã§è©³ãã説æããŸãã ãŸããèšäºã¯æåŠèšèªã§æžãããŠããŸããã ããããããã¯ããã§ãã
ãã±ãã代è¡åä¿¡ãµãŒããŒ->ã¯ã©ã€ã¢ã³ã
ã¯ã©ã€ã¢ã³ãããµãŒããŒããåä¿¡ãããã¹ãŠã®ãã±ããã¯ããšã¯ã¹ããŒãããã
UNetworkHandler::AddNetworkQueue
å
ã§åŒã³åºãããšã§æçµçã«ãã£ããã§ããŸãã

ããã¯ã©ãããŒã§ããããã®å
éšã«ã¯å
ã®é¢æ°ãžã®ãžã£ã³ãããããŸãã

ããã§ãSã®ããªãããŒãªé²åŸ¡ãããµãŒããŒäžã§ããã«æå·åããããã±ãããè§£èªããããšã¯æããã§ãã åãã³ãŒããã¡ã¢ãªå
ã§ã©ã®ããã«èŠããããèŠããšã次ã®ããšãããããŸãã

æ§ããã«èšã£ãŠãããã¯ç¹å®ã®ãã³ãã©ãŒã®è¿ãã§æãäžè¬çãªjmpã§ãã ãã³ãã©ãŒèªäœã¯è峿·±ããã®ã§ã¯ãªããããèªäœã§æ©èœããããã«ããŸãã ãã®ããã¯ã®åŸã«ããã¯ã眮ãããã±ããã埩å·åããã圢åŒã§ååŸããŸãã ãã®åŸãæåã®åé¡ãçºçããŸããã ç§åŠçãªçªãã®æ¹æ³ã«ããã
VirtualProtect
ã
VirtualAlloc
ãªã©ã®æ©èœããšã©ãŒã§åäœãããããããªããšãã¬ã€ãä¿è·ãããã¡ã¢ãªã«å
¥ãããšãã§ããªãããšãæããã«ãªããŸããã ãªããããèµ·ãã£ãŠããã®ã§ããïŒ ç§ã¯æ±ºããŠèŠã€ããŸããã§ãããæéããããŸããã§ããã ããããSä¿è·ã¯
NtProtectVirtualMemory
ãã€ã³ã¿ãŒã»ããããããã§äœããè¡ããšèšããŸãã ããããç§ã¯é²åŸ¡ã欺ãããã«cãªèšç»ãç«ãŠå§ããŸããããç§ã®æ inessãåªå¢ã§ãããç§ã¯ãããæãã«ããŸããïŒ
HANDLE hMain = OpenProcess(PROCESS_VM_OPERATION, FALSE, GetCurrentProcessId()); VirtualProtectEx(hMain, ... );
ãã¡ãããããã»ã¹å
ã«ããããšãèãããšãçŸãããããŸããïŒèšåããã®ãå¿ããŠããŸããããdllãèšè¿°ããŠããŸãïŒã ããããããã¯åäœããŸãã ããã¯ã«æ»ããšã2çªç®ã®åé¡ãçºçããŸããä¿è·ã¯ããã®é¢æ°ã®æåã®10ã20ãã€ãããã§ãã¯ããŸãã ããã«å€æããåªãããå Žæã«çªãåºãŠãããããããŸããã ã©ããã ããã§ããããã¯ãã€ããŠãã ããã ãªãã»ãã0x14ãéžæããŸããïŒäžã®å³ãåç
§ïŒã jmp nearã¯5ãã€ãããããŸããããããæžãæããŸã
add esi, 0x3c push 0x1
ã«
jmp ...
ãããå¿ããªãã§ãã ããããããããã³ãã©ã®æåŸã«ãããã埩å
ããå¿
èŠããããŸãã ãšããã§ã ããã¯ã¯ãã€ã³ããŒããã
EnterCriticalSection
å
ãŸãã¯ä»ã®å Žæã«é
眮ã§ããŸãã ããã«é²ã¿ãŸãã 2010幎ã«
AddNetworkQueue
颿°ã«æž¡ãããããã±ãŒãžã®æ§é ã¯ãå°æ¬ãããGoldFinchã«ãã£ãŠå
¬éãããŸããã
struct NetworkPacket { unsigned char id, _padding1, exid, _padding2; unsigned short size, _padding3; unsigned char* data; }
id
ãš
data
ãã£ãŒã«ãã«èå³ããããŸãã
ecx
å
容ãšåæ§ã«ã ãªã
ecx
ãïŒ ç°¡åã§ãïŒ
__thiscall
ãæ±ã£ãŠããã
UNetworkHandler
ã¯ã©ã¹ã®é¢æ°ãåŒã³åºãã«ã¯ããªããžã§ã¯ããžã®ãã€ã³ã¿ãŒãå¿
èŠã§ãã
ecx
ã§éä¿¡ãããŸãã ãªãã§é»è©±ããå¿
èŠãããã®ïŒ ããã«ãããªãã¯ãã¹ãŠãçè§£ããŸãããä»ã®ãšãã宿ããã³ãŒããæäŸããŸãïŒ
BYTE *AddNetworkQueue = (BYTE *)GetProcAddress(hEngine, "?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPacket@@@Z"); AddNetworkQueue += *(DWORD *)(AddNetworkQueue + 1) + 5; retAddr_AddNetworkQueue = (DWORD)AddNetworkQueue + 0x19; trmpAddr = (DWORD)wrapper_AddNetworkQueue - ((DWORD)AddNetworkQueue + 0x14 + 5); VirtualProtectEx(hMain, AddNetworkQueue + 0x14, 1, PAGE_EXECUTE_READWRITE, &tmpProtect); *(AddNetworkQueue + 0x14) = 0xE9; *(DWORD *)(AddNetworkQueue + +0x14 + 1) = trmpAddr; VirtualProtectEx(hMain, AddNetworkQueue + 0x14, 1, PAGE_EXECUTE, &tmpProtect); while (!unh) Sleep(100);
æºåãã§ããŠããªã人ã¯ããã®ç¬éã«æ»ã«ãããšæãã§ãããã å®éããã¹ãŠãã·ã³ãã«ã§ãã
AddNetworkQueue += *(DWORD *)(AddNetworkQueue + 1) + 5;
jmpã䜿çšããã©ãããŒããå®éã®AddNetworkQueue颿°ã«ç§»åããã ãã§ãã
unh
ãšã¯ïŒ ããã¯ããã³ãã©ãŒã§å€æ°ã«æŒã蟌ãã ãã®ãšåã
ecx
å€ã§ãã
void __declspec(naked) wrapper_AddNetworkQueue() { __asm { pushad pushfd sub [unh], 0 jnz L1 mov [unh], ecx L1: lea eax, [esp + 44]
ããã§ãnaked
wrapper_AddNetworkQueue
颿°ã¯ãã¹ãŠã®ã¬ãžã¹ã¿ã®å€ã
unh
å€
unh
ååŸããŠããã³ãã©ãŒãåŒã³åºããŸãã ãã®äžã§ãã¹ã¿ãã¯ãæããããšãªãããã±ãŒãžã䟿å©ã«åŠçããå¶åŸ¡ãã©ãããŒã«æ»ããŸãã 圌ã¯ãè©°ãŸã£ãæç€ºã埩å
ããå
ã®ã³ãŒããå£ããå Žæã«ãžã£ã³ãããŸãã Noosã1ã€å°ãªãåé¡ã
ã¯ã©ã€ã¢ã³ãâãµãŒããŒãã±ãããã£ããã£
æ£çŽãªãšããããããã¯æãããããããã±ãŒãžã§ãã ãã¹ãŠã®ãã¥ãŒãã®70ïŒ
ãããŒã¹ã«ãªã£ãŠããã®ã¯ãããã§ãã äžè¬ã«
SendPacket
ãšåŒã°ããéãšã¯ã¹ããŒã颿°ã¯ããããã®ãã±ããã®éä¿¡ãæ
åœããŸãã
UNetworkHandler::SendPacket(char* msk, ...)
ãã®é¢æ°ã«ã¯ãæåã®åŒæ°ïŒãã¹ã¯ïŒã«åºã¥ããŠã¹ã¿ãã¯ããååŸããå¯å€æ°ã®ãã©ã¡ãŒã¿ãŒããããŸãã ãã®CDEã®äœæã茞åºããã女æ§ã®äœæãååŸããæ¹æ³ã¯ïŒ ããã¯ç°¡åã§ãããããã©ã®ããã«åŒã°ããããèŠãŠãã ããã ãã®èšäºã¯api lineage 2ã®ãã¥ãŒããªã¢ã«ã§ã¯ãªããšäž»åŒµããŠãããããå
·äœçãªåŒã³åºãäŸã瀺ããŸãã

ããã§ãã¬ãžã¹ã¿å€ãå¿
èŠãªçç±ãæç¢ºã«ãªããŸãã
ecx
ïŒ
SendPacket = (BYTE *)*(DWORD *)(**(DWORD **)(unh + 0x48) + 0x68); SendPacket += *(DWORD *)(SendPacket + 1) + 5;
SendPacketã¯ã©ãããŒã§ãããããã®äžã«ã¯main颿°ã®éåžžã®jmpããããŸãã ãã®å§ãŸãã¯æ¬¡ã®ããã«ãªããŸãã

ãããŠã次ã®ããã«ã
AddNetworkQueue
ãšã®é¡æšã«ããã¡ã¢ãªå
ã§ïŒ

ç¹°ãè¿ããŸãããç¹å®ã®ãã³ãã©ãŒãžã®å¹³å¡ãªãžã£ã³ãã§ããããã®å Žåã¯ç¡èŠã§ããŸãã-ãã±ããã®æå·åãå®è¡ããŸãã ã©ããã ãžã£ã³ãã§äžæžãããããšãããšããã£ãã§ã³ã¹SãèªããŸãã ãããŠãããªãããã®ãžã£ã³ãã«æ²¿ã£ãŠè¡ãã°ïŒ

圌女ãããäžåãžã£ã³ãã ç§ã¯ãããå°ç¡ãã«ããŸãïŒãããã®ãã¡ããã«5ã€ããããŸãïŒjmpã®ä»£æ¿/è¿ãã®åŒã³åºãïŒã é£èªåãæ±ã£ãŠããŸããã¯ãŒã«ã§ãã å¶åŸ¡ãããŒã埩å
ããã®ãé¢åã ãšãããã©ãã§ããããïŒ
å顿³
ãããã®5ã€ã®jmpã®1ã€ãèªåã®è¿ãã«æžãçŽããŠã¿ãŸãããïŒ æåã¯ããã ãã§ããããããã¯èŽåœçãªééãã§ããã 倿ããããã«ãSãããã¯ã·ã§ã³ã¯ãããã®å Žæã®ã³ãŒãã®æŽåæ§ããã§ãã¯ããå
ã®ã³ãŒããšäžèŽããªãå Žåã¯èªããŸãã ãããïŒ ããã§ã¯ãããŸãããã«ãŒã«ïŒ 15ååŸã«ã®ã¿ã ãã¡ãããéçºæ®µéã§ã¯ããã®ãããªæéã®ããã©ãŒãã³ã¹ããã¹ãããäœè£ã¯ãããŸããã§ããã ãããžã§ã¯ãå
šäœã®äœæ¥ã®çµããã«ãç§ã¯ããããé©ããèŠããŸããã ããããç§ã¯ããããŸãããã... 2çªç®ã®èŽåœçãªãã¹ãç¯ããŸããã å¥åé£èªåã³ãŒãã®äžã«ã€ã³ã©ã€ã³ãããææ³ã詊ããŠã¿ããšãããèªå·±ã¯ãªã¢ããã¯ïŒæ®å¿µãªãããgitã«é¢ãã質åã«å¯Ÿãããã®ãªãã·ã§ã³ã®ãœãŒã¹ã³ãŒãã¯ãããŸããïŒã ä»çµã¿ïŒã¬ããŒãžåœä»€ãæ¢ãããã³ãã©ãŒã®è¿ãã§jmpã§äžæžãããŸãã ãã®äžã§ãããã«å
ã®ãã€ãã埩å
ãïŒjmpã眮ãããã¡ã¢ãªã«æžã蟌ã¿ããã³ãã©ãŒå
ã®è©°ãŸã£ããã€ããå®è¡ããã ãã§ã¯ãããŸããïŒãããªãã¯ãè¡ããå¶åŸ¡ãå
ã®é¢æ°ã«æ»ããŸãã ãããããã®ãªãã·ã§ã³ã¯äžåºŠã ãæ©èœããŸããïŒ ã€ãŸããããã¯ãå床èšå®ãããŸã§ã§ãã ä¿è·Sã¯é¢æ°ã®æåã®ãã€ãã®ã¿ããã§ãã¯ããæåŸã«ããã¯ã眮ããŠãåèªãèšã£ãŠããªãããšãæãåºããŠãã ããã
SendPacket
ã®æåŸã«2çªç®ã®ããã¯ãé
眮ããŸããããã¯ãé£èªåãããã³ãŒãã®ã¬ããŒãžåœä»€ã®ã¢ãã¬ã¹ã®ãšã³ããªã®è¿ãã§jmpãçæããæãäžè¬çãªããã¯ã§ãã ç§ã®èšèã§ã¯ããããçè§£ããããšã¯éåžžã«ç°¡åã§ã¯ãããŸããããã¹ããŒã ã¯æ¬¡ã®ãšããã§ãã
- ä¿è·ãã³ãã©ãŒSã®ã¬ããŒãžåœä»€ã®ä»£ããã«ããã¯ãèšå®ããŸããæåŸã«ããããã®ã¬ããŒãžåœä»€ãã¡ã¢ãªã«åŸ©å
ããŠãžã£ã³ãããŸãã ãã®ããã«ããŠãããã¯ãæ¶å»ããŸãã
- ä¿è·ãã³ãã©ãŒSã¯ãå¶åŸ¡ãåŠçããŠå
ã®
SendPacket
颿°ã«SendPacket
ãŸãã - æåŸã«2çªç®ã®ããã¯ãé
眮ããæåã®ããã¯ãåã€ã³ã¹ããŒã«ããŸãã
ãªããã®å°ããªã¹ããŒã ãèŽåœçãªãã¹ãšåŒã¶ã®ã§ããïŒ å®éããã®ã¢ãããŒãã¯ãä¿è·ãçŸåšã®ã¹ã¬ããããã®ã³ãŒãã®æŽåæ§ããã§ãã¯ããå Žåã«ã®ã¿æ©èœãããšããããšã§ãã 2çªç®ã®ã¹ã¬ããã®éãããããæåã®ã¹ã¬ããã®ãã€ãæ°ããã§ãã¯ããŠããå Žåããã®ããªãã¯ã¯æ©èœããŸããã ãããŠããã¯èµ·ãã£ããç§ã¯ã¡ããã©æéããããã ã©ããã ã¡ã¢ãªå
ã®ãã€ãã倿Žããããšã¯ã§ããŸããïŒ çãæ¹ã¯ïŒ
çªãåºãïŒããã¯æ¹åŒ
å®éããã®ç¶æ³ã§ã¯ãããã¯ãã€ã³ã¹ããŒã«ããããã®ãªãã·ã§ã³ãããã€ããããŸãã ãã®ãã¡ã®1ã€ãéžæããŸãããã¡ã¢ãªããŒãžã®æš©éã倿Žããããšã«ããããã¯ã§ãã ã¯ããããã¯æè¯ã®éžæè¢ã§ã¯ãããŸããããç· ãåãã¯çããŠããŸããïŒãã®èšäºãæžãããçŽåã«æåŸã«è¡ãããããšãæãåºããŸãïŒã ããã§ã¯ãBroken Swordã®ãä¿è·ãããã¢ãŒãã®Intelããã»ããµãã®ãã°ãããã·ãªãŒãºã®èšäºãåç
§ãã䟡å€ããããŸãã èªãã§ãæ ããªãã§ãã ããã ãŸããMatt Pietrekã«ããäžé£ã®èšäºãžã®åç
§ãšããŠããaãWin32 SEHã®å
éšããã®åŒçšããããŸãã ã°ãŒã°ã«ã¯ãšãŠãç°¡åã§ãã ããŠãç§ã¯ããªãããã¹ãŠã®å¡©ãäœã§ããããçè§£ããããšãæã¿ãŸãã
SendPacket
ããã·ãŒãžã£
SendPacket
ããŠããããŒãžã®å±æ§ã倿ŽããŸãïŒå®éãSä¿è·ãã³ãã©ãŒãé
眮ãããŠããã¡ã¢ãªããŒãžã®å±æ§ã倿Žããããšã«ããŸããã詳现ã¯åŸã»ã©èª¬æããŸãïŒã è€éã«èãããŸãããå®éã«ã¯ã次ã®ã³ãŒããå®è¡ããå¿
èŠããããŸãã
VirtualProtectEx(hMain, SendPacket, 1, PAGE_EXECUTE | PAGE_GUARD, &tmpProtect);
ã¯ã©ã€ã¢ã³ãã
SendPacket
颿°ãåŒã³åºããåŸãäŸå€ãã¹ããŒãããŸããããã¯åŠçããå¿
èŠããããŸãã ç§ã¯æ¬åœã«tibã«ã€ããŠæžããããªãã®ã§ãç§ãã¡ã¯ãã¹ãŠãéåžžã«åçŽã«
è¡ãã審çŸçã«ã¯
ããŸãã ã
AddVectoredExceptionHandler(1, wrapper_SendPacket);
ã§ã¯ã
SendPacket
ãåŒã³åºããšã
wrapper_SendPacket
ãŸãã
long __stdcall wrapper_SendPacket(PEXCEPTION_POINTERS exInfo) { if (exInfo->ExceptionRecord->ExceptionCode == STATUS_GUARD_PAGE_VIOLATION) { VirtualProtectEx(hMain, SendPacket, 1, PAGE_EXECUTE, &tmpProtect); if (exInfo->ContextRecord->Eip == (DWORD)SendPacket) { handler_SendPacket((DWORD *)exInfo->ContextRecord->Esp + 3);
ãæ°ã¥ããããããŸãããã
wrapper_SendPacket
颿°ã¯
VirtualProtectEx
åŒã³åºããŸããããã«ãããããŒãžå±æ§ãæ£èŠåãããå¶åŸ¡ãè¿ãããŸãã ããããããŒãžå±æ§ãæ£èŠåããã«ã¯==ããã¯ãåé€ããŸãã ãé¡ã®æ¹æ³ãã§èª¬æããäžèšã®2çªç®ã®æ¹æ³ã䜿çšãã
SendPacket
颿°ã®çµãããã€ã³ã¿ãŒã»ããããŠå床èšå®ããŸãïŒé¢æ°ã«ã¯2ã€ã®ã¬ãããããããã2ã€ã®ããã¯ãèšå®ããŸãïŒã
trmpAddr = (DWORD)wrapper_SendPacketEnd - ((DWORD)SendPacket + 0xb5 + 5);
wrapper_SendPacketEnd
èªäœïŒ
void __declspec(naked) wrapper_SendPacketEnd() { __asm { pushad pushfd call [handler_SendPacketEnd] popfd popad add esp, 0x2000
PAGE_GUARD
屿§ãèšå®ããŠ
PAGE_GUARD
ã ãã§ã
PAGE_GUARD
ã®æåŸã§ã¯ãªãããããåŒã³åºã颿°ã«æ»ãã ãã§ãè€éãªããšã¯ãããŸããã
wrapper_SendPacket
ã«æ»ããŸãããã å¿ããªãã§ãã ããïŒ ãã§ãã¯ã«æ³šæããŠãã ãã
if (exInfo->ContextRecord->Eip == (DWORD)SendPacket)) { ... }
ãã以å€ã®å Žåã¯ãããŸããïŒ å¹žããªããšã«ãç§ãã¡ã®å Žåãæ®å¿µãªããããã§ãã
VirtualProtectEx
ãå®è¡ãããšãå°ãªããšãã¡ã¢ãªã®ããŒãžå
šäœã®å±æ§ã倿ŽãããŸãã ãããã®æå°4ãããã€ãã®ã³ãŒãã¯äœ¿çšã§ããŸããã ãŸããä»ã®æé ãååšããå ŽåããããŸãã ãããã®äŸå€ã¯ãSendPacketãåŒã³åºããããšãã«å¿
ãããã¹ããŒããããšã¯éããŸããã ããã¯ãã®ã¡ãœããã®äž»ãªæ¬ ç¹ã§ãïŒæåŸã«ããã¯ã埩å
ãããªãããã·ãŒãžã£ãåŒã³åºããšããã³ãã©ãŒã¯ããã¯ãåé€ããŸãïŒãã解決ãããŸãã ãããä¿®æ£ããããã®ããã€ãã®ãªãã·ã§ã³ããããŸãã æé«å質ã§ã¯ãªããæéã䜿çšããŸãã åŒæ°
PAGE_GUARD
ããŠ
VirtualProtectEx
ãæãã«çæããŸãã ãã®ç®çã®ããã«ïŒã¹ãã€ã©ãŒïŒããã ãã§ã¯ãããŸããïŒããšã¯ã¹ããŒãããã颿°
FPlayerSceneNode::Render(FRenderInterface *)
ãéžæãããŸãããããã¯ã«ãŒãå
ã®ã¡ã€ã³ã¹ã¬ããã«ãã£ãŠåŒã³åºãããŸã

é²åŸ¡Sã¯ãæåã«ãããååããŠãèªããŸããã
VirtualProtectEx
ãã€ã³ã¿ãŒã»ããããŠçæããŸãã ããã¯ãããã¯ãããªã¬ãŒãããããšã100ïŒ
ä¿èšŒããŸããïŒ ãã¡ããéããŸãã 95ïŒ
ã®ã¿ã ããã§ååã§ããã ç§ã¯æŸèæãç
©ãããã転ãããŸããã§ããã ããã¯ã¯
engine.dll
ã®ã¢ãã¬ã¹ã¹ããŒã¹ã§ã¯ãªããä¿è·ãã³ãã©ãŒSã®ã¢ãã¬ã¹ã«ã€ã³ã¹ããŒã«ããããšäžèšã§æžããŸããããªãã§ããïŒ åçã®ã»ãã®äžéšã§ã
if (exInfo->ContextRecord->Eip == (DWORD)SendPacket)) { ... }
ã¯ããã«ïŒçµéšçã«æ€èšŒæžã¿ïŒã
SendPacket
ã®æåŸã«ã€ã³ã¹ããŒã«ããããã¯ã«ããã±ããã®éä¿¡åŸã«100ïŒ
衚瀺ãããç¹å®ã®ã€ã³ãžã±ãŒã¿ãŒã©ã€ã³ã®åºåã远å ãããšã次ã®å³ã衚瀺ãããŸãã

é£ç¶ãã
#pck
è¡ã¯ãããã¯ãæ©èœããªãã£ãããšã瀺ããŠããŸãïŒåã5ïŒ
ïŒã äžèšã®ããèŠçŽããŸãã
- ã¡ã¢ãªããŒãžã®å±æ§ã倿ŽããäŸå€ãã³ãã©ãèšå®ããŸã
- ãã®äžã§ãå
ã®å±æ§ã埩å
ãã
SendPacket
ã®ã¢ãã¬ã¹ã§äŸå€ãçºçããå Žåãç¬èªã®ãã³ãã©ãŒãåŒã³åºãããšãã§ããŸã - æçµçã«ãå¶åŸ¡ã¯å
ã®
SendPacket
颿°ã«æ»ãããã®æåŸã«2çªç®ã®ããã¯ããããŸã - 次ã«ãã¡ã¢ãªããŒãžã®å±æ§ãåèšå®ãã
SendPacket
ãåŒã³åºããã³ãŒãã«å¶åŸ¡ãç§»ããŸãã - ãã®æç¹ã§ã
Render
ããã·ãŒãžã£ã§ã¯ãåãã¡ã¢ãªã¹ããŒã³ãžã®åã屿§ã®ã€ã³ã¹ããŒã«ãã¹ããŒã³ãããŸãã
ãµãŒããŒãžã®ãã±ããã®éä¿¡
æããããããããã±ãããã£ããã£ãäžå¿ãšããã¿ã³ããªã³ãšã®ãã³ã¹ã®åŸãã¯ã©ã€ã¢ã³ã->ãµãŒããŒã¯éåžžã«ã·ã³ãã«ã§ãã äžèšã§SendPacketã¢ãã¬ã¹ãååŸããæ¹æ³ãåŠã³ãŸãããããã§ããã®é¢æ°ã«åŒæ°ãæž¡ãäŸãã¹ãã€ããŸããã ã©ããã é»è©±ããŠã¿ãŠãã ããïŒ ãããŠããªãããããã
engine.dll
ã®ã¢ãã¬ã¹ç©ºéããã§ã¯ãªãåŒæ°ãã¹ãªããããããšããŠããŸã-é¡ã«å
¥ããŸãã
engine.dll
ã®ã¢ãã¬ã¹ç©ºéããã§ã¯ãªãããªã¿ãŒã³ã¢ãã¬ã¹ãã¹ãªããããããšããŠããŸããè³ã§ååŸããŸãã ã¡ã€ã³ã¹ããªãŒã ããã§ã¯ãªããdll`kiããçŽç·ã«é¢æ°ãåŒã³åºãããšããŠããŸã-èèãééããŸãã æçµçã«ãã¬ã·ãã¯æ¬¡ã®ãšããã§ãã
- ä¿è·ãããSã¯ããšã¯ã¹ããŒãããã
engine.dll
颿°ã®1 engine.dll
ããæ°ã«ããŸãããããã¯SendPacket
ãåŒã³åºãSendPacket
ïŒãããç¡é§ã§ãïŒïŒ - Protect Sã¯
SendPacket
ã«ã€ããŠengine.dll
ããŸããïŒæ»ãã¢ãã¬ã¹ã¯engine.dll
å
ã«ããå¿
èŠããããåŒã³åºãã¯ã¡ã€ã³ã¹ã¬ããããè¡ãããå¿
èŠããããŸã - Protect Sã¯ã
SendPacket
颿°ã®åŒæ°ãã©ã®ã¢ãã¬ã¹ç©ºéã«ããããæ°ã«ããŸãã
ãããŠãããã«æ²»çæ³ããããŸãïŒ
SendPacket
颿°ãåŒã³åºããšãã®åœã®è¿ä¿¡ã¢ãã¬ã¹- æž¡ãããåŒæ°ã®åœã®ã¢ãã¬ã¹ç©ºé
- ã¡ã€ã³ã¹ã¬ããããåŒã³åºããŸã
ã©ããã£ãŠããã®ïŒ ãšãŠãç°¡åã§ãïŒ
engine.dll
å
ã®ç©ºãã¹ããŒã¹ãèŠã€ããŠïŒã¢ã©ã€ã¡ã³ãããå®å
šã«é©åããïŒãããã«1ã€ã®ã¹ããªã³ã°ããŒããšå°ããªãããã¡ãŒãé
眮ããã ãã§ååã§ãã èšèããè¡åã«ç§»ããŸãããïŒ
BYTE *Remove = (BYTE *)GetProcAddress(hEngine, "?Remove@?$TArray@E@@QAEXHH@Z"); Remove += *(DWORD *)(Remove + 1) + 5; pckMsk = (char *)Remove + 0x74;
44ãã€ãã®é·ãã§æåã«äœ¿çšå¯èœãªã¹ããŒã¹ãèŠã€ãããŸããïŒããã«æ€çŽ¢ã§ããŸãïŒã ãããã¡ãããã«çœ®ãããããã«æååãæžã蟌ãŸããæåã®ïŒå®éã«ã¯2çªç®ã®ïŒåŒæ°ã§
SendPacket
ã«æž¡ãããŸãã
è¿ä¿¡å
ãã©ãããŸããïŒ
engine.dll
å
ã®ã¹ããªã³ã°ããŒãããã³ãã©ãŒã«
engine.dll
ããã ãã§ååã§ãïŒ
engine.dll
ãåŒã³åºããåŸ
SendPacket
ã³ã³ãããŒã«ã¯ã¹ããªã³ã°ããŒãã«ç§»åãããããããã³ãã©ãŒã«ç§»åããŸãïŒã ã©ã®ããã«èŠããŸããïŒ ãã®ããã«ïŒ
BYTE* RequestRestart = (BYTE *)GetProcAddress(hEngine, "?RequestRestart@UNetworkHandler@@UAEXAAVL2ParamStack@@@Z"); RequestRestart += *(DWORD *)(RequestRestart + 1) + 5; retAddr_handler_Render = RequestRestart + 0x2b; trmpAddr = (DWORD)fixupStack_Render - ((DWORD)retAddr_handler_Render + 5); VirtualProtectEx(hMain, retAddr_handler_Render, 1, PAGE_READWRITE, &tmpProtect); *retAddr_handler_Render = 0xE9; *(DWORD *)(retAddr_handler_Render + 1) = trmpAddr; VirtualProtectEx(hMain, retAddr_handler_Render, 1, PAGE_EXECUTE, &tmpProtect);
fixupStack_Render
èªäœïŒ
void __declspec(naked) fixupStack_Render() { __asm { add esp, [fixupSize]
fixupSizeãšã¯äœã§ããïŒ
SendPacket
åŒã³åºã
SendPacket
fixupSize = 12; //4 (push eax) + 4 (push [pckMsk]) + 4 (push 0x46) __asm { mov ecx, [unh] mov eax, [ecx + 0x48] mov ecx, [eax] mov edx, [ecx + 0x68] //SendPacket push 0x46 push [pckMsk] push eax push [retAddr_handler_Render] //trampoline to fixupStack_Render jmp edx }
å¯å€æ°ã®ãã©ã¡ãŒã¿ãŒãæž¡ããããã¹ã¿ãã¯ãã¯ãªã¢ããå¿
èŠããããŸãã
fixupStack_Render
ããã·ãŒãžã£ã®ã³ãŒã
fixupStack_Render
ãããå®è¡
fixupStack_Render
ãŸãã ãã¡ããã
SendPacket
èªäœã¯ã¡ã€ã³ã¹ã¬ãããã
SendPacket
å¿
èŠããããåè¿°ã®ãšã¯ã¹ããŒãããã
Render
颿°ã¯ãã®ç®çã®ããã«è¡ããŸãã
ã¯ã©ã€ã¢ã³ããžã®ããã±ãŒãžã®éä¿¡
åæ§ã«å®è£
ãããŸãã
çä¿¡ãã±ãããšçºä¿¡ãã±ããã®çœ®æ
äžèšã®ã€ã³ã¿ãŒã»ãã
ãããŸãåŠç¿ã
ãªãã£ã颿°ã®åŒæ°ã倿Žããã ãã§ååã§ãã
å®å
šã«å¿ããŠããŸã£ã
- ãã¹ãŠããã¹ãããããµãŒããŒ-Pirta
- ç³è«æžã¯éå¥èšé²ã«åºã¥ããŠæžãããŸãã
- ãšã¯ã¹ããŒãããŒãã«ã®äº€ææã«ä¿è·Sãèªã
ãšãããŒã°
å°ãªããšãäžåºŠã¯ç§ãå©ããŠããããã©ãŒã©ã Tã®åã¡ã³ããŒã«æè¬ããŸãã ãã°ãæ¢ãããµãŒããŒãè€è£œããŠããŸããã ãŸããã»ãã¥ãªãã£éçºè
Sã«ãããã®vraytapãäœæããçç±ãæããŠãããŠããããšãã ãããŠãã¡ãããèšäºãæåŸãŸã§èªãã habrã®ãŠãŒã¶ãŒã«ã
å®å
šãªãœãŒã¹æ·»ä»ïŒ
klatsããã±ãŒãžã®ãããªãã¢ïŒ
ããã«å¥ããåããŸãã