ã¯ããã«
Age of Mythologyã¯ããã¬ã€ã€ãŒãææãç¯ãããã¹ãŠã®æµãåãããšãããªã¢ã«ã¿ã€ã æŠç¥ã²ãŒã ã§ãã æšæºã¢ãŒãã§ã¯ããã¬ãŒã€ãŒã¯ãå®å
šã«é»ã§å¡ãã€ã¶ããããããã§ã²ãŒã ãéå§ããŸããããã¯ãæªç¥ã®æªéã®é åãæå³ããŸãã


ã²ãŒã äžããŠãŒã¶ãŒã¯ãããã調ã¹ãŸãã調æ»ãããšãªã¢ã«ã¯ãå°åœ¢ãè³æºãæµã®å»ºç©ã®å
åãããããé§ãã«éããŠè¡šç€ºãããŸãã


ãã®æçš¿ã®ç®æšã¯ããããå
šäœãéãããã¯ãäœæããŠããã¬ãŒã€ãŒã«å€§ããªå©ç¹ãäžããããšã§ãã ããã«ããããã¬ã€ã€ãŒã¯ãããäžã§å¯ŸæŠçžæãäœãããŠãããã確èªããæ»æã«æé©ãªæéãšå Žæãéžæã§ããŸãã ãã®ããã¯ã¯ã²ãŒã ã®ãªãªãžãã«ããŒãžã§ã³çšã«éçºãããŸãããåŸã§
Steamã§é
åžãããŠããæ°ããé«åºŠãªããŒãžã§ã³ã«é©çšããæ¹æ³ã瀺ããŸãã
ãã®èšäºã®ãªããŒã¹ãšã³ãžãã¢ãªã³ã°ã«ãã£ãŠè§£æãããã¡ã€ã³ã®å®è¡å¯èœãã¡ã€ã«ã®ããã·ã¥ã¯æ¬¡ã®ãšããã§ãã
CRC32 ïŒ7F1AF498
MD5 ïŒ09876F130D02AE760A6B06CE6A9C92DB
SHA-1 ïŒAAAC9CD38B51BEB3D29930D13A87C191ABF9CAD4
ããŒã1ïŒé£ããé
ã¯ããã«
ç§ãã¡ã®ç®æšã¯ããã¹ãŠã®ãããããŒã¿ããã¬ãŒã€ãŒã«éããã®ãéçºãããã¬ãŒã€ãŒã«ã²ãŒã ã§äœãèµ·ãã£ãŠãããã«ã€ããŠã®å®å
šãªæ
å ±ãæäŸããããšã§ãã è¯ããã¥ãŒã¹ã¯ãã«ãŒãã®å
¬éãšé衚瀺ãã²ãŒã ã®çµã¿èŸŒã¿æ©èœã§ããããšã§ãã ã²ãŒã ã¯èšé²ãããã²ãŒã ã®åçããµããŒãããã«ãŒãã®ãªãŒãã³é衚瀺ãªãã·ã§ã³ã¯ãã®æ©èœã®UIã®äžéšã§ãã

ãæŠäºã®é§ããã¿ã³ã¯ããããã®éå§ãå¶åŸ¡ããéåžžã®ç¶æ
ã«æ»ããŸãããã®ã¢ãŒãã§ã¯ããã¬ãŒã€ãŒã¯èªåã調ã¹ããã®ã ããèŠãããšãã§ããŸãã èšç»ã§ã¯ããã®ãã¿ã³ã®ãã³ãã©ãŒãèŠã€ããŠããããå±éããžãã¯ã®å Žæã远跡ããŸãã èŠã€ãã£ãããDLLãã²ãŒã ã«æ¿å
¥ããŠããããå±é颿°ãåŒã³åºããŸãã ãã®äœæ¥ã«ã¯ã
ããŒããšã³ãžã³ãªã©ã®ããŒã«ãé©ããŠããŸããããã¯ããããã³ã°ã²ãŒã ã®ã³ã³ããã¹ãã§ã®ã¡ã¢ãªã®èª¿æ»ãšå€æŽããããã°ãåè§£ãããã³ãã®ä»ã®æäœã«åœ¹ç«ã¡ãŸãã ãã®èšäºã§ã¯ããã®ããŒã«ã®äœ¿çšã«ã€ããŠã¯èª¬æããŸããããä»ã«ãå€ãã®ãªãœãŒã¹ããããŸãã
Cheat Engineãèµ·åããŠæ¥ç¶ããåŸãåé¡ã¯ãã¿ã³ãšå¯Ÿè©±ããã³ãŒããã©ãã«ãããã§ãã èŠã€ããæãç°¡åãªæ¹æ³ã¯ãæšæºã®ããã°ã©ãã³ã°ææ³ãé©çšããããšã§ãã ç¹ã«ãã¢ã¯ãã£ããªãã¿ã³ã®å€ã¯ã¡ã¢ãªã®ã©ããã«1ããããéã¢ã¯ãã£ããªãã¿ã³ã®å€ã¯0ã«ãªããŸãããããã£ãŠãããã¯ãã¹ããšå¿èã®åé¡ã«ãªããŸãã ããã»ã¹ã¡ã¢ãªã§å€ã1ããæ€çŽ¢ãããšïŒãã¿ã³ãã¢ã¯ãã£ããªå ŽåïŒã337,597ã®çµæãè¿ãããŸããã åãããšãããããšããå Žåãå€ãåãã§ãããšæåŸ
ããªãã§ãã ããã

ããã¯ç¢ºèªããã«ã¯å€ãããŸãã ããäžåºŠãã¿ã³ãæŒããŠéã¢ã¯ãã£ãã«ããå€ã0ããæ€çŽ¢ããŸãã ããã°ã©ã ã¯376ãè¿ããŸã-ãŸã å€ãããŸãã

ãã®ããã»ã¹ãæ°åç¹°ãè¿ããšãæ€çŽ¢ãšãªã¢ããã§ã«éåžžã«äŸ¿å©ãª21åã®ã¢ãã¬ã¹ã«çž®å°ãããŸããã

