Advertisement
rowers

obfuscator3

Jan 15th, 2014
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.94 KB | None | 0 0
  1. program project1;
  2.  
  3. uses
  4. SysUtils;
  5.  
  6. type
  7. wsk = ^elem;
  8.  
  9. elem = record
  10. zawartosc: string;
  11. nast: wsk;
  12. end;
  13.  
  14. tokeny = record
  15. zmienne: wsk;
  16. funkcje: wsk;
  17. procedury: wsk;
  18. end;
  19.  
  20. function Ostatni(glowa:wsk) : wsk; //znajduje ostatni element listy
  21. var
  22. aktualny:wsk;
  23. begin
  24. aktualny := glowa;
  25.  
  26. // Ostatni element ma wartosc nil, tego szukamy wsk warunku petli.
  27. while aktualny^.nast <> nil do
  28. begin
  29. aktualny := aktualny^.nast;
  30. end;
  31.  
  32. Ostatni := aktualny;
  33. end;
  34.  
  35. procedure Wstaw(glowa:wsk; wartosc:string); //wstawia element do listy
  36. var
  37. ostatni_element : wsk;
  38. begin
  39. // Jeżeli pierwszy element jest pusty, podmień pierwszy
  40. // wsk przeciwnym wypadku znajdĹş ostatni i dodaj nowy element.
  41. if glowa^.zawartosc = '' then
  42. begin
  43. glowa^.zawartosc := wartosc;
  44. Exit;
  45. end;
  46.  
  47. ostatni_element := Ostatni(glowa);
  48.  
  49. ostatni_element^.nast := new(wsk);
  50. ostatni_element := ostatni_element^.nast;
  51.  
  52. ostatni_element^.zawartosc := wartosc;
  53. end;
  54.  
  55.  
  56. procedure Dolacz(glowa, ogon:wsk); //laczy dwie listy ze soba
  57. var
  58. ostatni_element:wsk;
  59. begin
  60. // Jezeli pierwszy element jest pusty, podmienia pierwszy
  61. // wsk przeciwnym wypadku znajduje ostatni i dolacz ogon.
  62. if glowa^.zawartosc = '' then
  63. begin
  64. glowa^.nast := ogon^.nast;
  65. glowa^.zawartosc := ogon^.zawartosc;
  66. Exit;
  67. end;
  68.  
  69. ostatni_element := Ostatni(glowa);
  70.  
  71. ostatni_element^.nast := ogon;
  72. end;
  73.  
  74. function WczytajPlik(nazwa:string) : wsk; //tworzy listę
  75. var
  76. glowa, biez, kon: wsk;
  77. plik: text;
  78. linia: string;
  79. begin
  80. assign(plik, nazwa);
  81. reset(plik);
  82.  
  83. glowa := nil;
  84. biez := nil;
  85. kon := nil;
  86.  
  87. while not Eof(plik) do
  88. begin
  89. readln(plik, linia);
  90. new(biez);
  91.  
  92. biez^.zawartosc := LowerCase(linia);
  93.  
  94. if glowa = nil then
  95. glowa := biez
  96. else
  97. kon^.nast := biez;
  98.  
  99. kon := biez;
  100. end;
  101.  
  102. close(plik);
  103.  
  104. WczytajPlik := glowa;
  105. end;
  106.  
  107. procedure ZapiszPlik(nazwa:string; kod:wsk); //zapisuje zaciemniony kod w pliku
  108. var
  109. zawartosc : string;
  110. plik : text;
  111. begin
  112. while kod <> nil do
  113. begin
  114. if (Pos('type', kod^.zawartosc) > 0)
  115. or (Pos('var', kod^.zawartosc) > 0)
  116. or (Pos('record', kod^.zawartosc) > 0)
  117. or (Pos('begin', kod^.zawartosc) > 0)
  118. or (Pos('then', kod^.zawartosc) > 0)
  119. or (Pos('do', kod^.zawartosc) > 0 ) then
  120. kod^.zawartosc := Concat(kod^.zawartosc, ' ');
  121. zawartosc := Concat(zawartosc, kod^.zawartosc);
  122. kod := kod^.nast;
  123. end;
  124.  
  125. assign(plik, nazwa);
  126. rewrite(plik);
  127. write(plik, zawartosc);
  128. close(plik);
  129. end;
  130.  
  131. procedure WypiszPlik(kod:wsk); //wypisanie zawartosci pliku na ekran
  132. var
  133. biez: wsk;
  134. begin
  135. biez := kod;
  136.  
  137. while biez <> nil do
  138. begin
  139. writeln(biez^.zawartosc);
  140. biez := biez^.nast;
  141. end;
  142. end;
  143.  
  144. function RozlozPrzecinek(linia: string) : wsk; //rozklada nazwy zmiennych wypisanych po przecinku do osobnych lini
  145. var
  146. zmienne: wsk;
  147. begin
  148. new(zmienne);
  149.  
  150. while Pos(',', linia) > 0 do
  151. begin
  152. Wstaw(zmienne, Trim(Copy(linia, 1, Pos(',', linia) - 1))); //wstawia do listy element z nazwą zmiennej, która znajduje się przed przecinkiem
  153.  
  154. linia := Copy(linia, Pos(',', linia) + 1, 255); //usuwa nazwię zmiennej znajdującej się przed przecinkiem
  155.  
  156. if Pos(',', linia) = 0 then
  157. begin
  158. Wstaw(zmienne, Trim(linia)); //wstawia do listy ostatnią zmienną z lini
  159. end;
  160. end;
  161.  
  162. RozlozPrzecinek := zmienne;
  163. end;
  164.  
  165. function RozlozVar(sekcja: wsk) : wsk; //"wyciąga" nazwy zmiennych z sekcji var
  166. var
  167. wynik: wsk;
  168. begin
  169. new(wynik);
  170.  
  171. while Pos(':', sekcja^.zawartosc) > 0 do
  172. begin
  173. if Pos(',', sekcja^.zawartosc) > 0 then
  174. begin
  175. Dolacz(wynik, RozlozPrzecinek(Copy(sekcja^.zawartosc, 1, Pos(':', sekcja^.zawartosc) - 1))); //dolacza liste zmiennych z procedury rozlozprzecinek
  176. end
  177. else
  178. begin
  179. Wstaw(wynik, Trim(Copy(sekcja^.zawartosc, 1, Pos(':', sekcja^.zawartosc) - 1))); //wstawia do listy nazwy zmiennych przed znakiem ":"
  180. end;
  181.  
  182. sekcja := sekcja^.nast;
  183. end;
  184.  
  185. if wynik^.zawartosc = '' then
  186. RozlozVar := nil
  187. else
  188. RozlozVar := wynik;
  189. end;
  190.  
  191. procedure RozlozArgumenty(linia:string; kontener:tokeny); //rozklada argumenty
  192. var
  193. argumenty : wsk;
  194. zmienna : string;
  195. begin
  196. new(argumenty);
  197.  
  198. while (Pos(';', linia) > 0) do
  199. begin
  200. zmienna := Copy(linia, 1, Pos(';', linia) - 1); //wycina zawartosc lini az do srednika
  201.  
  202. while Pos(',', zmienna) > 0 do
  203. begin
  204. Wstaw(argumenty, Trim(Copy(zmienna, 1, Pos(',', zmienna) - 1))); //wstawia do listy argument, który stoi przed przecinkiem
  205. zmienna := Copy(zmienna, Pos(',', zmienna) + 1, 255); //usuwa nazwe zmiennych przed przecinkiem
  206. end;
  207.  
  208. linia := Copy(linia, Pos(';', linia) + 1, 255); //usuwa zmienne znajdujące się przed znakiem ";"
  209. Wstaw(argumenty, Trim(Copy(zmienna, 1, Pos(':', zmienna) - 1))); //rozdziela nazwę zmiennej i jej typ, i wstawia do listy
  210. end;
  211.  
  212. Wstaw(argumenty, Trim(Copy(linia, 1, Pos(':', linia) - 1))); //wstawia do listy ostatni argument z lini
  213.  
  214. Dolacz(kontener.zmienne, argumenty);
  215. end;
  216.  
  217. procedure RozlozFunction(ciag:string; kontener:tokeny); //rozklada funkcje
  218. begin
  219. if Pos('(', ciag) > 0 then
  220. begin
  221. RozlozArgumenty(Copy(ciag, Pos('(', ciag) + 1, Pos(')', ciag) - 1 - Pos('(', ciag)), kontener); //rozklada argumenty funkcji
  222. Wstaw(kontener.funkcje, Trim(Copy(ciag, 9, Pos('(', ciag) - 9))); //wstawia do kontenera nazwy
  223. end
  224. else
  225. Wstaw(kontener.funkcje, Trim(Copy(ciag, 9, Pos(':', ciag) - 9))); //wstwia do kontenera to co przed dwukropkiem kiedy funkcja nie posiada nawiasow
  226. end;
  227.  
  228. procedure RozlozProcedure(ciag:string; kontener:tokeny);
  229. begin
  230. if Pos('(', ciag) > 0 then
  231. begin
  232. RozlozArgumenty(Copy(ciag, Pos('(', ciag) + 1, Pos(')', ciag) - 1 - Pos('(', ciag)), kontener); //rozklada procedure
  233. Wstaw(kontener.procedury, Trim(Copy(ciag, 10, Pos('(', ciag) - 10))); //wstawia do kontenera nazwy
  234. end
  235. else
  236. Wstaw(kontener.procedury, Trim(Copy(ciag, 10, Pos(';', ciag) - 10))); //wstwia do kontenera to co przed srednikiem kiedy procedura nie posiada nawiasow
  237. end;
  238.  
  239. function Tokenizuj(kod:wsk) : tokeny; //przygotowuje nazwy do zaciemniania
  240. var
  241. kontener: tokeny;
  242. begin
  243. new(kontener.zmienne);
  244. new(kontener.funkcje);
  245. new(kontener.procedury);
  246.  
  247. while kod <> nil do
  248. begin
  249. if Pos('var', LowerCase(kod^.zawartosc)) > 0 then
  250. begin
  251. Dolacz(kontener.zmienne, RozlozVar(kod^.nast));
  252. end;
  253.  
  254. if (Pos('function ', LowerCase(kod^.zawartosc)) > 0) and (Pos('=', LowerCase(kod^.zawartosc)) = 0) then
  255. begin
  256. RozlozFunction(kod^.zawartosc, kontener);
  257. end;
  258.  
  259. if (Pos('procedure ', LowerCase(kod^.zawartosc)) > 0) and (Pos('=', LowerCase(kod^.zawartosc)) = 0) then
  260. begin
  261. RozlozProcedure(kod^.zawartosc, kontener);
  262. end;
  263.  
  264. kod := kod^.nast;
  265. end;
  266.  
  267. Tokenizuj := kontener;
  268. end;
  269.  
  270. function GenerujNazwe : string; //generuje nazwy do zaciemniania
  271. var
  272. ciag, wynik:string;
  273. begin
  274. ciag := 'abcdefghijklmnopqrstuvwxyz';
  275. wynik := '';
  276.  
  277. repeat
  278. wynik := wynik + ciag[Random(Length(ciag)) + 1];
  279. until (Length(wynik) = 6);
  280.  
  281. GenerujNazwe := wynik;
  282. end;
  283.  
  284. procedure PodmienZmienna(kod : wsk; zmienne: wsk); //podmienia nazwy zmiennych
  285. var
  286. linia:wsk;
  287. nowa_nazwa:string;
  288. begin
  289. linia := kod;
  290.  
  291. while zmienne <> nil do
  292. begin
  293. nowa_nazwa := GenerujNazwe;
  294.  
  295. while linia <> nil do
  296. begin
  297. if (Pos(zmienne^.zawartosc, linia^.zawartosc) > 0) and ((Pos(zmienne^.zawartosc, linia^.zawartosc) > Pos('(', linia^.zawartosc))) then
  298. begin
  299. linia^.zawartosc := StringReplace(linia^.zawartosc, zmienne^.zawartosc, nowa_nazwa, []);
  300. end;
  301.  
  302. linia := linia^.nast;
  303. end;
  304.  
  305. zmienne := zmienne^.nast;
  306. linia := kod;
  307. end;
  308. end;
  309.  
  310. procedure PodmienProcedury(kod : wsk; procedury : wsk); //podmienia nazwy w procedurach
  311. var
  312. linia:wsk;
  313. nowa_nazwa:string;
  314. begin
  315. linia := kod;
  316.  
  317. while procedury <> nil do
  318. begin
  319. nowa_nazwa := GenerujNazwe;
  320.  
  321. while linia <> nil do
  322. begin
  323. if(Pos(procedury^.zawartosc, linia^.zawartosc) > 0) then
  324. begin
  325. linia^.zawartosc := StringReplace(linia^.zawartosc, procedury^.zawartosc, nowa_nazwa, [rfReplaceAll]);
  326. end;
  327.  
  328. linia := linia^.nast;
  329. end;
  330.  
  331. procedury := procedury^.nast;
  332. linia := kod;
  333. end;
  334. end;
  335.  
  336. procedure PodmienFunkcje(kod : wsk; funkcje : wsk); //podmienia nazwy funkcji
  337. begin
  338. PodmienProcedury(kod, funkcje);
  339. end;
  340.  
  341. procedure ZjedzWciecia(kod : wsk); //usuwa wcięcia w każdej lini kodu osobno
  342. begin
  343. while kod <> nil do
  344. begin
  345. kod^.zawartosc := TrimLeft(kod^.zawartosc);
  346. kod := kod^.nast;
  347. end;
  348. end;
  349.  
  350. function Obfuskuj(kod:wsk) : wsk; //obfuskuje
  351. var
  352. kontener: tokeny;
  353. begin
  354. kontener := Tokenizuj(kod);
  355.  
  356. PodmienZmienna(kod, kontener.zmienne);
  357. PodmienFunkcje(kod, kontener.funkcje);
  358. PodmienProcedury(kod, kontener.procedury);
  359.  
  360. ZjedzWciecia(kod);
  361. end;
  362.  
  363. procedure Powitanie;
  364. begin
  365. writeln('Witaj w Obfuscatorze!');
  366. writeln('=====================');
  367. writeln;
  368. write('> Podaj nazwe pliku aby rozpoczac proces zaciemniania: ');
  369. end;
  370.  
  371. procedure UruchomAplikacje;
  372. var
  373. kod: wsk;
  374. plik:string;
  375. begin
  376. Powitanie;
  377. readln(plik);
  378.  
  379. kod := WczytajPlik(plik);
  380.  
  381. if kod <> nil then
  382. begin
  383. writeln('> Plik zostal wczytanie pomyslnie, rozpoczynam zaciemnianie.');
  384. Obfuskuj(kod);
  385. writeln(Concat('> Proces zakonczony. Kod wynikowy zostal zrzucony do pliku ', 'OBFSC_', plik));
  386. ZapiszPlik(Concat('OBFSC_', plik), kod);
  387. end
  388. else
  389. begin
  390. writeln('> Plik nie istnieje badz jest nieosiagalny. Koncze dzialanie.');
  391. end;
  392. end;
  393.  
  394. begin
  395. begin
  396. Randomize;
  397. UruchomAplikacje;
  398.  
  399. readln;
  400. end;
  401. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement