Opa meus amigos, boa tarde, todos bem? Espero que sim!
Eu estou com um probleminha com um código que estou trabalhando em cima, e gostaria de partilhar com vocês para ver se consigo contornar este problema.
- O projeto foi feito em x86 e ficou parado uns 3 anos +- nessa configuração, porém agora resolvi pegar esse projeto da mão de um colega alemão e tentar tocar adiante (sou um entusiasta na área de programação), mas ajustando ele para x64 e compilando normal para .exe
Me deparei com o seguinte problema adiante: em x86 no msvst é possível escrever e compilar com assembly embutido e algumas funções e sintaxes são reconhecidas ainda, porém quando vamos para o x64 não conseguimos mais escrever e compilar com o assembly embutido e algumas funções como "naked" não são mais reconhecidas.
Meu intento é continuar com o código, a única mudança proválvel seria ajusta-lo para x64.
Segue abaixo as 2 partes do código em que me encontro com o problema e junto a elas irei comentar a situaçãoa atual e meu progresso em cima delas, "arranjei" uma "solução" de forma "feia" para uma delas, me encontro receoso, já que não consegui depurar por estar ainda nas análises das linhas do código, e também gostaria (se possível) de uma ideia vinda de profissionais da área e de pessoas com maior experiência para que eu possa tornar a solução para esse problema a melhor possível e não acabar "cheio de emendas aqui e ali"..
Para este, o problema está nos assembly pushad e popad (__asm pushad, __asm popad), ainda pensando aqui se seria plausível e funcional fazer um argumento simples e chama-los, já que não consegui ver nenhuma substituição para o assembly ali do pushad e do popad.
DWORD WINAPI SendFunc(
SOCKET s,
char* buf,
int len,
int flags)
{
typedef DWORD(WINAPI * p_Send)(SOCKET s, char* buf, int len, int flags);
p_Send o_Send = reinterpret_cast<p_Send>(fake_Variable_Send);
__asm pushad
hexdump(reinterpret_cast<void*>(buf), len,true);
__asm popad
/*if (buf && len > 6 && buf[0] == 0x04 && buf[1] == 0x02 ||
buf && len >= 3 && buf[0] == 0x63 && buf[1] == 0x03)
return o_Send(s, const_cast<char*>(buf), len, flags);*/
sg = s;
return o_Send(s, const_cast<char*>(buf), len, flags);
}
Enquanto neste, o problema está primeiramente no __declspec(naked) onde a função naked não se aplica mais em x64, e posteriormente na call do __asm (assembly embutido). Bom, depurando do jeito que está ai em x86 vai que é sucesso, mas quando jogo para x64 a sequência de erro aparece, já que o msvst em compilações x64 não aceita o assembly embutido. O que eu fiz então até o momento para tentar contornar? Criei um arquivo .asm e coloquei toda o assembly embutido abaixo dentro do arquivo .asm e linkei ele no projeto (logo mais abaixo).
__declspec(naked) void CRC_Hook1()
{
__asm
{
cmp eax,0x00400A04
je FAKE
cmp eax, 0x00400A05
je FAKE2
cmp eax, 0x00400A06
je FAKE3
cmp eax, 0x00400A07
je FAKE4
cmp eax, 0x00400A00
je FAKE5
cmp eax, 0x00400A01
je FAKE6
cmp eax, 0x00400A02
je FAKE7
cmp eax, 0x00400A03
je FAKE8
lea edi, [edi + 0x00000002]
jmp CRC_1Back
FAKE:
lea eax, fake_Variable_Send
lea edi, [edi + 0x00000002]
mov dx,[eax]
jmp CRC_1Back
FAKE2:
lea eax, fake_Variable_Send
add eax,1
lea edi, [edi + 0x00000002]
mov dx, [eax]
jmp CRC_1Back
FAKE3 :
lea eax, fake_Variable_Send
add eax,2
lea edi, [edi + 0x00000002]
mov dx, [eax]
jmp CRC_1Back
FAKE4 :
lea eax, fake_Variable_Send
add eax,3
lea edi, [edi + 0x00000002]
mov dx, [eax]
jmp CRC_1Back
FAKE5 :
lea eax, fake_Variable_Recv
lea edi, [edi + 0x00000002]
mov dx, [eax]
jmp CRC_1Back
FAKE6 :
lea eax, fake_Variable_Recv
add eax, 1
lea edi, [edi + 0x00000002]
mov dx, [eax]
jmp CRC_1Back
FAKE7 :
lea eax, fake_Variable_Recv
add eax, 2
lea edi, [edi + 0x00000002]
mov dx, [eax]
jmp CRC_1Back
FAKE8 :
lea eax, fake_Variable_Recv
add eax, 3
lea edi, [edi + 0x00000002]
mov dx, [eax]
jmp CRC_1Back
}
}
arquivo.asm:
Link no projeto substituindo o __declspec(naked) void CRC_Hook1():
extern "C" int CRC_Hook1(void);