Advertisement
rowers

Untitled

Jan 16th, 2014
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.04 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.  
  108. procedure ZapiszPlik(nazwa:string; kod:wsk); //zapisuje zaciemniony kod w pliku
  109. var
  110. zawartosc : string;
  111. plik : text;
  112. begin
  113. while kod <> nil do
  114. begin
  115. if (Pos('type', kod^.zawartosc) > 0)
  116. or (Pos('var', kod^.zawartosc) > 0)
  117. or (Pos('record', kod^.zawartosc) > 0)
  118. or (Pos('begin', kod^.zawartosc) > 0)
  119. or (Pos('then', kod^.zawartosc) > 0)
  120. or (Pos('do', kod^.zawartosc) > 0 ) then
  121. kod^.zawartosc := Concat(kod^.zawartosc, ' ');
  122. zawartosc := Concat(zawartosc, kod^.zawartosc);
  123. kod := kod^.nast;
  124. end;
  125.  
  126. assign(plik, nazwa);
  127. rewrite(plik);
  128. write(plik, zawartosc);
  129. close(plik);
  130. end;
  131.  
  132. procedure WypiszPlik(kod:wsk); //wypisanie zawartosci pliku na ekran
  133. var
  134. biez: wsk;
  135. begin
  136. biez := kod;
  137.  
  138. while biez <> nil do
  139. begin
  140. writeln(biez^.zawartosc);
  141. biez := biez^.nast;
  142. end;
  143. end;
  144.  
  145. function RozlozPrzecinek(linia: string) : wsk; //rozklada nazwy zmiennych wypisanych po przecinku do osobnych lini
  146. var
  147. zmienne: wsk;
  148. begin
  149. new(zmienne);
  150.  
  151. while Pos(',', linia) > 0 do
  152. begin
  153. Wstaw(zmienne, Trim(Copy(linia, 1, Pos(',', linia) - 1))); //wstawia do listy element z nazwą zmiennej, która znajduje się przed przecinkiem
  154.  
  155. linia := Copy(linia, Pos(',', linia) + 1, 255); //usuwa nazwię zmiennej znajdującej się przed przecinkiem
  156.  
  157. if Pos(',', linia) = 0 then
  158. begin
  159. Wstaw(zmienne, Trim(linia)); //wstawia do listy ostatnią zmienną z lini
  160. end;
  161. end;
  162.  
  163. RozlozPrzecinek := zmienne;
  164. end;
  165.  
  166. function RozlozVar(sekcja: wsk) : wsk; //"wyciąga" nazwy zmiennych z sekcji var
  167. var
  168. wynik: wsk;
  169. begin
  170. new(wynik);
  171.  
  172. while Pos(':', sekcja^.zawartosc) > 0 do
  173. begin
  174. if Pos(',', sekcja^.zawartosc) > 0 then
  175. begin
  176. Dolacz(wynik, RozlozPrzecinek(Copy(sekcja^.zawartosc, 1, Pos(':', sekcja^.zawartosc) - 1))); //dolacza liste zmiennych z procedury rozlozprzecinek
  177. end
  178. else
  179. begin
  180. Wstaw(wynik, Trim(Copy(sekcja^.zawartosc, 1, Pos(':', sekcja^.zawartosc) - 1))); //wstawia do listy nazwy zmiennych przed znakiem ":"
  181. end;
  182.  
  183. sekcja := sekcja^.nast;
  184. end;
  185.  
  186. if wynik^.zawartosc = '' then
  187. RozlozVar := nil
  188. else
  189. RozlozVar := wynik;
  190. end;
  191.  
  192. procedure RozlozArgumenty(linia:string; kontener:tokeny); //rozklada argumenty
  193. var
  194. argumenty : wsk;
  195. zmienna : string;
  196. begin
  197. new(argumenty);
  198.  
  199. while (Pos(';', linia) > 0) do
  200. begin
  201. zmienna := Copy(linia, 1, Pos(';', linia) - 1); //wycina zawartosc lini az do srednika
  202.  
  203. while Pos(',', zmienna) > 0 do
  204. begin
  205. Wstaw(argumenty, Trim(Copy(zmienna, 1, Pos(',', zmienna) - 1))); //wstawia do listy argument, który stoi przed przecinkiem
  206. zmienna := Copy(zmienna, Pos(',', zmienna) + 1, 255); //usuwa nazwe zmiennych przed przecinkiem
  207. end;
  208.  
  209. linia := Copy(linia, Pos(';', linia) + 1, 255); //usuwa zmienne znajdujące się przed znakiem ";"
  210. Wstaw(argumenty, Trim(Copy(zmienna, 1, Pos(':', zmienna) - 1))); //rozdziela nazwę zmiennej i jej typ, i wstawia do listy
  211. end;
  212.  
  213. Wstaw(argumenty, Trim(Copy(linia, 1, Pos(':', linia) - 1))); //wstawia do listy ostatni argument z lini
  214.  
  215. Dolacz(kontener.zmienne, argumenty);
  216. end;
  217.  
  218. procedure RozlozFunction(ciag:string; kontener:tokeny); //rozklada funkcje
  219. begin
  220. if Pos('(', ciag) > 0 then
  221. begin
  222. RozlozArgumenty(Copy(ciag, Pos('(', ciag) + 1, Pos(')', ciag) - 1 - Pos('(', ciag)), kontener); //rozklada argumenty funkcji
  223. Wstaw(kontener.funkcje, Trim(Copy(ciag, 9, Pos('(', ciag) - 9))); //wstawia do kontenera nazwy
  224. end
  225. else
  226. Wstaw(kontener.funkcje, Trim(Copy(ciag, 9, Pos(':', ciag) - 9))); //wstwia do kontenera to co przed dwukropkiem kiedy funkcja nie posiada nawiasow
  227. end;
  228.  
  229. procedure RozlozProcedure(ciag:string; kontener:tokeny);
  230. begin
  231. if Pos('(', ciag) > 0 then
  232. begin
  233. RozlozArgumenty(Copy(ciag, Pos('(', ciag) + 1, Pos(')', ciag) - 1 - Pos('(', ciag)), kontener); //rozklada procedure
  234. Wstaw(kontener.procedury, Trim(Copy(ciag, 10, Pos('(', ciag) - 10))); //wstawia do kontenera nazwy
  235. end
  236. else
  237. Wstaw(kontener.procedury, Trim(Copy(ciag, 10, Pos(';', ciag) - 10))); //wstwia do kontenera to co przed srednikiem kiedy procedura nie posiada nawiasow
  238. end;
  239.  
  240. function Tokenizuj(kod:wsk) : tokeny; //przygotowuje nazwy do zaciemniania
  241. var
  242. kontener: tokeny;
  243. begin
  244. new(kontener.zmienne);
  245. new(kontener.funkcje);
  246. new(kontener.procedury);
  247.  
  248. while kod <> nil do
  249. begin
  250. if Pos('var', LowerCase(kod^.zawartosc)) > 0 then
  251. begin
  252. Dolacz(kontener.zmienne, RozlozVar(kod^.nast));
  253. end;
  254.  
  255. if (Pos('function ', LowerCase(kod^.zawartosc)) > 0) and (Pos('=', LowerCase(kod^.zawartosc)) = 0) then
  256. begin
  257. RozlozFunction(kod^.zawartosc, kontener);
  258. end;
  259.  
  260. if (Pos('procedure ', LowerCase(kod^.zawartosc)) > 0) and (Pos('=', LowerCase(kod^.zawartosc)) = 0) then
  261. begin
  262. RozlozProcedure(kod^.zawartosc, kontener);
  263. end;
  264.  
  265. kod := kod^.nast;
  266. end;
  267.  
  268. Tokenizuj := kontener;
  269. end;
  270.  
  271. function GenerujNazwe : string; //generuje nazwy do zaciemniania
  272. var
  273. ciag, wynik:string;
  274. begin
  275. ciag := 'abcdefghijklmnopqrstuvwxyz';
  276. wynik := '';
  277.  
  278. repeat
  279. wynik := wynik + ciag[Random(Length(ciag)) + 1];
  280. until (Length(wynik) = 6);
  281.  
  282. GenerujNazwe := wynik;
  283. end;
  284.  
  285. procedure PodmienZmienna(kod : wsk; zmienne: wsk); //podmienia nazwy zmiennych
  286. var
  287. linia:wsk;
  288. nowa_nazwa:string;
  289. begin
  290. linia := kod;
  291.  
  292. while zmienne <> nil do
  293. begin
  294. nowa_nazwa := GenerujNazwe;
  295.  
  296. while linia <> nil do
  297. begin
  298. if (Pos(zmienne^.zawartosc, linia^.zawartosc) > 0) and ((Pos(zmienne^.zawartosc, linia^.zawartosc) > Pos('(', linia^.zawartosc))) then
  299. begin
  300. linia^.zawartosc := StringReplace(linia^.zawartosc, zmienne^.zawartosc, nowa_nazwa, []);
  301. end;
  302.  
  303. linia := linia^.nast;
  304. end;
  305.  
  306. zmienne := zmienne^.nast;
  307. linia := kod;
  308. end;
  309. end;
  310.  
  311. procedure PodmienProcedury(kod : wsk; procedury : wsk); //podmienia nazwy w procedurach
  312. var
  313. linia:wsk;
  314. nowa_nazwa:string;
  315. begin
  316. linia := kod;
  317.  
  318. while procedury <> nil do
  319. begin
  320. nowa_nazwa := GenerujNazwe;
  321.  
  322. while linia <> nil do
  323. begin
  324. if(Pos(procedury^.zawartosc, linia^.zawartosc) > 0) then
  325. begin
  326. linia^.zawartosc := StringReplace(linia^.zawartosc, procedury^.zawartosc, nowa_nazwa, [rfReplaceAll]);
  327. end;
  328.  
  329. linia := linia^.nast;
  330. end;
  331.  
  332. procedury := procedury^.nast;
  333. linia := kod;
  334. end;
  335. end;
  336.  
  337. procedure PodmienFunkcje(kod : wsk; funkcje : wsk); //podmienia nazwy funkcji
  338. begin
  339. PodmienProcedury(kod, funkcje);
  340. end;
  341.  
  342. procedure ZjedzWciecia(kod : wsk); //usuwa wcięcia w każdej lini kodu osobno
  343. begin
  344. while kod <> nil do
  345. begin
  346. kod^.zawartosc := TrimLeft(kod^.zawartosc);
  347. kod := kod^.nast;
  348. end;
  349. end;
  350.  
  351. function Obfuskuj(kod:wsk) : wsk; //obfuskuje
  352. var
  353. kontener: tokeny;
  354. begin
  355. kontener := Tokenizuj(kod);
  356.  
  357. PodmienZmienna(kod, kontener.zmienne);
  358. PodmienFunkcje(kod, kontener.funkcje);
  359. PodmienProcedury(kod, kontener.procedury);
  360.  
  361. ZjedzWciecia(kod);
  362. end;
  363.  
  364. procedure Powitanie;
  365. begin
  366. writeln('Witaj w Obfuscatorze!');
  367. writeln('=====================');
  368. writeln;
  369. write('> Podaj nazwe pliku aby rozpoczac proces zaciemniania: ');
  370. end;
  371.  
  372. procedure UruchomAplikacje;
  373. var
  374. kod: wsk;
  375. nazwa,nazwa1:string;
  376. plik:text;
  377. begin
  378. Powitanie;
  379. readln(plik);
  380. assign(plik, nazwa);
  381. {$I-}
  382. reset(plik);
  383. {$I+}
  384. if (IOResult = 0) then
  385. begin
  386. kod := WczytajPlik(nazwa);
  387.  
  388. writeln('> Plik zostal wczytanie pomyslnie, rozpoczynam zaciemnianie.');
  389. Obfuskuj(kod);
  390. writeln(Concat('> Proces zakonczony. Kod wynikowy zostal zrzucony do pliku ', 'OBFSC_', nazwa1));
  391. ZapiszPlik(Concat('OBFSC_', nazwa1), kod);
  392. end
  393. else
  394. begin
  395. writeln('> Plik nie istnieje badz jest nieosiagalny. Koncze dzialanie.');
  396. end;
  397. end;
  398.  
  399. begin
  400. begin
  401. Randomize;
  402. UruchomAplikacje;
  403.  
  404. readln;
  405. end;
  406. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement