Estou usando o IDA para desmontar o Test Drive III. É um jogo DOS de 1990. O * .EXE tem formato MZ.
O jogo usa uma série de recursos anti-reversão, como copiar seu código para o segmento (PSPseg + 2be7)
onde PSPseg
é o valor inicial de ES
(ou seja, o segmento onde o PSP reside). Pelo que eu sei, os executáveis COM são sempre carregados logo após o final do Prefixo do segmento do programa (PSP)
, de modo que tanto o PSP quanto o exe caber em um segmento. E quanto aos executáveis MZ? Existe algum lugar fixo onde o PSP do aplicativo está localizado em relação ao próprio aplicativo?
Em outras palavras, o deslocamento PSPseg de base
é sempre o mesmo? No meu DOSBox no início da execução do programa, CS
é sempre 0x22CF
, ES = DS = 0x01FE
, CS0
no cabeçalho MZ é 0x20C1
, gerando PSPseg
offset 0x0010
(16 segmentos, 256 bytes - exatamente o tamanho do PSP).
Se esse deslocamento não for fixo e o PSP e o aplicativo forem carregados aleatoriamente em qualquer local de memória grande o suficiente, há pelo menos alguma garantia sobre seus endereços? Como se o endereço PSP fosse sempre inferior ao endereço base do aplicativo?