Pergunta

O Windows tem a capacidade de aplicar calços para aplicativos com mau comportamento.Shims são usados ​​para interceptar chamadas de API e alterá-las.Por exemplo, calços podem ser usados ​​para:

  • alterar os parâmetros de entrada
  • mentir sobre os valores de retorno
  • mude para chamar outra coisa

O Kit de ferramentas de compatibilidade de aplicativos tem alguns calços existentes que você pode aplicar ao seu próprio aplicativo com mau comportamento.Aqui está um exemplo que ignora sua chamada de API e, em vez disso, chama uma API completamente diferente:

alt text

preciso de um calço que não seja um dos centenas de calços que a Microsoft já escreveu. preciso de um calço personalizado.

No meu caso, quero interceptar chamadas para:

GetSystemMetrics(0x1000)

para que ele retorne 0.não consigo encontrar nenhuma informação sobre como fornecer ao Windows minha própria DLL que terá a correção necessária.eu nem sei se você pode crie calços personalizados.

O Windows oferece suporte a correções personalizadas?

Foi útil?

Solução

Não tenho conhecimento de nenhuma maneira de alguém que não seja a Microsoft implementar um shim appcompat.

Você pode querer investigar Desvios, ele poderá fornecer a funcionalidade desejada.

Outras dicas

Você tem que pensar nisso do ponto de vista de Raymond Chen.Imagine se fosse possível que alguém que não fosse a Microsoft escrevesse correções de compatibilidade.Então, sempre que a Microsoft fizer uma alteração significativa, além de todos os outros trabalhos de compatibilidade, eles também terão que escrever correções para as correções de terceiros que fizeram a coisa errada.Manter a compatibilidade com versões anteriores já é bastante difícil.

É possível, mas requer algum trabalho.

Você gera o aplicativo usando seu próprio programa inicializador que aplicará o calço.Você faz isso permitindo que seu inicializador crie o processo com privilégios suficientes para editar sua memória.A maioria das funções da API começa com um nop de dois bytes precedido por mais nops.Você pode transformar o nop de dois bytes em um salto curto e os nops anteriores em um salto longo, onde quer que você queira ir.

Uma solução alternativa que usei no passado é carregar o executável como uma DLL, mas isso pode causar mais trabalho, dependendo de quão meticuloso é o aplicativo.Na minha situação tive que carregar o executável como uma DLL somente de dados e fazer todas as minhas próprias importações, mas infelizmente a solução anterior não era uma opção para mim.

Certa vez, também escrevi uma DLL de conexão que usa princípios semelhantes, mas isso é apenas uma opção se você puder modificar a fonte para carregar a DLL ou se o processo suportar plug-ins de DLL.

você sempre pode usar engenharia reversa para consertar :), deixe-me saber se precisar de ajuda com isso

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top