ãããã®21ã®20ã¯äºãã«éåžžã«è¿ãã£ãã
0x08FC71A4ã¯ããã®ã·ãªãŒãºã®äŸå€ã®ããã§ãã ããæ
éã«æ€èšããå€ã0ãã倿Žãããšããã¿ã³ãéã¢ã¯ãã£ãç¶æ
ã«åãæ¿ããããšãã§ããŸããã ãããã£ãŠãç®çã®ã¢ãã¬ã¹ãèŠã€ãããæ®ãã®20åã¯å®å
šã«ç Žæ£ã§ããŸãã æ¬¡ã®ã¹ãããã¯ãäœãèšé²ãããŠãããã調ã¹ãããšã§ãã

ãã®æç¹ã§ãããŒããšã³ãžã³
ã¯ãããã¬ã
æ¥ç¶ãã
0x08FC71A4ãžã®ãã¹ãŠã®æžã蟌ã¿ãç£èŠããŸãã ãã¿ã³ãæ°åæŒããåŸã次ã®ã³ãã³ããèå¥ãããŸããã ãããã®ã³ãã³ãã¯
0x08FC71A4ã«æžã蟌ã¿ãŸãã ã

次ã«ããããã®èšé²æäœã®æ¬¡ã«äœãèµ·ãã£ãŠããããããçè§£ããããã«ããããã調ã¹ãŠãã¬ãŒã¯ãã€ã³ããèšå®ããå¿
èŠããããŸãã æžã蟌ã¿ã³ãã³ãã«ãã¬ãŒã¯ãã€ã³ããèšå®ãã

ã²ãŒã ã«å€¢äžã«ãªã£ãããšã§ããã®æ©èœããã¿ã³ããšã«åŒã³åºãããããšãããããŸããã ããã§ã
ECXã¯ãã¿ã³ãžã®ãã€ã³ã¿ã§ããã+
0x1A4ã«ã¯ãããã
IsToggledããããã£ãå«ãŸããŠããã察å¿ããç¶æ
ããã¿ã³ã«å²ãåœãŠãŸãã ãã®å²ãåœãŠã¯2çªç®ã®æžã蟌ã¿ã³ãã³ãã§å®è¡ããã
EDXã¯ã0ãïŒéã¢ã¯ãã£ãïŒãŸãã¯ã1ãïŒã¢ã¯ãã£ãïŒã«ãªããŸãã ã³ãŒãã¯å°ãè€éã«èŠãããããããŸããããå«ãŸããç¶æ
ãæ£ããããšã確èªãã
IsToggledããããã£ãèšå®ããŠãã颿°ãåŒã³åºããŠæ»ããŸãã
åä¿¡è
ã¢ãã¬ã¹
+ 0x14B670ã¯ããã¹ãŠã®ãã¿ã³ã«é©çšãããã³ãŒãã§ããããŸãã ããã§ããã¹ãŠããã£ãããšèª¿ã¹ãŠããFog of Warããã¿ã³ã«é¢é£ããå¯èœæ§ã®ããã³ãŒãã®é åãèŠã€ããå¿
èŠããããŸãã ããŸããŸãªã¢ãããŒããé©çšã§ããŸãããéåžžã¯ä»¥äžã䜿çšããŸãã
- ã±ãŒã¹ããšã«èšç®ãããåŒã³åºãã¢ãã¬ã¹ã ããã¯ããã¿ã³ã®ç¶æ
ãå€åããåŸã«å®è¡ãããã€ãã³ãåŠçã¡ã«ããºã ã OnChanged / OnEnabled / OnDisabledãªã©ã®æ©èœããŸãã¯åæ§ã®æ©èœãæå³ããŸãã
- 颿°ãžã®ãã€ã³ã¿ãŒã§ãã颿°ãã©ã¡ãŒã¿ãŒã
- åŒæ°1ãŸãã¯0ãåãåã颿°ã®åŒã³åºãã
+ 0x14B670ãå
¥åãã
æé ã«ããã以äžã«ç€ºã次ã®ïŒéšåçãªïŒã¢ã»ã³ãã©ã³ãŒããåŸãããŸãã ã¢ã»ã³ãã©ã³ãŒãã§ã¯ã
ã¡ã¢ãªå
ã®ã¢ãžã¥ãŒã«ã®éå§ã¢ãã¬ã¹
+ offsetã§ã¯ãªãã絶察ã¢ãã¬ã¹ã瀺ã
ããŸã ãããã¯ãããŒããšã³ãžã³ãããããIDAããã³ããŒããæ¹ãã¯ããã«ç°¡åã ããã§ãã
.text:0054B670 mov eax, large fs:0
.text:0054B676 push 0FFFFFFFFh
.text:0054B678 push offset SEH_54B670
.text:0054B67D push eax
.text:0054B67E mov large fs:0, esp
.text:0054B685 sub esp, 8
.text:0054B688 push esi
.text:0054B689 mov esi, ecx
.text:0054B68B mov eax, [esi+148h]
.text:0054B691 push edi
.text:0054B692 mov edi, [esi]
.text:0054B694 push eax
.text:0054B695 push esi
.text:0054B696 lea ecx, [esp+24h+var_10]
.text:0054B69A call sub_4D7470
.text:0054B69F mov ecx, [eax]
.text:0054B6A1 push ecx
.text:0054B6A2 push 1
.text:0054B6A4 mov ecx, esi
.text:0054B6A6 call dword ptr [edi+54h]
.text:0054B6A9 cmp [esp+1Ch+arg_0], 0Dh
.text:0054B6AE jnz loc_54B769
.text:0054B6B4 lea edi, [esi+154h]
...
0x004D7470 ïŒ
èµ€ ïŒãåŒã³åºããåŒã³åºãã¯éåžžã«è¿
éã«æ»ããããããã«ã¯è¡šç€ºãããŸããã
+ 0x14B6A6ã§ã®æ¬¡ã®åŒã³åºãïŒ
é ïŒã¯ãã¬ãžã¹ã¿ãä»ããŠåŒã³åºããè¡ããŸãã ããã¯å
¥å¿µãªç ç©¶ã®è¯ãåè£ã§ãã ãã®é¢æ°ã¯ã2ã€ã®å¯èœãªã¢ãã¬ã¹ãåŒã³åºãããšãã§ããŸãã
...
.text:0054BF98 push 0Ch
.text:0054BF9A call dword ptr [eax+0CCh]
.text:0054BFA0
.text:0054BFA0 loc_54BFA0: ; CODE XREF: sub_54BF80+Fj
.text:0054BFA0 ; sub_54BF80+14j
.text:0054BFA0 mov ecx, [esp+0Ch+arg_8]
.text:0054BFA4 push ecx
.text:0054BFA5 push edi
.text:0054BFA6 push ebx
.text:0054BFA7 mov ecx, esi
.text:0054BFA9 call sub_4D4EF0
.text:0054BFAE pop edi
...
+ 0x14BF9A ïŒ
èµ€ ïŒã®ã³ãã³ãã¯ããããã°ããã³ãã¹äžã«åŒã³åºãããããšã¯ãªãããã調æ»ããæå³ã¯ãããŸããã ç ç©¶ã®ããã«ã次ã®ã³ãŒã«ã®ã¿ã
+ 0x14BFA9 ïŒ
é ïŒã®ãŸãŸã§ãã ãã®é¢æ°ã¯ãµã€ãºãéåžžã«å€§ãããå€ãã®å¯èœæ§ã®ããåŒã³åºããã€ã³ããåããåºãåå²ããããŸãã ãããã°ã§ã¯ããã®ããžãã¯ã®ã»ãšãã©ãã¹ãããã§ããŸãã Fog of Warãã¿ã³ãã¢ã¯ãã£ããªç¶æ
ã§ã®ã¿å®è¡ãããã³ãŒãããã¬ãŒã¹ããããšã«ããã3ã€ã®ã³ãŒã«ãã±ãŒã·ã§ã³ã®ã¿ãéžæããŸãã
...
.text:004D504C cmp esi, dword_A9D068
.text:004D5052 jz short loc_4D5087
.text:004D5054 push esi
.text:004D5055 call sub_424750
.text:004D505A mov edi, eax
.text:004D505C add esp, 4
.text:004D505F test edi, edi
.text:004D5061 jz short loc_4D5070
.text:004D5063 push esi
.text:004D5064 call sub_4D58B0
.text:004D5069 add esp, 4
.text:004D506C test edi, edi
.text:004D506E jnz short loc_4D5079
.text:004D5070
.text:004D5070 loc_4D5070: ; CODE XREF: sub_4D4EF0+171j
.text:004D5070 pop edi
.text:004D5071 pop esi
.text:004D5072 pop ebp
.text:004D5073 xor al, al
.text:004D5075 pop ebx
.text:004D5076 retn 0Ch
.text:004D5079 ; ---------------------------------------------------------------------------
.text:004D5079
.text:004D5079 loc_4D5079: ; CODE XREF: sub_4D4EF0+17Ej
.text:004D5079 mov eax, [esp+10h+arg_4]
.text:004D507D mov edx, [edi]
.text:004D507F push ebp
.text:004D5080 push eax
.text:004D5081 push ebx
.text:004D5082 mov ecx, edi
.text:004D5084 call dword ptr [edx+54h]
.text:004D5087
.text:004D5087 loc_4D5087: ; CODE XREF: sub_4D4EF0+157j
.text:004D5087 ; sub_4D4EF0+162j
.text:004D5087 pop edi
...
ãã¬ãŒã¹åŸã®
+ 0xD5055 ïŒ
èµ€ ïŒã§ã®åŒã³åºãã¯ãè¡ãæ¢ãŸãã«ãªããŸãã åãããšã
+ 0xD5064 ïŒ
ãªã¬ã³ãž ïŒã«ãåœãŠã¯ãŸããŸãã ãããã¬ã䜿çšããŠãããã«ã¢ã¯ã»ã¹ããã³ãŒãå®è¡ãã¹ã®ãã¬ãŒã¹ãéå§ãããšãããã2ã€ã®é¢æ°ã®åäœã¯éåžžã«äŒŒãŠããããšãããããŸãã ãã ããããããšã®ããåãã«é¢ããŠã[æŠäºã®é§]ãã¿ã³ã®æäœãšå
±éç¹ãããããšã瀺åãããã®ã¯äœããããŸããã ããã2ã€ã®ã³ãã³ãã«ãã¬ãŒã¯ãã€ã³ããèšå®ãããšããããã¯åžžã«ã©ããããåŒã³åºãããåŒã³åºãå
ã®ãªããžã§ã¯ãã®ããžãã¯ã®ã¿ãå®è¡ããããšãããããŸãã ãã®æ®µéã§ã¯ããŸã UIãšãã¿ã³ã®ã¯ãªãã¯ã«é¢é£ããäžè¬çãªã³ãŒãã䜿çšããŠãããããããã2ã€ã®æ©èœã¯ãããã®è¡šç€ºãšã¯ç¡é¢ä¿ã§ãããšèããã®ã¯ååå®å
šã§ãã
åŒã³åºãæåŸã®å Žæã¯
+ 0xD5084 ïŒ
é ïŒã§ãã ããã
å
¥åãããšã
+ 0xD4EF0ã«ã€ãªãããŸããããã¯å¥ã®çŽ æŽãããæ©èœã§ãã
.text:004D4EF0 push ebx
.text:004D4EF1 mov ebx, [esp+4+arg_0]
.text:004D4EF5 push ebp
.text:004D4EF6 mov ebp, [esp+8+arg_8]
.text:004D4EFA push esi
.text:004D4EFB mov esi, ecx
.text:004D4EFD mov ecx, [esi+0B8h]
...
ã³ã³ãããŒã«ãã€ã³ããé
眮ãããšãåžžã«æ©èœããŸããã€ãŸããæšæºã®åŠçã³ãŒãã§ããããŸãã ããã«é²ããšãåã®ãªã¹ãã§ç€ºããã³ãŒãã«æ»ãããšãããããŸãã
0x00424750ãš
0x004D58B0ãžã®åã2ã€ã®åŒã³åºããè¡ãããŸãã æ¬¡ã«
[EDX + 0x54]ã
åŒã³åºãããŸãããä»åã¯
EDXã®æå³ãç°ãªããŸãã ãã®2çªç®ã®åŒã³åºãã§ãããã¯
+ 0xD0C70ã§æ¬¡ã®é¢æ°ã«
ã€ãªãããŸãã
.text:004D0C70 mov ecx, [ecx+14Ch]
.text:004D0C76 test ecx, ecx
.text:004D0C78 jz short loc_4D0C91
.text:004D0C7A mov edx, [esp+arg_8]
.text:004D0C7E mov eax, [ecx]
.text:004D0C80 push edx
.text:004D0C81 mov edx, [esp+4+arg_4]
.text:004D0C85 push edx
.text:004D0C86 mov edx, [esp+8+arg_0]
.text:004D0C8A push edx
.text:004D0C8B call dword ptr [eax+30h]
.text:004D0C8E retn 0Ch
.text:004D0C91 ; ---------------------------------------------------------------------------
.text:004D0C91
.text:004D0C91 loc_4D0C91: ; CODE XREF: sub_4D0C70+8j
.text:004D0C91 xor al, al
.text:004D0C93 retn 0Ch
.text:004D0C93 sub_4D0C70 endp
åŒã³åºãå®éã®å Žæã¯1ã€ãããªãããããã®é¢æ°ã¯éåžžã«ç°¡åã«åæã§ããŸãã ãã§ãã¯ãã€ã³ãã®èšå®ã¯ãã©ãããã§ãåŒã³åºãããããšãã€ãŸããäžè¬çãªã³ãŒãã§ããããšã瀺ããŸãã
[EAX + 0x30]ãåŒã³åºããšã
+ 0x680D0ã«ãªããŸãã ã³ã³ãããŒã«ãã€ã³ãã䜿çšããŠããã»ã¹ãç¹°ãè¿ããšãã©ãããã§ãåŒã³åºãããããšãããããŸãããããã£ãŠãããã§ã¯äœã圹ã«ç«ã¡ãŸããã
.text:004680D0 push 0FFFFFFFFh
.text:004680D2 push offset SEH_4680D0
.text:004680D7 mov eax, large fs:0
.text:004680DD push eax
.text:004680DE mov large fs:0, esp
.text:004680E5 sub esp, 0F8h
.text:004680EB mov eax, [esp+104h+arg_8]
.text:004680F2 push ebx
.text:004680F3 push ebp
.text:004680F4 push esi
.text:004680F5 mov esi, [esp+110h+arg_0]
.text:004680FC push edi
.text:004680FD mov ebp, ecx
.text:004680FF mov ecx, [esp+114h+arg_4]
.text:00468106 push eax
.text:00468107 push ecx
.text:00468108 push esi
.text:00468109 mov ecx, ebp
.text:0046810B mov [esp+120h+var_F0], ebp
.text:0046810F call sub_4718B0
.text:00468114 test al, al
...
ç¹å®ã®ã³ãŒããæ€çŽ¢ãã
ã¢ãã¬ã¹
+ 0x6810Fã§åŒã³åºãã®æåã®å Žæãå
¥åããã¹ãããã«ããã巚倧ãªé·ç§»ããŒãã«ãå«ã颿°ã«ç§»åããŸãïŒäžã®ã¹ã¯ãªãŒã³ã·ã§ãããåç
§ïŒã ããã¯ãã€ãã³ããå¶åŸ¡ããããã€ãã³ãåŠçã¡ã«ããºã ãåŠçãããããé åãèŠã€ãããšããææãªå
åãããããŸããã

