Várias sessões de rdp no Windows. Corrigindo falhas de RDP com a RDP Wrapper Library

Para corrigir novas versões (se a lógica da seção correspondente do código não mudou significativamente), você precisa fazer o seguinte:

0. A instrução é adequada para especialistas mais ou menos educados e, o mais importante, inteligentes que sabem pensar. Aqueles que estão acostumados a “copiar” tudo por Copiar / Colar, ao que parece, não vão aguentar e farão “gemidos” e “lamentações” de que “há muitas letras”, “difícil” ou “nIASIL” devido a mais medos e estereótipos de pensamento, em vez da complexidade do problema. Este é o seu destino. Nascido para engatinhar, como você sabe, não pode voar. Não se deixe secar, Anon! Beba Jada ou faça o TRABALHO e comece a se respeitar!

1. Baixe qualquer - pago ou versão gratuita Hiew
Mesmo as versões muito antigas dos anos 90 são adequadas, mas se você precisar corrigir o x64, precisará do 8.x (a partir de meados dos anos 2000 :)) Melhor, é claro, fazer um novo. O autor desenvolve o produto há 25 anos e existem poucas outras criações tão perfeitas da habilidade de um programador.

2. Obtenha o arquivo termsrv.dll de uma determinada versão com suporte - a versão original e corrigida. Se ele não tiver um patch, é razoável supor que você precisa corrigi-lo com o patcher existente, não seja estúpido! Comece a pensar! Tudo arquivos requeridos coloque em uma pasta ou pastas separadas. Não tente editar nada em uma única cópia no system32. Ao mesmo tempo, NADA SAIRÁ (a entrada está trancada no system32) e só os carneiros fazem isso.

3. Compare as versões com e sem patch da mesma dll com qualquer comparador binário. O kit do Windows inclui o utilitário do console FC. O comando “FC / b termsrv.org termsrv.crk> diferenças.txt” leva ao lucro. A lista de diferenças, ali pequena, com cerca de 20 linhas, será enviada para o arquivo diferenças.txt
Abrindo o arquivo editor de texto e, ou o deixamos aberto, ou o reescrevemos em um pedaço de papel do qual e por qual deslocamento os bytes mudaram. Imediatamente nos aprofundamos e entendemos que todos os offsets e valores de byte, como abaixo em Hiew, são especificados em sistema hexadecimal, mas isso não deve “assustar” ninguém, porque nada será necessário para converter para decimal! (Se você precisar repentinamente, para desenvolvimento geral - uma calculadora do Windows para ajudar.)

Na lista, vemos (identificamos) 3 blocos condicionais, onde os endereços vão em uma linha. O primeiro bloco tem 2 bytes no início do exe, nos deslocamentos 140-s-something-h (dll tem o mesmo formato que exe, a única diferença é que contém apenas procedimentos e funções para uma chamada externa - o so -called.., portanto, não será possível executá-lo diretamente renomeando-o em exe). Estes são os dados quando o deslocamento vai para o cabeçalho do arquivo exe. Esses offsets armazenam verificar soma dados de código (sem cabeçalho), que o Windows verifica antes de iniciar, certificando-se de que o arquivo não foi danificado e que algo não irá travar, respectivamente, ao tentar executá-lo. Voltaremos a eles mais tarde.
Isso é seguido por um bloco de alterações de aproximadamente 10 bytes. É exatamente isso que estudaremos. Depois disso, há mais um bloco de alterações - os 6 bytes mais recentes do exe-shnik. O resultado final é que, em vez de "zeros", o autor dirigiu seu conhecido nome "deepxw" para o espaço vazio no final. Faça uma reverência a ele pelo patch e pela ideia, mas não há razão para repetirmos suas “delícias” ao transferir o patch, portanto, quem não tem nada para fazer nas longas noites de inverno pode fazê-lo sozinho como parte do estudo “Dirigindo letras comuns em espaços vazios de arquivos exe usando Hiew”. Porém, pode ser percebido como uma homenagem ao autor (só “ali” ninguém lê).

3. Abra dll original em uma janela Hiew, corrigido na outra (execute 2 cópias de Hiew! Em geral, é muito mais conveniente usar Far - dois dispositivos, como um gerenciador de arquivos e uma base para iniciar "estes seus" Hiews). Em ambos, pressione F4 (Modo) e selecione Decodificar (F3). Veremos a peça desmontada do arquivo desde o início. Não há nada para assistir, porque Hiew "tenta" desmontar o cabeçalho Arquivo EXE, e isso são dados, não código. Não precisa ficar olhando ali, ele mostra que é completamente normal, porque aqui você tem que PENSAR, não “copiar”! Mais uma vez, nos reunimos e começamos a pensar, não há necessidade de tentar estupidamente e seguir literalmente as instruções ...

4. Em ambos os Hiews (por sua vez, droga, pense ...) pressione F5 (Goto) e veja que um campo de entrada apareceu no topo. Lá nós dirigimos no endereço da primeira diferença (do SEGUNDO BLOCO!) Encontrado no arquivo de diferença. POR EXEMPLO, em Win7SP1x86Rus são endereços por volta de 19100h, e em VistaSP2Eng (x86 ou x64 - xs), como vi no blog do autor, são endereços por volta de 65200h. Chegamos ao local do primeiro byte corrigido.

Os dados nesta janela Hiew se parecem com:
- Na primeira coluna - deslocamento hexadecimal - desde o início do arquivo, ou na memória do processo - depende do modo Hiew, selecionado por Alt-F1 (Global-Local). Mostra Local = como na memória por padrão se Hiew consegue descobrir o formato do código de dados. Em nosso caso, isso não é um problema porque o formato de arquivo exe permite que ele “descubra” facilmente. Portanto, você não precisa se assustar ao ver 06F2F8D51 lá em vez de 19153. O endereçamento de memória é importante para entender o endereçamento do processo, como ele será na execução ou para analisar o código, se necessário.
- A segunda coluna contém a representação hexadecimal do código de dados com a análise de qual código e quais dados se referem a qual instrução. Portanto, cada linha tem um comprimento diferente. Apresentado como tal apenas para sua conveniência. “Na verdade” (C) no próprio arquivo, eles são todos “costurados” juntos, em uma linha, que você pode contemplar na visualização “simples” de dados hexadecimais (F4-> Hex), onde bytes hexadecimais separados por espaços estão "estupidamente" à esquerda e à direita - "krakozyabry" da tabela ASCII, que correspondem a esses bytes - como em "qualquer" "bom e velho" editor hexadecimal como WinHex, cujas capturas de tela você viu em "qualquer Site "" kulkhatskiy ". Trabalhamos com os mesmos bytes o tempo todo, como o próprio computador faz. A questão está unicamente em sua apresentação e interpretação. Quando você copia um arquivo executável de disco para disco, são TODOS OS DADOS e SEM CÓDIGO, porque ninguém está executando nada. Mas vale a pena dizer ao Windows que este é um arquivo executável, inicie-o, pois o Windows o analisa em código e dados e executa apenas o código de um local pré-determinado pelo padrão e o cabeçalho, após o qual o próprio código, executado pelo processador , é analisado posteriormente em sua estrutura e é dividido novamente em código e dados e assim por diante.
No modo F4-> Decodificar, em vez de "krakozyabr", ele nos mostra bytes e "significado verdadeiro".
- Na terceira (direita) e maior coluna (mais precisamente, algumas colunas), é mostrado um pedaço de código desmontado - texto, o assim chamado. Representação "mnemônica" desse mesmo código (linguagem assembly), destinada a qualquer percepção simplificada e compreensível do "Homo sapiens", com seu maravilhoso pensamento associativo analógico, que é extremamente difícil de perceber sequências de código "nuas" abstratas.

5. Tendo completado a transição para o deslocamento desejado no parágrafo anterior, vemos que o cursor (este cinza :)) aponta para o início de um comando de 6 bytes (pode haver mais bytes em x64) à direita de em que a instrução TIPO cmp eax é "desmontada",
se pegarmos uma linha acima e um pouco abaixo, então a construção TYPE sairá:
mov eax,
cmp eax,
jz .06F30B25E
empurre edi
empurre 020
ligue para .06F2E1440
pop ecx
Para entender esta construção, você não precisa ser um "expert em assembler", embora seja recomendado ter pelo menos conhecimento básico de "programação em qualquer linguagem". Mas o conhecimento da língua inglesa não atrapalha de forma alguma!

A primeira instrução (que não é corrigida de nenhuma forma, é "acima da primeira diferença") é chamada mov - que, desculpe, a primeira associação vem à mente da língua inglesa? - correto - mover - ou seja, mover. Os argumentos para a instrução aparecem em uma segunda “sub-coluna”. EAX e EDI são assim chamados. Registradores de 32 bits são células de memória únicas no próprio processo, projetadas para armazenar dados durante seu processamento. Quase todos os registradores são do mesmo tipo, teoricamente você pode escrever qualquer coisa lá, apenas para caber, mas alguns deles são tradicionalmente usados ​​para armazenar dados de certos tipos (para não se confundir), por exemplo, EAX, EBX, ECX , EDX são usados ​​diretamente para “dados do usuário”, além disso, ECX tradicionalmente funciona como um contador (por exemplo, ciclos), e ESI, EDI - como ponteiros para uma determinada posição atual na memória, endereços com os quais trabalhar. E alguns dos registros são dependentes de hardware e é melhor não tocá-los - por exemplo, o registro IP contém automaticamente o endereço instrução atual, que é executado pelo processador, e se você tentar escrever alguns de seus dados lá - uma variável de seu programa, então a porcentagem irá estupidamente para a instrução com este endereço e tudo irá travar. ESP - aponta para a pilha - uma espécie de “garrafa”, na qual o primeiro a subir, será o último a sair (Fist In Last Out), destinada ao armazenamento temporário de dados que não cabem em registros, mas não adianta colocá-los de volta na memória, se eles serão usados ​​em breve. Para trabalhar com dados, geralmente um byte - 8 bits, uma palavra - 16 bits, uma palavra longa - 32 bits ou uma palavra longa dupla de 64 bits (para processadores de 64 bits) são colocados da memória em um registro. Para trabalhar com dados curtos, você pode acessar partes do registro (por exemplo, eax consiste em ax - os 16 bits inferiores e ah e al - partes do próprio ax), mas isso está além do nosso problema. Em seguida, algum tipo de esteira de transformação é feita com os dados do registro, após a qual o resultado é colocado de volta na memória - na mesma ou em outra célula ou qualquer outra alocada pelo autor (ou seu compilador) do programa para os respectivos fins .

Os endereços são indicados entre colchetes. Se você precisar obter DADOS de uma célula de memória em algum endereço, e não o endereço em si, simplesmente escreva o endereço entre colchetes. O projeto TYPE significa que os dados devem ser retirados de uma célula de memória com um endereço, cujo valor é obtido pela adição do valor no registro ESI + 324h. É costume escrever em Assembler de forma mais clara, mas foi mais conveniente para o autor de Hiew mostrar isso dessa forma, talvez para maior clareza. Ao inserir comandos, Hiew aceita perfeitamente construções de tipo padrão, como mostrado abaixo.

No total, entendemos que esta instrução pega dados (4 bytes = 32 bits) no endereço e os coloca no registrador EAX. A próxima instrução ((que já está sendo corrigida) é o CMP. A primeira coisa que vem à mente para um despreocupado e diligentemente estudando inglês na escola é comparar. É sobre comparação. Caso contrário, tudo é igual ao da instrução anterior O endereço é apenas adjacente.
cmp eax,
compara o conteúdo do registrador eax e a localização da memória por endereço. No registrador eax, a instrução anterior retirou um número de uma célula adjacente. Agora ele é comparado ao número na célula. O que é tão difícil, desculpe ??? Você pode ensinar um carneiro! Isso certamente é mais fácil do que objetos de "muitos quilômetros" de algum tipo de merda, puxando milhares de propriedades nas quais você pode se afogar ...
E quanto ao resultado? Compare comparado, então de que adianta, o leitor atento perguntará ... Como você sabe onde o cachorro vasculhou? E o resultado é armazenado no registrador especial de sinalizadores. Neste registro reservado, cada bit significa uma bandeira. Em particular, há um sinalizador zero - Zero. Se, como resultado da execução da instrução de comparação, os números forem iguais, a caixa de seleção será ativada (1), caso contrário, será desmarcada (0) (ou, pelo contrário, com preguiça de veja com um depurador - não importa aqui). Da mesma forma, há outra caixa de seleção para mais-menos - Assinar. Os sinalizadores mudam como resultado da execução das instruções que os alteram e permanecerão em suas posições até que sejam alterados como resultado da execução de outra instrução afetando seu estado. Portanto, após cmp, podemos executar quaisquer outras instruções dependendo do estado da caixa de seleção até executarmos aquela que a altera. O estado dos sinalizadores é lido pelas instruções de desvio condicional e algumas outras, e o resultado é alguma ação ou inação dessas instruções.

A próxima instrução vai
jz .06F30B25E
As instruções que começam com J [quase] significam Jump. movendo-se para outro lugar. Esta instrução refere-se a instruções de salto condicional e significa Jump if Zero - ou seja, pule para o endereço, se a caixa de seleção Zero estiver selecionada. Se a caixa NÃO estiver marcada, “nada acontecerá”. Como argumento, o endereço do salto é dado (eles podem ser diferentes, relativos ou absolutos, “longe” ou “próximos” na memória. Aqui o endereço é especificado no espaço de endereço do programa, conforme configurado pelo cabeçalho exe, não faz sentido se aprofundar nele, isso só vai complicar tudo. a instrução anterior revelou igualdade de argumentos, então a transição ocorrerá, se não, então não acontecerá e o processador passará para a próxima instrução .

Próximas 2 instruções
empurre edi
empurre 020
Lembramos que em inglês empurrar significa empurrar, empurrar. Aqui, significa colocar números na pilha para armazenamento temporário. Freqüentemente, as variáveis ​​são armazenadas desta forma antes de entrar nos procedimentos, olhando dentro de um registro de procedimento pode ser usado para outros propósitos, e usando a pilha, você pode salvar valores de registro e passar argumentos para um procedimento que os tirará de lá depois de inseri-lo e enviar os resultados para lá antes de sair, se necessário. A conveniência é que você não precisa se preocupar em alocar espaço de endereço para armazenar dados temporários significativos. Se você precisa passar um array, você só precisa passar seu endereço na memória. Não há razão para transferir todos os elementos do array, ele apenas engolirá inutilmente a memória e o tempo do processador, como é feito no caso de redlocking. (Quando é necessário preservar a cópia original do array de acordo com a lógica de trabalho, esta é uma situação diferente e o próprio programador deliberadamente inicia a cópia do array para fins de replicação.)
Ao trabalhar com pilha, o percentual cuidará de tudo - a área de armazenamento da pilha é alocada pelo sistema operacional com suporte de hardware para o processador.
A primeira instrução salvará o valor do registrador EDI - um ponteiro para uma certa área da memória, e a segunda irá empurrar a constante predefinida 20h para lá. Provavelmente algum argumento do procedimento, mas não importa para nós porque não há necessidade de fazer a análise que o autor do patch fez - estamos transferindo o patch finalizado para outra versão do programa e isso geralmente é SIMPLES !

Próxima instrução
ligue para .06F2E1440
Em inglês, ligar significa ligar, ligar.
É sobre chamar um procedimento. Não há nomes no código de chamada de procedimento - há endereços onde seu código está localizado. Por conveniência, desmontadores (incluindo Hiew) podem extrair os nomes de procedimentos e funções das tabelas de importação e exportação de arquivos exe programas diferentes e "bibliotecas" após a compilação e os procedimentos recebem nomes pelos quais podem ser chamados de outro programa, mas os procedimentos internos não são nomeados após a compilação). Nos códigos-fonte, é claro, havia nomes, mas depois da compilação eles são inúteis ... Apenas eles ocupariam espaço. O processador não precisa saber os nomes de alguém, ele conta os números ... Às vezes, os descompiladores / desmontadores conseguem extrair os nomes dos procedimentos das informações de depuração (se o próximo codificador esqueceu de cortá-lo e inflou o tamanho do binário com informações inúteis) e isso ajuda na análise do código, mas no nosso caso nem mesmo nos importamos. Não precisamos entender por que esse procedimento é necessário e o que ele faz ... Lembro a vocês que temos um patch pronto e se conseguirmos transferi-lo "sem incidentes", então não será necessário aprofundá-lo .

A última instrução dada
pop ecx
Pop - a ação é o oposto de push - ou seja, pop o último valor colocado na pilha. DENTRO este caso no registrador ecx. Provavelmente esta instrução é necessária para extrair o resultado do procedimento, mas não nos importamos, incl. e porque esta instrução, como o 2 push-a acima e call, não muda após o patch e é fornecida para uma apresentação geral e como uma referência de borda do patch. Após o patch, todas essas instruções permanecerão no lugar, como tudo depois delas.

6. Agora, pegamos o arquivo termsrv.dll corrigido em outra janela Hiew, e olhamos as instruções no mesmo endereço.
mov eax,
mov eax, 000000100
nop
mov, eax
empurre edi
empurre 020
ligue para .06F2E1440
pop ecx
As diferenças são visíveis apenas na segunda, terceira e quarta instruções.
Segundo mov eax, 000000100
basta escrever a constante 100h (= 256) no registrador eax
Terceiro nop
o “mais engraçado” = NoOperation - não faz nada e para todo o sempre. Por que é necessário? E é necessário alinhar a sincronização com o código de dados. O ponto é que os tamanhos do código original e corrigido devem coincidir completamente no número de bytes e no limite do comando (junto com seus argumentos). Se algo mover pelo menos um byte, o processador ficará “no lugar errado”, perceberá um determinado argumento de instrução como um comando e os bytes seguintes - como argumentos deste comando, mesmo que haja um código de comando diferente. Tudo sairá imediata e fatalmente. 99% de que o programa irá travar com um erro fatal. O comando nop é o código 90h e ocupa um byte. Se houver código redundante que não seja necessário ou mesmo prejudicial para os propósitos do patch, ele pode ser substituído, junto com os argumentos, por tantos nops consecutivos quantos bytes. Entre os hackers, isso é chamado de latido ou bogging. Na verdade, esta é a única maneira de remover código desnecessário do código executável, porque não é texto e qualquer "corte do meio" "para fins de encurtamento" levará imediatamente ao fato de que todos os endereços serão deslocados, comido e nada vai funcionar. E o “pior” acontece quando o novo código, que precisa substituir o antigo, não cabe no lugar “antigo” ... É aí que começa a dor de cabeça do hacker - como encolhê-lo para caber ...
4º mov, eax
coloque o número do registrador eax em um local da memória
Em princípio, a terceira e a quarta ou a terceira e a segunda instruções podem ser trocadas - isso não mudará nada. Mas você não pode remover o nop de forma alguma, porque os novos comandos têm 1 byte a menos no comprimento do código do que os antigos, e tal discrepância, se não for interrompida com nop, levará imediatamente a uma falha de sincronização.

A comparação “com o que era” imediatamente coloca tudo em seu lugar!
Era - pegue um número de uma célula, compare-o com um número de uma célula. Se for igual, "algum lugar" para pular, se não, vá mais longe e execute o procedimento. No contexto da tarefa, assemelha-se a esta comparação do número de conexões válidas com o limite de conexões válidas (ou seja, 1 para posto de trabalho ou 2 para o servidor). O limite é armazenado em algum tipo de constante, cujo endereço é especificado na instrução de comparação.
O que se tornou - pegue um número de uma célula, marque "este negócio" e substitua imediatamente o valor do registro EAX com a constante 100h (= 256 - isto é, aparentemente, o novo limite de 256 conexões) e, em seguida, coloque este número no celular
Ninguém compara nada, o procedimento que se chama a seguir sempre será executado. Além disso, um novo limite = 256 é escrito na célula onde o limite de conexão foi obviamente armazenado “forçosamente” no caso de haver outras verificações desse limite em alguma outra parte do programa. ISSO É TUDO! É difícil pensar em algo mais primitivo!

Se tivéssemos que procurar esse lugar nós mesmos, teríamos que rastrear os procedimentos dessa dll com o depurador, como o autor do patch obviamente fez, ou desmontar tudo com algo como IDA e estudar cuidadosamente o código que contém centenas de milhares de instruções. Mas temos tudo pronto! É como uma piada sobre um mecânico que certa vez bateu com um martelo e o carro deu a partida, mas a sutileza é que ele sabia onde bater e dá muito trabalho. (Só não fale de dinheiro aqui - enfie o traseiro em você! Especialmente na véspera do grande feriado! Para fãs de "ganhar dinheiro na Internet" - existem sites especializados.)

Por que o patch não funciona em todas as versões subsequentes - porque os endereços mudam e o código (seus argumentos) muda ligeiramente durante a compilação. Isso leva a uma mudança do código necessário dentro do exe para outros deslocamentos e, se você pesquisar por assinatura (sequência estrita de bytes), pode não descobrir que os argumentos mudaram. Afinal, muitos endereços também são argumentos de instruções e alteram o código binário irreconhecível, apesar de sua essência ser a mesma ... Faça manualmente! Você tem uma cabeça em seus ombros, e não uma "sequência estrita de convoluções" ...

7. Agora, na versão ORIGINAL do termsrv.dll que o patcher corrige, você precisa encontrar uma determinada sequência única, no contexto do programa, de bytes PRÓXIMO do local que você precisa corrigir para procurá-lo em nova versão termsrv.dll, aquele que você deseja corrigir, mas o patcher não o corrigirá ...
Você precisa olhar para o desmontador e procurar BYTEs correspondentes a ele, e se você escolher algo muito "simples", essa combinação irá ocorrer muitas vezes na pesquisa e será difícil encontrar o lugar certo, “Afogar-se” entre um monte de outros semelhantes. E para nós, a “precisão de acerto” é extremamente importante, porque se você corrigir “no lugar errado”, não funcionará, ou até mesmo o Windows travará ...
Você não pode selecionar instruções contendo endereços fixos longos para a string de pesquisa. Ao compilar outras versões, eles provavelmente serão eliminados e você não encontrará nada sobre eles na nova versão.
Todo o procedimento, onde ocorre a verificação, é pequeno, apenas algumas dezenas de comandos. Para um montador, isso é "nada". Hiew irá mostrar-lhe os limites do procedimento condicional como “listras” _ ^ _ ^ _ ^ _ ^ _ ^ _. Observe que no início do procedimento há uma chamada para o endereço do procedimento de "importação" da API do Windows - CDefPolicy :: Query e Hiew o detectou (portanto, o nome da função foi pescado e escrito). Este deve ser um bom guia para você no caminho para o lugar certo. Além disso, este “kakbe” indica que pode haver outra forma de resolver o problema, por exemplo, encontrando uma determinada Política “secreta” responsável pelo comportamento do Terminal Server. Os interessados ​​podem rastrear o código com o depurador e ver como uma variável ou constante com o número de conexões é inicializada. Mas o “código de CDefPolicy” não é adequado para a string de pesquisa, porque o endereço do procedimento na importação provavelmente será removido na nova versão. Eu tentaria pesquisar por bytes desde o início do procedimento após CDefPolicy. La vai:
57 push edi
6A10 push 010
8BF1 mov esi, ecx
33DB xor ebx, ebx
sai 57 6A 10 8B F1 33 DB
Ao final, pode-se adicionar outro código E8 da instrução de chamada a seguir, mas NÃO seu argumento (próximos bytes), pois este é o endereço e ele mudará ao compilar novas versões.
Esta sequência me dá ao pesquisar no Hiew (F7-Search)
Apenas 3 correspondências E a chamada para CDefPolicy é visível no contexto apenas em um caso - no primeiro. Se você encontrou o mesmo lugar, anote o endereço da primeira coluna (pressionando Alt-F1 - Global!) “Em um pedaço de papel” e tente remendá-lo.
Se o código mudou tanto que não encontra nada, procuramos outras sequências exclusivas, incl. respigado de procedimentos vizinhos e tente procurá-los. A tarefa é encontrar código requerido, onde “tudo coincide no sentido” e não uma sequência, pensamos e olhamos o contexto, tentando encontrar CDefPolicy :: Query na nova versão. Você pode pesquisar o texto CDefPolicy :: Query no new.dll, você encontrará a string (várias vezes), mas não o local onde seu endereço é referenciado. Este método às vezes ajuda a encontrar o que você precisa usando F6 (Referência) em Hiew e eu consegui encontrar o lugar certo na dll de Win7SP1x86Rus para fins de experiência, mas não o fato de que funcionará em qualquer lugar, especialmente com outros programas) .

8. Agora você precisa obter o termsrv.dll da versão que você precisa corrigir. Inicie a terceira cópia do Hiew, abra uma nova dll nela ”(para alternar facilmente entre os três e comparar visualmente). Encontramos o lugar certo, conforme descrito acima, ou vamos para o endereço que eles escreveram "em um pedaço de papel" (um pedaço de papel em geral é amigo de um programador neste mundo mortal, onde eles morrem Discos rígidos, desliga os plugues e o sistema operacional trava).
Analisamos o código abaixo CDefPolicy :: Query e encontramos facilmente o lugar certo, COMO:
cmp eax,
jz .06F30B25E
ENTENDEMOS que o endereço, mas se mudou, por exemplo, este é o endereço que precisamos, e iremos operá-lo em futuras edições.

9. Se você está convencido de que tem exatamente o que precisa, passe o cursor sobre a instrução cmp e pressione F3-Edit com ousadia. O cursor “cinza” mudará para “normal” (para modo de exibição de texto) - subscrito. Deve apontar para a mesma instrução cmp.
Pressione Tab (ou F2) e uma caixa de diálogo para inserir as instruções de montagem aparecerá.
Insira a instrução lá
mov eax, 100
Então entre. Na tela principal, você verá que os bytes "da instrução" mudaram e alguns deles se tornaram "dourados" (amarelo). Ao mesmo tempo, as instruções ABAIXO “mudaram” e na coluna direita oposta mostram “lixo” - nada do que estava lá antes.
A caixa de diálogo para inserir comandos na parte superior da janela principal continua a "travar" e aguardar a entrada de novas instruções, enquanto mostra algumas das próximas instruções, incorretamente interpretadas, devido ao congresso de endereçamento.
Não prestamos a menor atenção a esta instrução e dirigimos a próxima.
Digite nop e pressione Enter
Na janela principal, ele acenderá em amarelo próxima linha com o código 90.
A sincronização será restaurada e o próximo comando será jz novamente. Ele se oferecerá para alterar a caixa de diálogo para inserir as instruções.
Dirija lá
mov, eax
Se em vez de 320 no comando cmp houvesse um endereço diferente, então dirija em IT!
Pressione Enter. depois disso, o código na linha 3 acenderá em amarelo, à direita do qual deve haver uma instrução mov, eax (ou não 320, mas o número que foi inserido).
Verificamos se a sincronização dos dados do código NÃO foi movida. A próxima instrução deve ser push edi (ou outra se o código mudou muito e você tinha uma instrução diferente lá antes do patch - ela deve permanecer em seu lugar e ser interpretada corretamente, o que significa que tudo está OK depois disso).

Quando todos tiverem entrado, pressione Esc UMA VEZ. A caixa de diálogo para inserir as instruções desaparecerá, mas pode ser acessada novamente a qualquer momento (no modo de edição) pressionando Tab. Todos os bytes modificados serão amarelos. Verifique meticulosamente se tudo parece correto, não bagunçado em lugar nenhum. Ninguém aqui irá verificar nada para você, NÃO há "proteção contra tolos" de qualquer categoria ou título. Regalia ninguém vai levar em consideração. O que eles fizeram - o que eles conseguiram. Nakosyachili - congela e não funciona.
Se tudo estiver OK, pressione F9 (Atualizar). As alterações serão gravadas em um arquivo no disco e os bytes alterados mudarão de cor para o normal (ciano).

10. Agora você precisa corrigir o exe de checksum. Fazer isso é extremamente entediante. Suponho que Hiew fará esse trabalho para você e você não terá que fazer quase nada. Pressione F8 (cabeçalho). Uma janela "cinza, indefinida" aparece com uma "descriptografia" dos parâmetros do cabeçalho do arquivo exe.
Pressione F3 (Editar). Um violeta “colorido” aparece no topo da janela “indefinida”. Ele lista todos os parâmetros do cabeçalho com seus endereços e valores. Com uma face chata, role até o final e encontre o parâmetro Checksum lá. À direita, seu valor (a própria soma de verificação) é indicado em expressões hexadecimais e decimais, herdadas do arquivo UNPATCHED original. Pressione F3 novamente e, eis que a linha fica amarela e o checksum muda seu valor. Podemos confiar em Hiew, mas podemos encontrá-lo em fóruns ou em livros e calculá-lo manualmente. Se tudo se adequar a você, pressione F9 (Atualizar). O Windows pisca, tudo desaparece ... É o fim, pensa o leitor não iniciado. Mas quando a poeira baixa, a soma de verificação está correta. O desconfiado pode reentrar no diálogo mencionado e comparar Checksum com aquele que foi cuidadosamente salvo antes da execução em um balde em um pedaço de papel. Você pode sair do Hiew por Esc e prosseguir para o estágio de teste do seu produto.

