PageRenderTime 214ms CodeModel.GetById 25ms RepoModel.GetById 4ms app.codeStats 0ms

/0.3/command.c

https://github.com/ice799/rr0d
C | 820 lines | 590 code | 182 blank | 48 comment | 18 complexity | 3f73b5dc2526b5560bad72b3ae6043ef MD5 | raw file
  1. /*
  2. * This file is part of the Rasta Ring 0 debug
  3. *
  4. * Copyright (C) 2004 Droids Corporation.
  5. * based on Deblin debuger
  6. *
  7. * $Id: command.c,v 1.31 2006-06-30 12:25:35 serpilliere Exp $
  8. *
  9. */
  10. #include "var_globale.h"
  11. #include "command.h"
  12. #include "utils.h"
  13. #include "import_symb.h"
  14. /* without that gcc complains on FreeBSD */
  15. char cmd_result[80]; /* buffer for entered command */
  16. unsigned int adresse_ret_1;
  17. unsigned int adresse_ret_2;
  18. unsigned int edit_mode=0;
  19. #define STATE_ADD 1000000
  20. #define STATE_NO_COMMAND 1
  21. #define STATE_COMMAND 2
  22. #define STATE_HEXA 3
  23. #define STATE_RASTA 4
  24. #define STATE_UNRASTA 5
  25. #define STATE_INVALID 1337
  26. #define STATE_END 666
  27. #define CMD_VER 1000000
  28. #define CMD_E_DATA 1000001
  29. #define CMD_TEST 1000002
  30. #define CMD_E_CODE 1000003
  31. #define CMD_RASTA 1000004
  32. #define CMD_UNRASTA 1000005
  33. #define CMD_SET 1000006
  34. #define CMD_PARSEREG 1000100
  35. #define CMD_HELP 1000007
  36. #define CMD_BPX 1000008
  37. #define CMD_BC 1000009
  38. #define CMD_BL 1000010
  39. #define CMD_IDT 1000011
  40. #define CMD_BPM 1000012
  41. #define CMD_LOAD_SYMB 1000013
  42. #define CMD_PAGE_INFO 1000014
  43. #define CMD_SYMB 1000015
  44. #define CMD_PRINT 1000016
  45. #define CMD_EDITMEM 1000017
  46. #define CMD_INTHOOK 1000018
  47. #define CMD_RDTSCHOOK 1000019
  48. #define CMD_F001 1000020
  49. #define CMD_UNF001 1000021
  50. #define CMD_E_DATA_END 1100001
  51. #define CMD_E_CODE_END 1100003
  52. #define CMD_BPX_END 1100008
  53. #define CMD_BC_END 1100009
  54. #define CMD_SET_END 1100006
  55. #define CMD_BPM_END 1100010
  56. #define CMD_PAGE_INFO_END 1100014
  57. #define CMD_PRINT_END 1100016
  58. #define CMD_INTHOOK_END 1100018
  59. #define CMD_LOAD_SYMB_BIS 1100024
  60. #define CMD_LOAD_SYMB_END 1100025
  61. int nbr_arg=0;
  62. #define MAX_CMD 20
  63. /*table des commande possibles */
  64. char *table_command[]=
  65. {
  66. "VER",
  67. "D",
  68. "DROIDS",
  69. "U",
  70. "RASTA",
  71. "UNRASTA",
  72. "R",
  73. "HELP",
  74. "BPX",
  75. "BC",
  76. "BL",
  77. "IDT",
  78. "BPM",
  79. "LOAD",
  80. "PAGE",
  81. "SYMB",
  82. "PRINT",
  83. "E",
  84. "INTHOOK",
  85. "RDTSCHOOK",
  86. "f001",
  87. "unf001",
  88. 0
  89. };
  90. /*tables des réponses aux commandes possibles */
  91. char *command_res[]=
  92. {
  93. "RasTa Ring0 DebUgger v0.3 zeta ",
  94. "D adresse, man ",
  95. "RuLEZ ",
  96. "U adresse, man ",
  97. "Rasta mode On (sweet, man) ",
  98. "Rasta mode Off(keep rasta, man)",
  99. "SET data, man ",
  100. "need some help man? ",
  101. "soft break, man ",
  102. "del break, man ",
  103. "bp green list, man ",
  104. "idt ",
  105. "hard break point, man ",
  106. "Load Symbol man ",
  107. "Info on pages man ",
  108. "Info on symbols, man ",
  109. "Print reg ",
  110. "Edit the memory man ",
  111. "ON/OFF hook interrupt N ",
  112. "ON/OFF hook rdtsc ",
  113. "°±²Û²±° 0xf001 ON °±²Û²±° ",
  114. "°±²Û²±° 0xf001 OFF °±²Û²±° ",
  115. };
  116. /*table des registres possibles en argument */
  117. char *table_reg[]=
  118. {
  119. "EAX",
  120. "EBX",
  121. "ECX",
  122. "EDX",
  123. "ESI",
  124. "EDI",
  125. "EIP",
  126. "ESP",
  127. "EBP",
  128. "DR0",
  129. "DR1",
  130. "DR2",
  131. "DR3",
  132. "DR6",
  133. "DR7",
  134. 0
  135. };
  136. /*compare 2 chaine de char */
  137. /* int cmp_string(char *text,char *buf) */
  138. /* { */
  139. /* if (! (text && buf) ) */
  140. /* return 0; */
  141. /* /\* */
  142. /* if ( (*text) != (*buf) ) */
  143. /* return 0; */
  144. /* *\/ */
  145. /* while (( (*text) && (*buf)) && */
  146. /* ( ((*text) == (*buf))|| */
  147. /* ((*text | 0x20) == (*buf | 0x20)) )) */
  148. /* { */
  149. /* text++; */
  150. /* buf++; */
  151. /* } */
  152. /* return ( (*text == *buf) || (*text == *buf)); */
  153. /* } */
  154. /*renvoie le num de commande entrée */
  155. int chose_command(char* command)
  156. {
  157. int i=0;
  158. while( table_command[i] != 0 )
  159. {
  160. if (!rr0d_stricmp(command, table_command[i]))
  161. {
  162. rr0d_strcpy(cmd_result, command_res[i]);
  163. // printf("pouet 1");
  164. return i+STATE_ADD;
  165. }
  166. i++;
  167. }
  168. // printf("BAD 1");
  169. rr0d_strcpy(cmd_result, "parse: invalid cmd, man");
  170. return 0;
  171. }
  172. /*renvoie le num du registre entré */
  173. int chose_reg(char* reg)
  174. {
  175. int i=0;
  176. while(table_reg[i] != 0)
  177. {
  178. if (!rr0d_strnicmp(reg, table_reg[i], 3))
  179. {
  180. return i;
  181. }
  182. i++;
  183. }
  184. return -1;
  185. }
  186. unsigned int chose_symb(char* symb)
  187. {
  188. int i;
  189. i = 0;
  190. while(tab_import_symb[i].address && (i<MAX_SYMBOL))
  191. {
  192. if (!rr0d_strnicmp(symb, tab_import_symb[i].name, rr0d_strlen(tab_import_symb[i].name)))
  193. {
  194. return i;
  195. }
  196. i++;
  197. }
  198. return -1;
  199. }
  200. unsigned int adresse_tmp =0;
  201. unsigned int next_state = 0;
  202. unsigned int num_reg;
  203. /*automate reconnaissant le langage de rr0d */
  204. /*parse_ret est l'entier représentant la commande */
  205. /*parsée */
  206. /*adresse_ret1 est l'argument 1 de la commande */
  207. /*parsée (peut ne pas etre utilisé) */
  208. /*adresse_ret2 est l'argument 2 de la commande */
  209. /*parsée (peut ne pas etre utilisé) */
  210. int parse_command(char* command)
  211. {
  212. char c;
  213. int i=0;
  214. int state = STATE_NO_COMMAND;
  215. int ret;
  216. int num_s;
  217. int rr;
  218. int fini=0;
  219. int parse_ret=0;
  220. char* start_cmd = (char*)0;
  221. char* start_reg = (char*)0;
  222. fini=0;
  223. while(!fini)
  224. {
  225. c = command[i];
  226. switch(state)
  227. {
  228. case STATE_NO_COMMAND:
  229. switch(c)
  230. {
  231. case ' ':
  232. case 0:
  233. i++;
  234. break;
  235. default:
  236. start_cmd = &command[i];
  237. i++;
  238. state = STATE_COMMAND;
  239. break;
  240. }
  241. break;
  242. case STATE_COMMAND:
  243. switch(c)
  244. {
  245. case 0:
  246. case ' ':
  247. command[i]=0;
  248. i++;
  249. ret = chose_command(start_cmd);
  250. if (!ret)
  251. {
  252. state = STATE_INVALID;
  253. break;
  254. }
  255. state = ret;
  256. break;
  257. default:
  258. i++;
  259. break;
  260. }
  261. break;
  262. case CMD_E_DATA:
  263. switch(c)
  264. {
  265. case ' ':
  266. i++;
  267. break;
  268. case 0:
  269. state = STATE_INVALID;
  270. break;
  271. default:
  272. state = STATE_HEXA;
  273. next_state = CMD_E_DATA_END;
  274. adresse_tmp=0;
  275. break;
  276. }
  277. break;
  278. case CMD_E_CODE:
  279. switch(c)
  280. {
  281. case ' ':
  282. i++;
  283. break;
  284. case 0:
  285. state = STATE_INVALID;
  286. break;
  287. default:
  288. state = STATE_HEXA;
  289. next_state = CMD_E_CODE_END;
  290. adresse_tmp=0;
  291. break;
  292. }
  293. break;
  294. case STATE_HEXA:
  295. if ((rr = chose_reg(&command[i]))!=-1)
  296. {
  297. switch(rr)
  298. {
  299. case 0:
  300. adresse_tmp = reg_stack->reg_EAX;
  301. break;
  302. case 1:
  303. adresse_tmp = reg_stack->reg_EBX;
  304. break;
  305. case 2:
  306. adresse_tmp = reg_stack->reg_ECX;
  307. break;
  308. case 3:
  309. adresse_tmp = reg_stack->reg_EDX;
  310. break;
  311. case 4:
  312. adresse_tmp = reg_stack->reg_ESI;
  313. break;
  314. case 5:
  315. adresse_tmp = reg_stack->reg_EDI;
  316. break;
  317. case 6:
  318. adresse_tmp = reg_stack->reg_EIP;
  319. break;
  320. case 7:
  321. adresse_tmp = reg_stack->reg_ESP;
  322. break;
  323. case 8:
  324. adresse_tmp = reg_stack->reg_EBP;
  325. break;
  326. default:
  327. adresse_tmp = 0xDEADFACE;
  328. break;
  329. }
  330. i+=3;
  331. }
  332. else
  333. if ((num_s = chose_symb(&command[i]))!=-1)
  334. {
  335. adresse_tmp = tab_import_symb[num_s].address;
  336. i+=rr0d_strlen(tab_import_symb[num_s].name);
  337. break;
  338. }else
  339. {
  340. if ((c >= 'A') && (c <= 'F') )
  341. {
  342. c = c - 'A' + 10;
  343. adresse_tmp= adresse_tmp<<4;
  344. adresse_tmp+=c;
  345. i++;
  346. break;
  347. }
  348. if ((c >= 'a') && (c <= 'f') )
  349. {
  350. c = c - 'a' + 10;
  351. adresse_tmp= adresse_tmp<<4;
  352. adresse_tmp+=c;
  353. i++;
  354. break;
  355. }
  356. if ((c >= '0') && (c <= '9') )
  357. {
  358. c = c - '0';
  359. adresse_tmp= adresse_tmp<<4;
  360. adresse_tmp+=c;
  361. i++;
  362. break;
  363. }
  364. }
  365. state = next_state;
  366. break;
  367. case CMD_E_DATA_END:
  368. adresse_ret_1 = adresse_tmp;
  369. state = STATE_END;
  370. parse_ret = 2;
  371. break;
  372. case CMD_E_CODE_END:
  373. adresse_ret_2 = adresse_tmp;
  374. state = STATE_END;
  375. parse_ret = 3;
  376. break;
  377. case CMD_RASTA:
  378. fini = 1;
  379. parse_ret = 4;
  380. break;
  381. case CMD_UNRASTA:
  382. fini = 1;
  383. parse_ret = 5;
  384. break;
  385. case CMD_SET:
  386. switch(c)
  387. {
  388. case ' ':
  389. i++;
  390. break;
  391. case 0:
  392. state = STATE_INVALID;
  393. break;
  394. default:
  395. start_reg = &command[i];
  396. state = CMD_PARSEREG;
  397. next_state = STATE_HEXA;
  398. adresse_tmp=0;
  399. parse_ret = 6;
  400. break;
  401. }
  402. break;
  403. case CMD_PARSEREG:
  404. switch(c)
  405. {
  406. case ' ':
  407. command[i]=0;
  408. if ( (num_reg=chose_reg(start_reg))==-1)
  409. {
  410. state = STATE_INVALID;
  411. break;
  412. }
  413. adresse_ret_2 = num_reg;
  414. i++;
  415. state = next_state;
  416. next_state = CMD_SET_END;
  417. break;
  418. /*
  419. case 0:
  420. state = STATE_INVALID;
  421. break;
  422. */
  423. default:
  424. i++;
  425. break;
  426. }
  427. break;
  428. case CMD_SET_END:
  429. adresse_ret_1 = adresse_tmp;
  430. fini =1;
  431. break;
  432. case STATE_INVALID:
  433. fini = 1;
  434. parse_ret = 0;
  435. break;
  436. case STATE_END:
  437. fini = 1;
  438. break;
  439. case CMD_VER:
  440. case CMD_TEST:
  441. fini = 1;
  442. parse_ret = 1;
  443. break;
  444. case CMD_HELP:
  445. fini = 1;
  446. parse_ret = 8;
  447. break;
  448. case CMD_BPX:
  449. switch(c)
  450. {
  451. case ' ':
  452. i++;
  453. break;
  454. case 0:
  455. state = STATE_INVALID;
  456. break;
  457. default:
  458. state = STATE_HEXA;
  459. next_state = CMD_BPX_END;
  460. adresse_tmp=0;
  461. break;
  462. }
  463. break;
  464. case CMD_BPM:
  465. switch(c)
  466. {
  467. case ' ':
  468. i++;
  469. break;
  470. case 0:
  471. state = STATE_INVALID;
  472. break;
  473. default:
  474. state = STATE_HEXA;
  475. next_state = CMD_BPM_END;
  476. adresse_tmp=0;
  477. break;
  478. }
  479. break;
  480. case CMD_PAGE_INFO:
  481. switch(c)
  482. {
  483. case ' ':
  484. i++;
  485. break;
  486. case 0:
  487. state = STATE_INVALID;
  488. break;
  489. default:
  490. state = STATE_HEXA;
  491. next_state = CMD_PAGE_INFO_END;
  492. adresse_tmp=0;
  493. break;
  494. }
  495. break;
  496. case CMD_BC:
  497. switch(c)
  498. {
  499. case ' ':
  500. i++;
  501. break;
  502. case 0:
  503. state = STATE_INVALID;
  504. break;
  505. default:
  506. state = STATE_HEXA;
  507. next_state = CMD_BC_END;
  508. adresse_tmp=0;
  509. break;
  510. }
  511. break;
  512. case CMD_LOAD_SYMB:
  513. switch(c)
  514. {
  515. case ' ':
  516. i++;
  517. break;
  518. case 0:
  519. state = STATE_INVALID;
  520. break;
  521. default:
  522. state = STATE_HEXA;
  523. next_state = CMD_LOAD_SYMB_BIS;
  524. adresse_tmp=0;
  525. break;
  526. }
  527. break;
  528. case CMD_LOAD_SYMB_BIS:
  529. switch(c)
  530. {
  531. case ' ':
  532. i++;
  533. break;
  534. case 0:
  535. state = STATE_INVALID;
  536. break;
  537. default:
  538. state = STATE_HEXA;
  539. adresse_ret_1 = adresse_tmp;
  540. next_state = CMD_LOAD_SYMB_END;
  541. adresse_tmp=0;
  542. break;
  543. }
  544. break;
  545. case CMD_INTHOOK:
  546. switch(c)
  547. {
  548. case ' ':
  549. i++;
  550. break;
  551. case 0:
  552. state = STATE_INVALID;
  553. break;
  554. default:
  555. state = STATE_HEXA;
  556. next_state = CMD_INTHOOK_END;
  557. adresse_tmp=0;
  558. break;
  559. }
  560. break;
  561. case CMD_BPX_END:
  562. adresse_ret_1 = adresse_tmp;
  563. state = STATE_END;
  564. parse_ret = 9;
  565. break;
  566. case CMD_BC_END:
  567. adresse_ret_1 = adresse_tmp;
  568. state = STATE_END;
  569. parse_ret = 10;
  570. break;
  571. case CMD_BL:
  572. fini = 1;
  573. parse_ret = 11;
  574. break;
  575. case CMD_IDT:
  576. fini = 1;
  577. parse_ret = 12;
  578. break;
  579. case CMD_BPM_END:
  580. adresse_ret_1 = adresse_tmp;
  581. state = STATE_END;
  582. parse_ret = 13;
  583. break;
  584. case CMD_LOAD_SYMB_END:
  585. adresse_ret_2 = adresse_tmp;
  586. state = STATE_END;
  587. parse_ret = 14;
  588. break;
  589. case CMD_PAGE_INFO_END:
  590. adresse_ret_1 = adresse_tmp;
  591. state = STATE_END;
  592. parse_ret = 15;
  593. break;
  594. case CMD_SYMB:
  595. fini = 1;
  596. parse_ret = 16;
  597. break;
  598. case CMD_PRINT:
  599. fini = 1;
  600. // command[i]=0;
  601. if ( (num_reg=chose_reg(&command[i]))==-1)
  602. {
  603. state = STATE_INVALID;
  604. break;
  605. }
  606. parse_ret = 0xff;
  607. adresse_ret_2 = num_reg;
  608. break;
  609. case CMD_EDITMEM:
  610. fini = 1;
  611. parse_ret = 17;
  612. edit_mode = !edit_mode;
  613. break;
  614. case CMD_INTHOOK_END:
  615. adresse_ret_1 = adresse_tmp;
  616. state = STATE_END;
  617. parse_ret = 18;
  618. break;
  619. case CMD_RDTSCHOOK:
  620. fini = 1;
  621. parse_ret = 19;
  622. break;
  623. case CMD_F001:
  624. fini = 1;
  625. parse_ret = 20; /* f001 mode on*/
  626. break;
  627. case CMD_UNF001:
  628. fini = 1;
  629. parse_ret = 21; /* f001 mode off */
  630. break;
  631. default:
  632. fini = 1;
  633. parse_ret = 0;
  634. break;
  635. }
  636. }
  637. return parse_ret;
  638. }