段éçãªã³ãŒãå®è¡ã«ãããæ¬¡ã®ã±ãŒã¹ãçºçããŸãã
.text:00471DB4 loc_471DB4: ; CODE XREF: sub_4718B0+4FDj
.text:00471DB4 ; DATA XREF: .text:off_471FA0o
.text:00471DB4 push edi ; jumptable 00471DAD case 4
.text:00471DB5 call sub_54E7D0
.text:00471DBA mov esi, eax
.text:00471DBC add esp, 4
.text:00471DBF test esi, esi
.text:00471DC1 jz loc_471F5F ; jumptable 00471DAD case 3
.text:00471DC7 push edi
.text:00471DC8 call sub_4D58B0
.text:00471DCD add esp, 4
.text:00471DD0 test esi, esi
.text:00471DD2 jz loc_471F5F ; jumptable 00471DAD case 3
.text:00471DD8 mov edx, [esi+1A4h]
.text:00471DDE mov ecx, [esp+50h+var_40]
.text:00471DE2 cmp edx, ebx
.text:00471DE4 setz al
.text:00471DE7 push eax
.text:00471DE8 call sub_58EA10
.text:00471DED mov al, 1
.text:00471DEF jmp loc_471F65
...
ã³ã³ãããŒã«ãã€ã³ãã
+ 0x71DB4 ïŒ
ãã³ã¯ ïŒã«èšå®ããŠç¶è¡ãããšãããã«ã¯åžžã«äœã
å±ããªãããšãããããŸããã ãFog of Warããã¿ã³ãã¯ãªãã¯ãããšã
+ 0x71DB4ãå®è¡ãããŠããããšã
ããããŸã ã ãããŠæåŸã«ãé·ããã¬ãŒã¹ã®åŸãFog of Warãã¿ã³ã«é¢é£ããã³ãŒãå
ã«ãããšãã蚌æ ãååŸããŸãã æåã®åŒã³åºãã³ãã³ãã¯
+ 0x71DB5 ïŒ
èµ€ ïŒã§ãã ãã®é¢æ°ã¯
EDIãä»ããŠ1ã€ã®ãã©ã¡ãŒã¿ãŒãåãåããåžžã«å®æ°å€ã§ãã ã³ãŒããã¹ãããããšã«å®è¡ãããã¹ãŠã®ãã©ã¡ãŒã¿ãŒã®å€ãŸãã¯ã¢ãã¬ã¹å¯èœ/ããŒããããã¢ãã¬ã¹ãæ³šææ·±ã芳å¯ãããšããã¿ã³ã¹ã€ããã®å€ã«ã€ããŠèšåãããã®ã¯äœãèŠã€ãããŸããã ç¹ã«ããããã®ãªãŒãã³/é衚瀺ãã¿ã³ãã¯ãªãã¯ããŠæ©èœããã¬ãŒã¹ãããšãããäœãå€åããªãã£ãããããããé€å€ããŸããã ã¢ãã¬ã¹
+ 0x71DC8 ïŒ
ãªã¬ã³ãž ïŒã®ã³ãã³ãã¯ãæ¢ã«äžã§èª¿ã¹ãã¢ãã¬ã¹
0x004D58B0ãåŒã³åºããŸãã åãããšã颿°ã§ãèµ·ãããŸãã åžžã«åã®é¢æ°ãšåãå€ãååŸããã¹ã€ããå€ãæžã蟌ããããã®å€ã«åºã¥ããŠã³ãŒããå¶åŸ¡ãããã«ã€ããŠã¯äœãèšããŸããã
次ã®åŒã³åºãã¯
+ 0x71DE8ã§ãã ãã®é¢æ°ã1ã€ã®ãã©ã¡ãŒã¿ãŒãåãåããŸããããã¯ãé·ç§»ããŒãã«ãåŠçãã颿°ãçµäºããåã«åŒã³åºãããæåŸã®é¢æ°ã§ããããŸãã
ã¿ãŒã³ã€ãºãããã¯ã«ã¯éåžžã«è峿·±ãã³ãŒãããããŸãã å€ã¯
[ESI + 0x1A4]ããããŒãããã
EBXãšæ¯èŒãããŸãã ãã®æ¯èŒã®çµæã¯ã
ALãã€ãã0ãŸãã¯1ã«èšå®ããŸãã0ãŸãã¯1ã«ãªã
EAXã¯ãåŒæ°ãšããŠ
0x0058EA10ã§é¢æ°ã«
æž¡ãããŸãã ã²ãŒã ã§ãã¿ã³ãæŒããšãã¹ãããããšã«å®è¡ãããšã
EBXã«ã¯åžžã«å€1ãå«ãŸãã
EDXã«ã¯ã«ãŒããé衚瀺ã衚瀺ãã«å¿ããŠ0ãŸãã¯1ãå«ãŸããããšã瀺ãããŸãã ããã¯ãã«ãŒãã®è¡šç€ºãšé衚瀺ã«äœ¿çšãããæ©èœã§ãããšæ³å®ã§ããŸãã
0x0058EA10ã®ã¢ã»ã³ãã©ãªã¹ãã以äžã«ç€ºããŸãã
.text:0058EA10 sub_58EA10 proc near ; CODE XREF: sub_4718B0+538p
.text:0058EA10 ; sub_58DF30+919p ...
.text:0058EA10
.text:0058EA10 arg_0 = dword ptr 4
.text:0058EA10
.text:0058EA10 push ebx
.text:0058EA11 mov ebx, [esp+4+arg_0]
.text:0058EA15 mov [ecx+53h], bl
.text:0058EA18 mov eax, dword_A9D244
.text:0058EA1D mov ecx, [eax+140h]
.text:0058EA23 test ecx, ecx
.text:0058EA25 jz short loc_58EA43
.text:0058EA27 push 1
.text:0058EA29 push ebx
.text:0058EA2A call sub_5316B0
.text:0058EA2F mov ecx, dword_A9D244
.text:0058EA35 mov ecx, [ecx+140h]
.text:0058EA3B push 1
.text:0058EA3D push ebx
.text:0058EA3E call sub_5316D0
.text:0058EA43
.text:0058EA43 loc_58EA43: ; CODE XREF: sub_58EA10+15j
.text:0058EA43 pop ebx
.text:0058EA44 retn 4
.text:0058EA44 sub_58EA10 endp
å€0ãŸãã¯1ãããã«2ã€ã®é¢æ°ã«æž¡ããŸããå颿°ã¯2ã€ã®ãã©ã¡ãŒã¿ãŒãåããŸãã æåã®ãã©ã¡ãŒã¿ãŒã¯åãæ¿ãå€0ãŸãã¯1ã2çªç®ã¯åžžã«ããŒãã»ããå€1ã§ããããã2ã€ã®é¢æ°ãèŠããšãå€0ãŸãã¯1ããªããžã§ã¯ãã«æžã蟌ãã§ãã颿°ãåŒã³åºãããšãããããŸãã
.text:005316B0 ; =============== SUBROUTINE =======================================
.text:005316B0
.text:005316B0
.text:005316B0 public sub_5316B0
.text:005316B0 sub_5316B0 proc near ; CODE XREF: sub_442070+1684p
.text:005316B0 ; sub_4C91E0+14Cp ...
.text:005316B0
.text:005316B0 arg_0 = byte ptr 4
.text:005316B0 arg_4 = dword ptr 8
.text:005316B0
.text:005316B0 mov edx, [esp+arg_4]
.text:005316B4 mov al, [esp+arg_0]
.text:005316B8 push edx
.text:005316B9 push 1
.text:005316BB mov [ecx+40Eh], al
.text:005316C1 call sub_5316F0
.text:005316C6 retn 8
.text:005316C6 sub_5316B0 endp
.text:005316C6
.text:005316C6 ; ---------------------------------------------------------------------------
.text:005316C9 align 10h
.text:005316D0
.text:005316D0 ; =============== SUBROUTINE =======================================
.text:005316D0
.text:005316D0
.text:005316D0 sub_5316D0 proc near ; CODE XREF: sub_442070+1698p
.text:005316D0 ; sub_4C91E0+137p ...
.text:005316D0
.text:005316D0 arg_0 = byte ptr 4
.text:005316D0 arg_4 = dword ptr 8
.text:005316D0
.text:005316D0 mov edx, [esp+arg_4]
.text:005316D4 mov al, [esp+arg_0]
.text:005316D8 push edx
.text:005316D9 push 1
.text:005316DB mov [ecx+40Fh], al
.text:005316E1 call sub_5316F0
.text:005316E6 retn 8
.text:005316E6 sub_5316D0 endp
亀æããã
mov alã[esp + arg_0]ã«
mov alã0
ãã
ããFog of Warãã¿ã³ã®ç¶æ
ã«é¢ä¿ãªããããããããåžžã«éããŠãããšããäºå®ã«ã€ãªãããŸãã ç§ãã¡ã¯ãã«ãŒããæããã«ããé ãããã®ã³ãŒããèŠã€ããŸããã
ããã¯éçº
ãã®æ®µéã§ãããã¯ãäœæã§ããŸããå¿
èŠãªã«ãŒãã®ç¶æ
ã«å¿ããŠãtrue / falseã®å€ã§
0x0058EA10ãåŒã³åºãã ãã§ãã ãã ããå°ããªåé¡ããããŸãã
[ECX + 0x53]ã®ã¢ãã¬ã¹
0x0058EA15ã«æžã蟌ã¿ã³ãã³ãããããŸãã ããã¯ãèšé²å¯èœãªãã£ãŒã«ããæã€ãªããžã§ã¯ããã¢ãã¬ã¹
+ 0x53ã«è»¢éããå¿
èŠãããããšãæå³ããŸãããã®ã¢ãã¬ã¹ã¯ãéåžž
__thiscallã䜿çšããŠ
ECXçµç±ã§éä¿¡ãããã
this ããã©ã¡ãŒã¿ãŒãšããŠæ©èœããŸãã ããã«ã
ECX颿°ã§ã¯ãåºå®ã¢ãã¬ã¹ããããŒãããåŸã«äžæžãããããããããã¯å®å
šãªã¢ãããŒãã®ããã«æããŸãã ãã®ã¿ã¹ã¯ã®ããŒãã£ã³ãŒãã以äžã«ç€ºããŸãã
#include <Windows.h> struct DummyObj { char Junk[0x53]; }; DummyObj dummy = { 0 }; using pToggleMapFnc = void (__thiscall *)(void *pDummyObj, bool bHideAll); int APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) { switch (dwReason) { case DLL_PROCESS_ATTACH: { (void)DisableThreadLibraryCalls(hModule); pToggleMapFnc ToggleMap = (pToggleMapFnc)0x0058EA10; while (!GetAsyncKeyState('0')) { if (GetAsyncKeyState('7')) { ToggleMap(&dummy, true); } else if (GetAsyncKeyState('8')) { ToggleMap(&dummy, false); } Sleep(10); } break; } case DLL_PROCESS_DETACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: break; } return TRUE; }
DLLãã²ãŒã ã«æ¿å
¥ãããåŸãã7ãããã³ã8ãããŒã䜿çšããŠãã«ãŒããå®å
šã«éããç¶æ
ãŸãã¯éããç¶æ
ã«åãæ¿ããããšãã§ããŸãã


ãããã«
ããã§ãã²ãŒã çšã®ããã¯ã«ãŒãã®éçºãå®äºããŸããã ãã®ã¢ãããŒãã¯éåžžã«è€éã§è€éã§ãããèšäºã®æ¬¡ã®éšåã§ã¯ãå®è¡å¯èœãã¡ã€ã«ã«éçºè
ãæ®ããæçšãªæ
å ±ã䜿çšããŠããã¹ãŠã倧å¹
ã«ç°¡çŽ åããæ¹æ³ã瀺ããŸãã èšäºãèªãã§ãæåããæåŸãŸã§ã®äœæ¥ãéåžžã«ç·åœ¢ã§ãããšå€æã§ããŸãããå®éã«ã¯ãç°¡æœã«ããããã«ãè¡ãæ¢ãŸãã«è³ãã³ãŒãã®å€ãã®ãã¹ãæ¬ èœããŠããŸããã ãã圌ããçãŸããªãã圌ãèªèº«ãšåœŒãã®èª¬æãè«æã«ããªã¥ãŒã ãããããå¯èœæ§ããããŸãã ããã¯ã®åæéçºäžã«ãã³ãŒããäœåºŠãå®è¡ããããŸããŸãªæ¹æ³ã詊ããå¿
èŠãªå¯èœæ§ããããã®ã«ã€ããŠã¡ã¢ããŸããã ãã®çµæããã®èšäºã§ã¯æçšãªæ
å ±ã®ã¿ãåéããå
šäœçãã€ã»ãŒç·åœ¢ã®ã¬ã€ãã«ãŸãšããŸããã
ããŒã2ïŒç°¡åãªæ¹æ³
åã®ããŒãã§ã¯ãã²ãŒã ã®çµã¿èŸŒã¿æ©èœã䜿çšããŠããã¯ã«ãŒããäœæããæ¹æ³ã«ã€ããŠèª¬æããŸããã ãã®ææ³ã§ã¯ãé衚瀺/ãªãŒãã³ç¶æ
ãåãæ¿ããæ©èœã䜿çšããŸããã ãããã®çµã¿èŸŒã¿é¢æ°ãäžè²«ããŠé©çšããŠãã¢ã»ã³ããªã³ãŒããæ€çŽ¢ããŠããŸãã ãã®çµæãããã«ããããããã®æ©èœãåŒã³åºãããã¯ãäœæã§ããããããé衚瀺ã«ããŠè¡šç€ºããããžãã¯ã«å°ãããŸããã ãã®ããŒãã§ã¯ãã¯ããã«åçŽãªææ³ã«ã€ããŠèª¬æããŸããããã¯ããã€ããªã«å«ãŸããæçšãªæååã®ãããã§ã®ã¿å¯èœã§ãã
ãã®ããŒãã§ã¯ãåªãããããã¬ãŒããã³é
ã¢ã»ã³ãã©ãŒã§ãã
x64dbgã䜿çšããŸããããã¯ããã§ã«å»æ¢ããã
OllyDbgã®åŸç¶ãšèŠãªãããŸãã æ®å¿µãªããããã®éšåã§ã¯ãã³ãŒããå®è¡ããããã»ã¹ã§åæãã»ãšãã©å¿
èŠãšããªãã£ããããããŸã䜿çšããŸããã§ããïŒæçµçã«ããã®éšåã¯ãç°¡åãªæ¹æ³ããšåŒã°ããŸãïŒã ã¢ã»ã³ããªããããã©ã°ã¡ã³ãã¯
IDA Proãã貌ãä»ããããŸããã³ããŒããŒã¹ã圢åŒãæãèªã¿ãããããã§ãã
ããã»ã¹ãžã®æ¥ç¶ãšãã¡ã€ã³ã®å®è¡å¯èœãã¡ã€ã«ã®æååïŒããŠã¹ã®å³ãã¿ã³->æ€çŽ¢->çŸåšã®ã¢ãžã¥ãŒã«->æåååç
§ïŒã®ãã³ãããå§ããŠã25817è¡ïŒæ€çŽ¢çšã®ããªã倧ããªé åïŒããããŸããã

ãmapãè¡ã®ãã£ã«ã¿ãŒã¯ããã䟿å©ãªã»ãããæäŸããŸãã ããã調ã¹ãŠã¿ããšãäœãé¢çœãããšã«ã€ãªããå¯èœæ§ã®ããè¡ãããã€ãèŠã€ãããŸããã
ãTrSetFogAndBlackmapïŒ<true / false> <true / false>ïŒïŒé§ãšé»ã®ãããã®ãªã³/ãªããããTrRevealEntireMap-衚瀺ã¢ãŒããã©ã®ããã«æ©èœãããã«äŒŒããããå
šäœã衚瀺ããŸãã
ãTrPlayerResetBlackMapïŒïŒç¹å®ã®HUMANãã¬ã€ã€ãŒã®ãã©ãã¯ãããããªã»ããããŸããã
ããããã®å¯èŠæ§ã
ããã©ãã¯ãããïŒ[integerState]ïŒïŒæªæ¢çŽ¢ã®ãã©ãã¯ãããã¬ã³ããªã³ã°ãåãæ¿ããŸãã¯èšå®ããŸããã
ãªã¬ã³ãžè²ã§åŒ·èª¿è¡šç€ºããã2ã€ã®æãææãªè¡ã è¡ã¯ã颿°ãäœãããã®ããæç¢ºã«ç€ºããŠããããã©ã¡ãŒã¿ãŒåŒæ°ãäŒããŸãã trXæ©èœã¯ããããäœæè
ããšãã§ã¯ããšæ¡ä»¶ã远å ã§ããã²ãŒã å
ããªã¬ãŒã·ã¹ãã ã«é¢é£ããŠããããã§ãã æåã®è¡ã®ãªã³ã¯ã調ã¹ããšã次ã®ããšãããããŸãã
...
.text:008B2B76 loc_8B2B76: ; CODE XREF: sub_8AE4A0+46CDj
.text:008B2B76 mov ecx, esi
.text:008B2B78 call sub_59C270
.text:008B2B7D push 1
.text:008B2B7F push offset loc_8AAEE0
.text:008B2B84 push offset aTrsetfogandbla ; "trSetFogAndBlackmap"
.text:008B2B89 mov ecx, esi
.text:008B2B8B call sub_59BE80
.text:008B2B90 test al, al
.text:008B2B92 jnz short loc_8B2BAE
.text:008B2B94 push offset aTrsetfogandbla ; "trSetFogAndBlackmap"
.text:008B2B99 push offset aSyscallConfigE ; "Syscall config error - Unable to add th"...
.text:008B2B9E push esi ; int
.text:008B2B9F call sub_59DBC0
...
ããã®ã³ãŒãã¯ãæååã颿°ãžã®ãã€ã³ã¿ãŒãããã³å®æ°ïŒ1ïŒãå¥ã®é¢æ°ïŒ
turquoise ïŒã®åŒæ°ãšããŠæž¡ãããšããå§ãŸããŸãã ãã®åŒã³åºãã®æ»ãå€ã¯ããšã©ãŒç¶æ
ïŒ
é ïŒã§ããçå·0ã§ãã§ãã¯ãããŸãã éã¢ã»ã³ãã©ã§äœãèµ·ããããèŠããšããã®ãã³ãã¬ãŒããã©ãã§ã䜿çšãããŠããããšãããããŸãã ãã®ã³ãŒããšãããåãå·»ãã³ãŒãã¯ãããªã¬ãŒã®ç»é²ã詊ã¿ãããªã¬ãŒã®ååãããªã¬ãŒã³ãŒããããå Žæã«ã€ãã³ããåŠçããã¡ã«ããºã ãããã³æªç¥ã®å®æ°1ãå ±åããŸããããã念é ã«çœ®ããŠãã€ãã³ããåŠçããã¡ã«ããºã ã§æ€çŽ¢ãç¶è¡ããå¿
èŠããããŸãã
ã€ãã³ãåŠçã¡ã«ããºã ãžã®ç§»è¡ã¯ã次ã®ã³ãŒããã©ã°ã¡ã³ãã«ã€ãªãããŸãã
.text:008AAEE0 loc_8AAEE0: ; DATA XREF: sub_8AE4A0+46DFo
.text:008AAEE0 mov eax, dword_A9D244
.text:008AAEE5 mov ecx, [eax+140h]
.text:008AAEEB test ecx, ecx
.text:008AAEED jz short locret_8AAF13
.text:008AAEEF mov edx, [esp+4]
.text:008AAEF3 push 0
.text:008AAEF5 push edx
.text:008AAEF6 call sub_5316B0
.text:008AAEFB mov eax, [esp+8]
.text:008AAEFF mov ecx, dword_A9D244
.text:008AAF05 mov ecx, [ecx+140h]
.text:008AAF0B push 0
.text:008AAF0D push eax
.text:008AAF0E call sub_5316D0
.text:008AAF13
.text:008AAF13 locret_8AAF13: ; CODE XREF: .text:008AAEEDj
.text:008AAF13 retn
èšäºã®æåã®éšåãæ³šææ·±ãèªãã å Žåãããã§ã®2ã€ã®åŒã³åºãïŒ
ç· ïŒã¯ããªãã¿ã§ãããã ãããã¯ãç§ãã¡ãçºèŠããããã«ãã«ãŒãã®è¡šç€ºãšé衚瀺ãå¶åŸ¡ãã2ã€ã®æ©èœã§ãã å颿°ã¯ã
this ããžã®ãã€ã³ã¿ãŒãåãåããŸããããã¯ãããã§èŠãããããã«ãæ°žç¶ã¢ãã¬ã¹ããããŒããããã»ãšãã©ã®å Žåãã¡ã€ã³ãã¬ãŒã€ãŒã®ã¯ã©ã¹ãšããããã§äœãèµ·ãããã説æããtrue / falseã®å€ã§ãã 3çªç®ã®äžå€ãã©ã¡ãŒã¿ãŒ0ããããŸããããã¯ãèšäºã®åã®éšåããã®åŒã³åºãã®ä»ã®å Žæã§äžå€ãã©ã¡ãŒã¿ãŒ1ãšã¯ç°ãªããŸãã ãããããã«ãŒãã®ç¶æ
ããã¬ãŒã€ãŒãŸãã¯ããªã¬ãŒã«ãã£ãŠå€æŽãããããšã瀺ããŠããŸãã
ãããç¥ã£ãŠãåã®éšåããã®ããã¯ãå°ãè¯ãããããšãã§ããŸãã å€ãããã¯ã§ã¯ãèšé²å¯èœãªãã£ãŒã«ããå¿
èŠãªåœã®ã
this ããã€ã³ã¿ãŒã®æäŸã«åé¡ããããã¹ã€ãããªãã·ã§ã³ã¯true / falseã®ã¿ã§ããã æååãã³ããåãåã£ãããã¥ã¡ã³ãã«åºã¥ããŠããã®é¢æ°ã¯2ã€ã®ããŒã«å€ãåããŸãã ããããããããã¯éããããé»ãè²ãšæŠäºã®é§ãå¶åŸ¡ãããã¬ã€ã€ãŒãæ¢ã«æ¢çŽ¢ããããã¬ã€ã€ãŒãçŸåšèŠãªãé åãèŠãé ããŸãã
æ°ããïŒãŸã å°ãæ±ãïŒã以äžã«ç€ºããŸãã
#include <Windows.h> using pToggleMapFnc = void (__cdecl *)(bool bEnableBlackOverlay, bool bEnableFogOfWar); int APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) { switch (dwReason) { case DLL_PROCESS_ATTACH: { (void)DisableThreadLibraryCalls(hModule); pToggleMapFnc ToggleMap = (pToggleMapFnc)0x008AAEE0; while (!GetAsyncKeyState('0')) { if (GetAsyncKeyState('6')) { ToggleMap(true, true); } else if (GetAsyncKeyState('7')) { ToggleMap(true, false); } else if (GetAsyncKeyState('8')) { ToggleMap(false, true); } else if (GetAsyncKeyState('9')) { ToggleMap(false, false); } Sleep(10); } break; } case DLL_PROCESS_DETACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: break; } return TRUE; }
ãã©ã¡ãŒã¿ãŒã®ããŸããŸãªçµã¿åããã§é¢æ°ãåŒã³åºãããšã«ãããæ¬¡ã®åäœãååŸããããšãã§ããŸããã
True / True-æŠäºã®é§ã§ãªãŒããŒã¬ã€ãããé»
ç/åœ-é»ãéãªãããšã¯ãªããæŠäºã®é§ããããŸãã ãããäžã«ããŒã¯ã¯ãããŸããã
False / True-æŠäºã®é§ã®ãªãé»ãéãåãããŸãã 調æ»å¯Ÿè±¡ãšãªã¢ã¯åžžã«è¡šç€ºãããŸãã
False / False-é»ã®ãªãŒããŒã¬ã€ãªããé§ã®é§ãªãã ãããå
šäœã衚瀺ãããŸãã
以äžã¯ã4ã€ã®ç¶æ
ãã¹ãŠã®ã¹ã¯ãªãŒã³ã·ã§ããã§ãã




