Показать сообщение отдельно
Старый 22.12.2008, 00:21   #5
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание MIDletPascal obfuscator

Вот максимально упрощенный алгоритм с малым числом зарезервированных слов для обычного pascal'я. Написан в TurboPascal7.1 / Delphi. (исходный текст пропущен через обусификатор)

{__obus.pas__   programming by arT (c).  e-mail: [email protected]}
var
  n1,n2     : text;
  n3        : string;
  n4,n5,n6 : char;
  n7     : array[0..2000] of string[31];
  n8  : integer;


function n9(n3:string) : string;
var  {обусификатор для переменных и имен}
  n10 : integer;
begin
  n7[0]:=n3;
  n10:=n8;
  while n7[n10]<>n3 do dec(n10);
  if (n10=0) then
  begin
    inc(n8);
    n7[n8]:=n3;
    n10:=n8;
  end;
  str(n10,n3);
  n9:='l'+n3;
end;


begin
  assign(n1,'obus.pas');
  reset(n1);
  assign(n2,'obus2.pas');
  rewrite(n2);
  n6:=#0;
  while not eof(n1) do
  begin
    n5:=n4;
    read(n1,n4);
    if (n4 in ['_','$','0'..'9','a'..'z','A'..'Z']) and (n6=#0) then
    begin
      if n4 in [#65..#90] then inc(n4, (97-65));
      n3:=n3+n4;
    end
    else
    begin
      if n3<>'' then  {преобразовать}
      begin
        if not (n3[1] in ['$','0'..'9'])
        and (n3<>'program')
        and (n3<>'begin')
        and (n3<>'end')
        and (n3<>'for')
        and (n3<>'to')
        and (n3<>'downto')
        and (n3<>'do')
        and (n3<>'while')
        and (n3<>'case')
        and (n3<>'of')
        and (n3<>'repeat')
        and (n3<>'until')
        and (n3<>'if')
        and (n3<>'then')
        and (n3<>'and')
        and (n3<>'or')
        and (n3<>'not')
        and (n3<>'in')
        and (n3<>'write')
        and (n3<>'writeln')
        and (n3<>'read')
        and (n3<>'readln')
        and (n3<>'paramcount')
        and (n3<>'paramstr')
        and (n3<>'ioresult')
        and (n3<>'assign')
        and (n3<>'rewrite')
        and (n3<>'reset')
        and (n3<>'close')
        and (n3<>'halt')
        and (n3<>'exit')
        and (n3<>'break')
        and (n3<>'byte')
        and (n3<>'boolean')
        and (n3<>'integer')
        and (n3<>'longint')
        and (n3<>'real')
        and (n3<>'shortint')
        and (n3<>'const')
        and (n3<>'type')
        and (n3<>'var')
        and (n3<>'label')
        and (n3<>'array')
        and (n3<>'string')
        and (n3<>'char')
        and (n3<>'text')
        and (n3<>'file')
        and (n3<>'inc')
        and (n3<>'dec')
        and (n3<>'false')
        and (n3<>'true')
        and (n3<>'procedure')
        and (n3<>'function')
        and (n3<>'str')
        and (n3<>'val')
        and (n3<>'eof')
        and (n3<>'eol')
        and (n3<>'else')
        and (n3<>'length')
        and (n3<>'flush')
        and (n3<>'getmem')
        and (n3<>'fillchar')
        and (n3<>'freemem')
        and (n3<>'sizeof')
        {} then n3:=n9(n3);
        write(n2,n3);
        n3:='';
      end;
      write(n2,n4);
      if (n4=n6) then
      begin
        if (n4<>')') then n6:=#0
          else if (n5='*') then n6:=#0;
      end
      else if n6=#0 then
      begin
        if (n4='{') then n6:='}'
        else if (n4='''') then n6:=''''
        else if (n4='/') and (n5='/') then n6:=#10
        else if (n4='*') and (n5='(') then n6:=')';
      end;
    end;
  end;
  close(n2);
  close(n1);
end.
(Offline)
 
Ответить с цитированием