Pergunta

Uma vez que eu não encontrei uma resposta à pergunta feita anteriormente aqui Eu estou tentando uma abordagem diferente.

Existe alguma maneira de memória compartilhada entre dois processos?

O segundo processo obtém a informação a partir de uma injeção uma vez que é um programa legado que ele não está sendo suportado mais.

A minha ideia é injetar algum código lá, no struct que eu estou passando para o programa injetado passar o endereço (ou qualquer outro) para a memória do compartilhamento onde os dados que eu preciso para executar está localizado. Assim que eu receber os dados que irá preencher as minhas variáveis ??dentro do fio injetado.

Isso é possível? Como?

Código é apreciado.

EDIT:

Eu acho que não é claro que eu vou esclarecer. Eu sei como injetar. Estou fazendo isso já. A questão aqui é para transmitir dados dinâmico para a injeção.

Foi útil?

Solução

Você pode tentar um de memória mapeada arquivo .

Este dá um pouco mais o passo-a-passo detalhes.

Outras dicas

Embora Windows suporta memória compartilhada através de seu arquivo de mapeamento de API , você não pode facilmente injetar um mapeamento de memória compartilhada em outro processo diretamente, como MapViewOfFileEx não leva um argumento de processo.

No entanto, você pode injetar alguns dados através da atribuição de memória em outro processo usando VirtualAllocEx e WriteProcessMemory . Se você fosse para copiar em uma alça usando DuplicateHandle , em seguida, injetar um esboço que chama MapViewOfFileEx , você poderia estabelecer um mapeamento de memória compartilhada em outro processo. Já que parece que você estará injetando código de qualquer maneira, isso deve funcionar bem para você.

Para resumir, você vai precisar:

  • Criar um anônimo memória compartilhada alça segmento chamando CreateFileMapping com INVALID_HANDLE_VALUE para hFile e NULL para lpName.
  • Copiar esse identificador para o processo de destino com DuplicateHandle
  • Alocar alguma memória para o código usando VirtualAllocEx , com flAllocationType = MEM_COMMIT | MEM_RESERVE e flProtect = PAGE_EXECUTE_READWRITE
  • Escreva o seu código de stub para essa memória, usando WriteProcessMemory . Este esboço provavelmente terá de ser escrito em assembler. Passar o identificador de DuplicateHandle por escrevê-lo aqui em algum lugar.
  • Executar seu esboço usando CreateRemoteThread . O stub deve então usar a lidar com isso conseguiu chamar MapViewOfFileEx . Os processos terá, então, um segmento de memória comum compartilhada.

Você pode achar que é um pouco mais fácil se seu esboço de cargas uma biblioteca externa - isto é, tem que simplesmente chamar LoadLibrary (encontrar o endereço do LoadLibrary é deixado como um exercício para o leitor) e fazer o seu trabalho de entrada DllMain da biblioteca ponto. Neste caso, usando a memória compartilhada chamada é provável que seja mais simples do que futzing redor com DuplicateHandle. Consulte o artigo MSDN sobre CreateFileMapping para mais detalhes, mas, essencialmente, passar INVALID_HANDLE_VALUE para hFile e um nome para lpName.

Editar :. Desde que seu problema é passar dados e não injeção de código real, aqui estão algumas opções

  1. Use de tamanho variável de memória compartilhada. Seu esboço obtém o tamanho e qualquer nome ou um identificador para a memória compartilhada. Isto é apropriado se você só precisa trocar dados uma vez. Note que o tamanho de um segmento de memória compartilhada não pode ser facilmente alterado após a criação.
  2. Use a pipe nomeado . Seu esboço obtém o nome ou um identificador para o pipe. então você pode usar um protocolo apropriado para blocos de tamanho variável de câmbio - por exemplo, escrever uma size_t para o comprimento, seguido da mensagem real. Ou use PIPE_TYPE_MESSAGE e PIPE_READMODE_MESSAGE, e relógio para ERROR_MORE_DATA para determinar onde messages terminar. Isto é apropriado se você precisa trocar dados várias vezes.

Editar 2 : Aqui está um esboço de como você pode implementar alça ou armazenamento ponteiro para seu esboço:

.db B8            ;; mov eax, imm32
.dl handle_value  ;; fill this in (located at the start of the image + one byte)
;; handle value is now in eax, do with it as you will
;; more code follows...

Você também pode apenas usar um nome fixo, que é provavelmente mais simples.

Você tentou tubos de uso (por memória) ou mesmo a serialização (para seus objetos)? Você pode usar arquivos para gerenciar a memória entre processos. Sockets também são bons para obter a comunicação entre processos.

mapeamento de memória é o caminho a percorrer, você não precisa mesmo de criar um espaço de memória permanente, o setor de memória sai do escopo quando todos os processos de compartilhamento que são desligamento. Há outras maneiras também. Uma maneira rápida e suja de passar dados de um aplicativo C para outro é apenas para usar o sistema operacional. Ao comando tipo de linha app1 | app2. Este causas app2 a ser o destino de app1 de saída ou iow um comando printf do app1 iria enviá-lo para app2 (isso é chamado de tubulação).

Você pode tentar usar Boost.Interprocess para a comunicação entre dois processos. Mas ao código injetar, um software não suportado anteriormente existente, você provavelmente vai ter de usar @ maneira de bdonlan usando WriteProcessMemory .

Se você está falando sobre o Windows, o obstáculo principal é que os processos de cada um viver em seu próprio espaço de endereço virtual. Você infelizmente não pode passar endereços de memória normal em torno de processo para processo e obter os resultados que você esperaria. (Threads, por outro lado, todos vivem no mesmo espaço de endereço, que é por tópicos pode ver a memória da mesma maneira.)

Windows, no entanto, tem um espaço de memória compartilhada que você tem que ter muito cuidado para gerenciar corretamente. Qualquer processo que Aloca espaço no espaço de memória compartilhada é responsável por liberar a memória explicitamente. Isso está em contraste com a memória local, que mais ou menos desaparece quando as matrizes do processo.

este artigo amostra MSDN para algumas idéias sobre como você pode usar o espaço de memória compartilhada para dominar o mundo. Er, interface com software legado. Ou o que quer :) Boa sorte tudo o que você acaba fazendo!

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