ããã¯ã¯çŽæ¥é¢æ°åŒã³åºããå®è¡ããæªç¥ã®ãã®ãæž¡ãå¿
èŠããªããããããã¯ãªãŒã³ã«ãªããŸããã æããã«ãé·ããããã°ãšãã¬ãŒã¹ãå¿
èŠãšãã以åã®ãœãªã¥ãŒã·ã§ã³ãšã¯ç°ãªããããããç°¡åãªæ¹æ³ããšèããçç±ãé¡ã£ãŠããŸãã
èšäºã®æ¬¡ã®æåŸã®éšåã§ã¯ããã®ããã¯ãå°ãã¯ãªãŒã³ã§ãããã§ãã·ã§ãã«ã«ããæ¹æ³ã«ã€ããŠèããŸãã ããã«ããããã³ã°ãæ°ããããŒãžã§ã³ã®ã²ãŒã
Extended Editionã«ç§»æ€ããããã«å¿
èŠãªãã®ãæ€èšããŸãã
ããŒã3ïŒãã¹ãŠããŸãšãã
åã®2ã€ã®ããŒãã§ã¯ãAge of Mythologyãããããã¯ã®éçºæ¹æ³ã«ã€ããŠèª¬æããŸããã ãããè¡ãã«ã¯ããããã®ç¶æ
ã®åãæ¿ããæ
åœããã²ãŒã ã®éšåïŒéããããé»ãã¬ã€ã€ãŒãé§ã®é§ãå®å
šã«å
¬éããããããïŒãèŠã€ããŠãªããŒã¹ãšã³ãžãã¢ãªã³ã°ããã²ãŒã ããã»ã¹ã«æ¿å
¥ãããDLLãéããŠãããã®é¢æ°ãåŒã³åºããŸãã ãã®çãéšåã§ã¯ãAge of Mythologyããã»ã¹ã«éçºããããã¯DLLãæ¿å
¥ãããœãŒã¹ã³ãŒãã«ã€ã³ãžã§ã¯ã¿ãŒã远å ããŠããããã¯ãçµäºããŸãã ãããã³ã°ã¯ããã«ããã¬ã€ã€ãŒã¢ãŒããå
ã®ã²ãŒã ãããã³é«åºŠãªããŒãžã§ã³ã§åäœããŸãã
ã³ãŒãã¯
githubã«æçš¿ãããŠãããéåžžã¯èª¬æã¯äžèŠã§ãã ãããããã¯DLLã¯
KeyboardProcã³ãŒã«ããã¯ããšã¯ã¹ããŒãããŸããããã¯ããŠãŒã¶ãŒãæŒããããŒïŒ7ã8ã9ã0ïŒã«å¿ããŠãããã®ç¶æ
ãåãæ¿ããããžãã¯ãå¶åŸ¡ããŸãã ã€ã³ãžã§ã¯ã¿ãŒã¯ããŒããŒãããã¯ãã²ãŒã ããã»ã¹ã«èšå®ããŸããããã«ãããããã¯DLLãã²ãŒã ããã»ã¹ã«æ¿å
¥ãããKeyboardProcã³ãŒã«ããã¯ãã¢ã¯ãã£ãã«ãªããŸãã ãã®åŸãã²ãŒã ã«éä¿¡ããããã¹ãŠã®ããŒã¹ãããŒã¯ãã€ã³ã¿ãŒã»ããããããããã®ç¶æ
ãåãæ¿ãã4ã€ã®ããŒãžã®æºæ ããã§ãã¯ããŸãã ã¹ã€ããããŒãæŒããããšãã«ãŒãã®ç¶æ
ã倿Žãã察å¿ãã颿°ãåŒã³åºãããŸãã