Esta é uma ferramenta criada para injetar strings usando código de baixo nível
Nossa estratégia para injetar a string é criar uma nova seção usando ferramentas como Stud_PE ou CFF Explorer para ter espaço no executável para anexar o novo código, um método comum é substituir uma instrução original e pular para o seu código, geralmente um salto tem 5 bytes de comprimento, às vezes você precisa substituir mais de uma instrução e não se esqueça de colocar instruções originais como CMP e TEST após a execução do seu código, claro, se tiver.
@StrInject: ;Declare StrInject Label
push EDX ;Backup EDX, ECX, EBX Registers
push ECX
push EBX
push EAX ;The EAX is the string pointer or a unicode character
call GetProc ;Here the Srl.Process Pointer is catched
call EAX
pop EBX ;Restore EDX, ECX, EBX Registers from the "Backup"
pop ECX
pop EDX
jmp RetPnt ;Continue the Execution
Temos vários métodos para capturar o ponteiro Srl.Process, este é para jogos que possuem uma alocação dinâmica do módulo principal, é possível usar o exemplo abaixo se você injetou a exportação no executável do jogo, você pode usar Stud_PE ou CFF Explorer para faça isso, você também precisa criar uma nova seção executável para anexar nosso novo código.
No caso deste exemplo o endereço Srl.Process na tabela de importação é sempre relativo à nossa nova seção executável.
No código abaixo o EIP capturado é para o "pop EAX" e o Srl.Process na tabela de importação é por exemplo 0x02B9C400 e o "pop EAX" está em 0x02B9E44C, então... 0x02B9E44C - 0x02B9C400 = 0x204C, agora se nós subtrair este valor do EIP podemos obter a posição do Ponteiro Srl.Process.
Se você quiser usar o SRL para colocar caracteres não ASCII, você precisa chamar Srl.Process e fornecer o caractere de uma função GetGlyph para ele.
@GetProc:
call @Nxt ;Call the label Nxt
@Nxt: ;Declare the Nxt label
pop EAX ;Catch the EIP :)
sub EAX , 0x204C ;Subtract the Difference from the EIP and Import Address
mov EAX , [ EAX ] ;Read the import table
ret
Após alguns problemas com jogos que recarregam string dentro de um loop criei o GetDirectProcess, para importar esta função use o mesmo método do SRL.Process acima, porém você irá alterar o GetProc, aqui um exemplo de código:
@GetProc:
call @Nxt ;Call the label Nxt
@Nxt: ;Declare the Nxt label
pop EAX ;Catch the EIP :)
cmp dword [ EAX + 0x21 ], 0 ;Verify if already have the Address
jne @Finish
push EAX ;Backup NXT Address
sub EAX , 0x2050 ;Subtract the Difference from the EIP and Import Address
mov EAX , [ EAX ] ;Read the import table
call EAX ;Calls the GetDirectProcess
pop EBX ;Recovery NXT Address
mov [ EBX + 0x21 ], EAX ;Save the Process Address
mov EAX , EBX ;Prepare to Finish
@Finish:
add EAX , 0x21 ;Ajust Pointer
mov EAX , [ EAX ] ;Read the Process Address
ret
@ Ptr :
dd 0 ;Here is the @Nxt: + 0x21
Este método não possui parâmetros, apenas chama e captura o EAX, o EAX é um ponteiro para a função Process
O SRL possui um recurso para instalar automaticamente o SRL no mecanismo de jogo sem que você precise saber como corrigir o jogo.
Primeiro, baixe o SRL AQUI, extraia para o diretório do jogo e renomeie o SRLWrapper.dll para d3d9.dll; dinput8.dll ou qualquer outro wrapper suportado Veja aqui o que é suportado e, em seguida, no SRL.ini defina o AutoInstall como verdadeiro.
Alguns jogos SoftPal precisam de configuração manual com ajuda do Auto-Installer, clique abaixo para ver o exemplo:
O EntisGLS AutoInstall permite apenas modificar a configuração XML do mecanismo interno, e com isso você poderá definir fontes customizadas e carregar arquivos extraídos.
Basta adicionar o <file path="$(CURRENT)Patch"/>
no arquivo EntisGLSConfig.xml
gerado e o SRL forçará automaticamente o jogo a usar suas configurações personalizadas.
Nota: A prioridade está nas linhas superiores, adicione a linha no topo dos outros blocos <file/>
ou <archive/>
.
Um recurso comum que as pessoas desejam no String Reloads é o recurso Font Modifier, esse recurso funciona com a maior parte dos jogos que não possuem uma fonte pré-renderizada e é fácil de configurar.
Primeiro, baixe o SRL AQUI, extraia para o diretório do jogo e renomeie o SRLWrapper.dll para d3d9.dll; dinput8.dll ou qualquer outro wrapper suportado Veja aqui o que é suportado.
Agora, você precisa habilitar o gancho CreateFont no SRL.ini, temos 4 variantes do CreateFont, o CreateFontA, CreateFontW, CreateFontIndirectA e CreateFontIndirectW.
Normalmente um jogo usa apenas uma dessas 4 opções, a maneira correta de saber qual hook você deve habilitar é encontrar no executável do jogo se ele possui a string "CreateFontA", "CreateFontW", "CreateFontIndirectA" ou "CreateFontIndirectW"... Ou, se você for preguiçoso ou um pouco maluco, pode simplesmente ativar tudo, mas não é recomendado.
Quando você habilita o gancho CreateFont, o SRL será capaz de modificar algumas coisas na fonte do jogo, como o tamanho da fonte (não funciona com todos os motores) e a própria fonte.
No final do SRL.ini você pode encontrar uma entrada de remapeamento de fonte 'amostra' padrão, o [Font.0]
, você pode adicionar mais parâmetros de recarga de fonte adicionando um novo bloco com um número incrementado no nome do bloco, como [Font.1]
, [Font.2]
, [Font.3]
...
No parâmetro From
você pode definir o nome da fonte 'origem' a ser modificada, onde * significa todas as fontes.
Em FromWidth
ou FromHeight
você pode combinar a fonte a ser modificada especificando seu tamanho original. (Por padrão comentado)
No FromCharset
você pode combinar a fonte a ser modificada especificando o conjunto de caracteres da fonte. (Por padrão comentado)
No parâmetro To
você pode definir o nome da fonte 'destino'.
No parâmetro Charset
você pode forçar o charset da fonte a ser utilizado, onde 0 = auto, comentado = não modificar, 932 = SJIS, veja mais valores aqui
Nos parâmetros Width
, Height
, você pode modificar o tamanho da fonte, os números podem ser de tamanho absoluto ou relativo, +5
ou -1
são valores relativos que são calculados com o valor original do tamanho da fonte. o .
prefixo no valor especifica que o valor é um valor absoluto, então .-1
realmente se tornará -1 independentemente do tamanho da fonte original.
Os parâmetros Width
, Height
podem ser ainda mais dinâmicos se você quiser, é possível definir o valor como uma expressão a ser avaliada durante o tempo de execução, por exemplo, se você definir Width
como if([Width] < 0, [Width] * -1, [Width])
, esta expressão irá verificar se o Width é negativo, e torná-lo positivo, caso contrário, não faz nada.
As expressões podem ter os parâmetros: [Width]
, [Height]
, [Charset]
, [Facename]
, você pode verificar detalhes do uso da expressão aqui
Além disso, no bloco [StringReloads]
, você pode encontrar o parâmetro LoadLocalFonts
, com este parâmetro definido como true, o SRL fará com que o jogo seja capaz de carregar fontes do diretório (ou subdiretório) do jogo sem a necessidade de instalar a fonte no host sistema.