Escolar Documentos
Profissional Documentos
Cultura Documentos
modelo
Compensações
0xC2A037 - UNKNOWN
0xCE4CFC 2.0.8
0xCE6CA4 2.0.12
if(dwSz == 7095808) dwOffset = 0xC4ADFF; // 2.1 (and build 6729)
if(dwSz == 7096320) dwOffset = 0xC4AE3F; // 2.1.1
if(dwSz == 7105024) dwOffset = 0xC4CEEF; // 2.1.2
if(dwSz == 7107584) dwOffset = 0xC4DF97; // 2.1.3
if(dwSz == 7841280) dwOffset = 0xCC0A44; // 2.2.0
if(dwSz == 7844352) dwOffset = 0x622647; // 2.2.2
if(dwSz == 7837184) dwOffset = 0x621CD7; // 2.2.3
Explicação
A correção de edição de modelo funciona desabilitando a verificação de assinatura feita em
arquivos MPQ, isso permite que um usuário substitua seus próprios MPQs no lugar dos originais
da Blizzard sem que o jogo rejeite o arquivo.
Há dois pedaços de código usados para verificar se os dados MPQ são consistentes. (Eles podem
ser encontrados simplesmente executando uma pesquisa de string no IDA para obter as
informações relevantes, neste caso, erros sobre o arquivo de assinatura.)
Sub-rotina 1:
.text:00402060 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
.text:00402060
.text:00402060
.text:00402060
.text:00402060
.text:004020AB
.text:004020B1 push 4
.text:0040210B
.text:00402169
.text:004021AA
.text:004021E0
.text:004021EF jz loc_402287
.text:00621CC0
.text:00621CC0
.text:00621CD6 push 0
.text:00621CF3
.text:00621D1C
.text:00621D42
.text:00621D4C retn
.text:00621D4C
.text:00621D4C ; ----------------------------------------------------------------------
-----
Uma coisa importante que podemos notar dessas duas sub-rotinas é que ambas estão chamando
essas duas sub-rotinas relevantes.
Sub-rotina 1:
.text:00625DD0 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
.text:00625DD0
.text:00625DD0
.text:00625DD0
.text:00625DD0
.text:00625DF9
.text:00625E0C ; ----------------------------------------------------------------------
-----
.text:00625E0C
.text:00625E3E ; ----------------------------------------------------------------------
-----
.text:00625E3E
.text:00625E3E ; sub_625DD0+56�j
.text:00625E4D
.text:00625EB7
.text:00625EF8
.text:00625F47
.text:00625F64
.text:00625F86
.text:00625FA5
.text:00625FCC
.text:00626081 jz loc_62615A
.text:0062608A jz loc_62615A
.text:006260A6
.text:006260AB
.text:006260C9 ; ----------------------------------------------------------------------
-----
.text:006260C9
.text:006260E9 ; ----------------------------------------------------------------------
-----
.text:006260E9
.text:00626109 ; ----------------------------------------------------------------------
-----
.text:00626109
.text:00626110 ; ----------------------------------------------------------------------
-----
.text:00626110
.text:00626130 ; ----------------------------------------------------------------------
-----
.text:00626130
.text:00626152
.text:00626152 loc_626152: ; CODE XREF: sub_625DD0+2F4�j
.text:0062615A
.text:0062615A ; sub_625DD0+2BA�j
.text:00626172
.text:00626189 ; ----------------------------------------------------------------------
-----
.text:00626189
.text:00626189 loc_626189: ; CODE XREF: sub_625DD0+397�j
.text:00626192
.text:006261A7
.text:00626200 ; ----------------------------------------------------------------------
-----
.text:00626200
.text:00626202
.text:00626227
.text:00626265
.text:006262AF push 1
.text:006262CC
.text:006262D1
.text:006262FC ; ----------------------------------------------------------------------
-----
.text:006262FC
.text:00626349 ; ----------------------------------------------------------------------
-----
.text:00626349
.text:00626383 ; ----------------------------------------------------------------------
-----
.text:00626383
.text:00626383 loc_626383: ; CODE XREF: sub_625DD0+533�j
.text:006263C4 ; ----------------------------------------------------------------------
-----
.text:006263C4
.text:006263F1
.text:006263F6
.text:006263F6 ; sub_625DD0+5F2�j
.text:00626428 ; ----------------------------------------------------------------------
-----
.text:00626428
.text:00626428 loc_626428: ; CODE XREF: sub_625DD0+648�j
.text:0062642E
.text:0062643D
.text:0062643F
.text:00626448
.text:00626460
.text:00626460 loc_626460: ; CODE XREF: sub_625DD0+689�j
.text:0062647C ; ----------------------------------------------------------------------
-----
.text:0062647C
.text:0062647C ; sub_625DD0+685�j
.text:0062649F
.text:006264A1
.text:006264A1 ; sub_625DD0+6CD�j
.text:006264C1 ; ----------------------------------------------------------------------
-----
.text:006264C1
.text:006264E0
.text:006264E7 ; ----------------------------------------------------------------------
-----
.text:006264E7
.text:006264EF push 1
.text:00626526
.text:00626526 ; sub_625DD0+748�j
.text:00626533
.text:00626535
.text:00626543 ; .data:00B43418�o
.text:0062654B
.text:0062654B ; ----------------------------------------------------------------------
-----
.text:00625B00
.text:00625B00
.text:00625B00
.text:00625B00
.text:00625B0C retn 4
.text:00625B0C sub_625B00 endp
.text:00625B0C
.text:00625B0C ; ----------------------------------------------------------------------
-----
Antes do patch v2.2 não existia a segunda sub-rotina, apenas a primeira. Podemos (espero) ver na
primeira sub-rotina que ela é usada para comparar uma determinada variável com 0, então agir
com base nisso.
Antes do 'nerf', poderíamos simplesmente definir essa variável para o que quiséssemos, exceto 0, e
a verificação de assinatura seria desabilitada. Desde o patch v2.2, outra sub-rotina foi adicionada
ao WoW.exe (a segunda). Podemos ver pelo código que ele retira um valor da pilha e define a
variável mencionada com o valor que ela tirou da pilha. Quando rastreamos de onde ela foi
chamada (nas duas sub-rotinas originais), podemos ver que 0 é colocado na pilha antes da sub-
rotina ser chamada, isso significa que a variável está sendo redefinida para 0 toda vez que essa
sub-rotina é chamado.
Por causa disso, não podemos mais simplesmente alterar o valor da variável, porque ela
simplesmente será redefinida se tentarmos, então temos que tentar uma abordagem diferente. O
método que eu criei foi mudar o valor colocado na pilha para que a sub-rotina sobrescrevesse a
variável com nosso próprio número arbitrário em vez do 0 como pretendido. Isso significa que
alteramos isso:
.text:00621CD6 push 0
Nisso:
.text:00621CD6 push 1
Isso efetivamente permite a edição do modelo novamente, mas com um pequeno obstáculo, ele
não passa na verificação de consistência. Como modificamos o segmento de texto do WoW.exe em
vez do segmento de dados, como fizemos anteriormente na v2.2, o WoW percebeu como
modificar e não nos permite fazer login. Para contornar isso, devemos habilitar e desabilitar o
corrigir no momento apropriado para contornar esse incômodo (que se torna um incômodo em si).
Existem algumas maneiras de contornar isso teoricamente (graças a Greyman por algumas ótimas
ideias sobre isso): Método 1: Hook eventos e habilitar/desabilitar o patch nos momentos
certos. Isso exigiria que uma DLL fosse injetada no WoW que monitora eventos para ver o que o
WoW está fazendo para que ele possa agir com base nisso, um grande problema com isso é que o
Warden procura um comportamento como esse e seria difícil codificar uma maneira não detectada
, e uma vez lançado ao público, provavelmente seria corrigido por medo de que o mesmo método
fosse usado para fins mais nefastos, como bots/hacking/etc.
Método 2: Desative a verificação de consistência. Isso seria muito fácil de codificar, mas,
novamente, o problema seria o diretor. Warden provavelmente estaria atento a mudanças na rotina
de consistência.
Método 3: Altere os valores de consistência. Dessa forma, poderíamos alterar os hashes do arquivo
para que fosse um mod apenas de dados, dessa forma Warden provavelmente não estaria
atento. O problema com isso é que o usuário teria que inserir os próprios hashes para serem
gravados na memória, o que seria uma dor ainda maior do que simplesmente ativar/desativar a
correção manualmente.
Bem, se houver algo que você não entenda, sinta-se à vontade para perguntar. Além disso, estou
aberto a sugestões sobre como melhorar meu método. Postado abaixo está o código-fonte da
minha correção de edição de modelo.
#include <Windows.h>
#include <cstdio>
STARTUPINFO sInfo;
PROCESS_INFORMATION pInfo;
ZeroMemory(&sInfo, sizeof(sInfo));
sInfo.cb = sizeof(sInfo);
ZeroMemory(&pInfo, sizeof(pInfo));
puts("Once WoW has finished loading fully please press END then
log in.\r");
while (true) {
if (Enabled) {
while (true) {
if (GetAsyncKeyState(VK_END)&1) {
WriteProcessMemory(pInfo.hProcess,
(LPVOID)dwOffset, &bDisable, sizeof(bDisable), NULL);
puts("Patch disabled");
Enabled = false;
break;
Sleep(1);
} else {
while (true) {
if (GetAsyncKeyState(VK_HOME)&1) {
WriteProcessMemory(pInfo.hProcess,
(LPVOID)dwOffset, &bEnable, sizeof(bEnable), NULL);
puts("Patch enabled");
Enabled = true;
break;
Sleep(1);
}
Sleep(1);
CloseHandle(pInfo.hProcess);
CloseHandle(pInfo.hThread);