11. Depois de receber o arquivo corrigido, você pode tentar substituir o termsrv.dll no sistema operacional de destino.
Devido aos mecanismos de proteção do Windows contra a alteração de arquivos do sistema, bem como a proibição de escrita programas em execução(violação de compartilhamento) você precisará interromper o serviço de serviços de terminal (veja os comentários de outros usuários acima) e substituir as cópias dll em "qualquer WinSxS" e assim por diante, de modo que o Windows não autorizado até mesmo se esqueça de pensar em tentar restaurar o versão sem patch.

Se tudo funcionar, então você se tornou um kulkhacker ou deu o primeiro passo CONSCIENTE neste caminho. Ninguém te incomoda para escolher e aprender mais, tornando o mundo um lugar melhor e mais amável. Na rede existem muitas instruções e fóruns temáticos inteiros para quem quer pensar com a própria cabeça, e não apenas consumir a pornografia de consumo da Matrix.

Não hesite em publicar uma lista de bytes alterados (você pode obtê-la usando o mesmo “estoque” “FC / b Arquivo1 Arquivo2 ″) para outros usuários menos sofisticados, aqui e / ou em outros recursos, faça bem ao seu vizinho, como o Senhor legou e glorificou seu nome nos anais da história dos hackers.

De acordo com a lista de mudanças, você pode fazer um arquivo .CRK (para patchers que entendem esse formato antigo), ou fazer patch.exe usando algum patch maker, do qual, ao longo dos anos de evolução, dezenas e centenas já escreveram. Escolha então “com Suporte Windows Vista / 7 ″ porque é antigo, embora seja adequado, mas não sabe nada sobre os privilégios de Escalate, e o Windows estupidamente não permite que eles façam patches no Windows / Sistema ou Arquivos de Programas. As instruções devem mencionar a necessidade de interromper o serviço do terminal, ou usar patches em arquivos em pastas separadas, seguido de uma substituição no system32 pelos próprios usuários. Em qualquer caso, publique a lista de alterações, não seja culpado de "louros", pois alguém pode ter que foder manualmente e INFA permitirá que você encontre uma solução alternativa. O patcher do autor faz tudo isso automaticamente, inclusive trabalhando com WinSxS - eu olhei o código, mas acho que não será fácil encontrar um fabricante de patch desse tipo levando tudo isso em consideração.

Há uma oportunidade muito conveniente de fazer a partir de Windows normal 7 uma aparência de um servidor de terminal com a capacidade de se conectar e trabalhar em um computador para vários usuários via RDP. Isso pode ser relevante em pequeno escritório para trabalhar em 1C via RDP. Várias pessoas podem trabalhar facilmente em um computador normal.
O fato é que a Área de Trabalho Remota nas versões de servidor do Windows, por padrão, suporta duas conexões simultâneas, para solução de problemas e gerenciamento do computador. Outros usuários podem se conectar ao mesmo tempo, desde que você tenha as CALs necessárias para este servidor e a máquina pode lidar com isso, ou seja, tem recursos suficientes.

Para permitir que vários usuários trabalhem com um computador ao mesmo tempo, é necessário remover esta restrição. Para isso, a equipe DeepXW criou um patch universal. O patch faz alterações no arquivo termsrv.dll, localizado em% SystemRoot% \ System32 \.

Método um

O patch suporta:

Baixe e descompacte o arquivo e execute o arquivo correspondente com direitos de administrador (clique com o botão direito do mouse no arquivo executável e selecione “Executar como administrador”). Para sistemas de 32 bits, UniversalTermsrvPatch-x86.exe é usado, para sistemas de 64 bits, UniversalTermsrvPatch-x64.exe é usado.

Uma janela aparecerá, como na imagem acima, onde você pode corrigir o termsrv.dll para remover a limitação das sessões de desktop remoto, ou restaurar o arquivo original a qualquer momento (caminho para arquivo de backup: \ Windows \ System32 \ termsrv.dll.backup) Depois de aplicar o patch, reinicie seu computador e você pode começar a trabalhar.

Para verificar a remoção da restrição, deixe aberta a sessão de um usuário no computador onde aplicou o patch e de outra máquina tente se conectar ao computador remotamente de outro usuário. Se tudo correr bem, os dois usuários estarão ativos no sistema, cada um em sua própria sessão.

Original: "http://www.techspot.com/guides/485-windows-concurrent-sessions/"

Hoje existem mais 2 maneiras de fazer um terminal do Windows 7 sp1. O primeiro usando um patch para a biblioteca termsrv.dll, o segundo sem. É preferível usar o segundo método, mas se algo não funcionar, você pode usar o primeiro. Agora com mais detalhes sobre esses métodos.
Método dois

Você pode fazer tudo manualmente, quem entender isso poderá fazer com base no conteúdo do arquivo. O arquivo cmd descreve todas as ações que serão realizadas com o sistema. Para quem não quer entender isso, existe o script install.cmd. Para instalar o patch, você precisa executá-lo como administrador

Isso é tudo. Você pode verificar, conectar. É necessário criar Contas usuários, lembre-se de permitir a conexão de área de trabalho remota:

Método três

Windows XP Professional e Windows XP Media Center Edition (MCE) tem um serviço de conexão desktop remoto (RDP), que permite conectar remotamente um computador, acessar e controlar de outro computador ou host. No entanto, as máquinas que executam um sistema operacional Windows XP permitir simultâneo conexão de área de trabalho remota apenas um usuário que estava conectado a ele, sem várias sessões conexões de desktop remoto ou links de suporte.

Sempre que um usuário remoto se conecta por meio de um cliente a desktop remoto (RDC) para se conectar ao host Windows XP, usuário local desconecta com o bloqueio do console ou sem sua permissão. Área de trabalho remota Ao contrário dos Terminal Server Services no Windows Server 2003 e Server 2008, ele foi projetado para ser usado uma única vez pelo usuário, seja ele local ou remoto.

Aqui hackear para desbloquear um limite o que permite vários simultâneos Área de trabalho remota Sessões de conexão no Windows XP Professional e Media Center Edition usando o termserv.dll corrigido ou o antigo termerv.dll corrigido versão 5.1.2600.2055, para que um número ilimitado de usuários possa simultaneamente conectar ao computador usando área de trabalho remota.

  1. Baixe uma cópia do patch que irá remover as restrições conexão remota para a área de trabalho desabilitada para o seu Versões Windows XP:

Windows XP SP3: termsrv.dll (versão 5.1.2600.5512)

Para obter informações, o patch termsrv.dll geralmente tem os seguintes bits de códigos HEX, que são substituídos nos seguintes valores:

00022A17: 74 75
00022A69: 7F 90
00022A6A: 16 90

  1. Reinicie o seu computador e carregue as informações no Modo de Segurança clicando em F8 durante a inicialização e selecione modo de segurança ... Esta etapa só é necessária se você estiver em este momento usando Windows Terminal Services, ou Serviços de trabalho remoto, proteção sistema de arquivo deve ser ignorado, caso contrário, você receberá a seguinte mensagem de erro para restaurar o arquivo termsrv.dll original.

3. Vá para % WINDIR% System32 e fazer cópia de segurança(ou renomear) termsrv.dll .

4. Renomear ou excluir termserv.dll na pasta % WINDIR% System32 Dllcache.

5. Copie o arquivo baixado termsrv.dll dentro % WINDIR% System32 , % WINDIR% ServicePackFiles i386(se houver) e % WINDIR% System32 Dllcache .

6. Em seguida, baixe e execute para mesclar os valores do registro em registrador, ou você pode iniciar o editor do registro manualmente e adicionar as seguintes configurações do registro:



"EnableConcurrentSessions" = DWORD: 00000001


"AllowMultipleTSSessions" = DWORD: 00000001

7. Clique no botão Começar -> Executar e digite o comando gpedit.msc, clique Entrar para abrir o Editor de Política de Grupo.

8. Vá para Configuração do Computador -> Modelos Administrativos -> Componentes do Windows -> Terminal Services .

9. Incluir limitar o número de conexões e definir o número de conexões para 3 (ou mais). A configuração permite o uso de mais de um computador ao mesmo tempo.

10. Certifique-se de que a Área de Trabalho Remota esteja ativada na guia Propriedades do Sistema Remoto, selecionando o botão de rádio Permitir que os usuários se conectem a este computador remotamente .

11. Ligue troca rápida de usuário dentro Painéis de controle -> contas de usuário -> Alterar logon ou desligamento do usuário .

12. Reinicie seu computador normalmente.

Observe, se você não pode substituir ou reescrever o arquivo termserv.dll - acesso negado ou erro no arquivo, desative "Serviços Termine" na seção "Serviços" do painel de controle "Ferramentas Administrativas". Além disso, cada conexão física conectada deve ter sua própria conta de usuário no computador de destino e deve ser autenticada com seu próprio nome de usuário e credenciais de senha correspondentes.

Para desinstalar e reverter para os termosrv.dll originais, simplesmente exclua a versão revisada e renomeie a cópia de backup de volta para “termsrv.dll”. Se os serviços de terminal estiverem ativos e em execução, será necessário fazê-lo no modo de segurança.

Se um computador com Windows XP conectado a um domínio em rede local, janelas irá definir o valor RegKey "AllowMultipleTSSessions" para "0" sempre que o computador não for reiniciado. Para que várias ou ilimitadas sessões de área de trabalho remota sejam permitidas em um ambiente de domínio do AD, o valor dos dados para "AllowMultipleTSSessions" deve ser definido como "1" a cada inicialização do sistema. Para alterar o valor, basta reiniciar ts_multiple_sessions.bat toda vez que o computador é inicializado. Além disso, coloque ts_multiple_sessions.bat dentro C: Documentos e configurações Menu principal de todos os usuários Programas de inicialização pastas para que seja executado automaticamente no primeiro usuário com direitos de administrador. Outra solução é instalar servico adicional ou definir uma chave em uma ramificação do registro HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows CurrentVersion Run através do qual funciona automaticamente arquivo em lote na inicialização, e isso é útil se o computador não for registrado por ninguém, mas ainda for exigido por um funcionário para permitir o funcionamento de conexões ilimitadas de área de trabalho remota.

É diferente se o usuário fecha conexão remota em vez de fazer logoff quando ele tentar fazer logon novamente, você receberá um código de erro 4226 associado a um evento TCP / IP. Para resolver esse problema, baixe e instale o TCP / IP do Windows XP, limitando a conexão e o patch do Event ID 4226, e estabeleça uma conexão de pelo menos 50.

Esta montagem é construída sobre a imagem original da versão russa do Microsoft Windows XP Professional SP3, com todas as atualizações! Disco de inicialização múltipla. DOWNLOAD GRÁTIS -


Corrigindo desvantagens do RDP usando RDP Wrapper Library

Área de Trabalho sistemas operacionais A Microsoft tem algumas limitações relacionadas à operação dos Serviços de Área de Trabalho Remota. Portanto, em primeiro lugar, o suporte para o lado do servidor (RDP Host) está disponível apenas em edições anteriores do Windows (pelo menos Professional). Nas edições caseiras, essa funcionalidade está desabilitada, portanto, é impossível conectar-se a versões mais novas do Windows via RDP.

E, em segundo lugar, o número de sessões RDP simultâneas é limitado. Apenas uma conexão RDP simultânea é permitida e, ao tentar abrir uma segunda sessão RDP, o sistema exibirá uma mensagem informando que já existe um usuário no sistema e solicitará que ele saia da sessão.

Contornar essas restrições permitirá que o projeto Biblioteca RDP Wrapper de Stas'M. O Wrapper RDP atua como uma camada entre o Gerenciador de Controle de Serviços (SCM) e o Serviço de Área de Trabalho Remota. Ao mesmo tempo, ao contrário de outras soluções deste tipo, não altera o arquivo termsrv.dll(biblioteca usada pelos Serviços de Área de Trabalho Remota) para que você não precise se preocupar com Atualizações do Windows.

No Windows 8 / 8.1, como Versões prévias SO cliente Microsoft, compatível apenas uma conexão RDP de entrada simultânea... Isso significa que por Computador Windows 8, apenas um usuário (uma sessão), local ou remoto, pode se conectar por meio de uma área de trabalho remota por vez. Na maioria dos casos, isso é suficiente, mas às vezes eu gostaria de poder trabalhar simultaneamente com vários usuários ao mesmo tempo em suas próprias sessões. Um bom exemplo pode haver um computador na função de Media Center, quando o vídeo é reproduzido na sessão do console, e ao mesmo tempo é necessário trabalhar remotamente com o sistema sem interromper o vídeo na TV.

Conselho. O acesso RDP remoto não funciona nas edições Home do Windows, Pro ou Enterprise são necessárias.

Quando você tenta abrir uma segunda sessão RDP em um computador com Windows 8, é exibida uma mensagem informando que outro usuário já está conectado ao sistema e sua sessão pode ser encerrada.

Conselho... Anteriormente nas propriedades do computador na guia Acesso remoto(Remoto), você precisa adicionar as contas de usuário necessárias ao grupo local de Usuários da Área de Trabalho Remota. Os administradores locais têm permissão de acesso RDP remoto por padrão. Depois de habilitar o acesso RDP nas propriedades do sistema, Firewall do Windows liga automaticamente as regras permitindo tráfego de entrada para a porta 3389. Às vezes, essa regra deve ser verificada manualmente.

Assim, por exemplo, na versão de servidor do Windows, duas conexões administrativas simultâneas com sessões individuais são suportadas (no caso de organização em Baseado em Windows RDS do servidor de terminal de servidor, este número pode ser ainda maior).

No entanto, na Internet, você pode encontrar um patch especial que permite contornar essa limitação. Graças a este patch, vários usuários serão capazes de se conectar simultaneamente via RDP a um computador Windows 8 / Windows 8.1.

Importante... Usar este patch é, na verdade, uma violação acordo de licença e os termos de uso dos produtos Microsoft. Portanto, você executa todas as operações descritas abaixo por sua própria conta e risco.

Então, o patch envolve a substituição do original arquivo de sistema % SystemRoot% \ System32 \ termsrv.dll(biblioteca usada pelos Serviços de Área de Trabalho Remota).

  • Windows 8 - termsrv.dll-win8.zip
  • Windows 8.1 - termsrv.dll-win8.1.zip

Antes de substituir a biblioteca do sistema, crie uma cópia de backup do arquivo termsrv.dll com o comando:

Copiar c: \ Windows \ System32 \ termsrv.dll termsrv.dll_old

Agora, se algo der errado, você sempre pode retornar à configuração inicial, substituindo o arquivo atual com o original termsrv.dll_old.

Baixe o arquivo com a biblioteca de sua versão do Windows.

No Windows 8, você deve primeiro alterar o valor das seguintes chaves na chave do Registro HKLM \ System \ CurrentControlSet \ Control \ Terminal Server \:

  • fDenyTSConnections(DWORD) - 0 (a chave permite no computador)
  • fSingleSessionPerUser(DWORD) - 0

A mesma operação pode ser realizada na linha de comando:

REG ADD "HKLM \ SYSTEM \ CurrentControlSet \ Control \ Terminal Server" / v fDenyTSConnections / t REG_DWORD / d 0 / f REG ADD "HKLM \ SYSTEM \ CurrentControlSet \ Control \ Terminal Server" / v fSingleSessionPerUser / t REG_DWORD / d 0 / f

Em seguida, vá para o diretório C: \ Windows \ System32, encontre o arquivo termsrv.dll e abra suas propriedades.

Por padrão, o proprietário deste arquivo é Instalador confiável e mesmo o administrador não tem direitos para substituí-lo.

Vamos para a aba Segurança e aperte o botão Editar... Na lista de acesso, encontre o grupo de administradores locais e conceda a ele todos os direitos sobre o arquivo ( Controlo total) e salve suas alterações.

A próxima etapa antes de substituir o arquivo de biblioteca, abra o console de gerenciamento de serviços ( services.msc) e pare o serviço Serviços de trabalho remoto.

Copie o arquivo termsrv.dll do arquivo baixado da sua versão do Windows para o diretório % SystemRoot% \ System32 \(com substituição).

Observação... arquivo para Windows 8.1 contém dois arquivos 32_termsrv.dll e 64_termsrv.dll, para versões de 32 bits e 64 bits do Windows 8.1, respectivamente. Descompacte o arquivo e renomeie o arquivo para sua versão do sistema em termsrv.dll

Depois de substituir o arquivo, inicie o serviço Serviços de Área de Trabalho Remota e tente criar duas sessões RDP com a máquina corrigida em contas diferentes. Se você fez tudo corretamente, duas sessões de área de trabalho remota independentes devem ser abertas.

Conselho... Poderá ser necessário reiniciar o computador.

Importante! Usar a versão corrigida de termsrv.dll tem várias desvantagens. A principal delas é que ao instalar a próxima atualização do Windows 8.1 / 8, este arquivo poderá ser substituído. Conseqüentemente, você mesmo terá que corrigir um novo arquivo usando um editor HEX ou pesquisar na Internet por um arquivo modificado pronto para sua construção do Windows.

Como uma solução resistente à substituição do arquivo termsrv.dll ao instalar atualizações do Windows, você deve usar uma solução de código aberto Biblioteca Wrapper RDP(disponível no GitHub), que não governa o termsrv.dll e é uma camada entre os Terminal Services e o SCM. Mais sobre usando RDP A Biblioteca Wrapper pode ser lida.