Advertisement
captmicro

Untitled

Mar 27th, 2011
277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.96 KB | None | 0 0
  1. // ADE32 version 2.02c -- C edition
  2.  
  3. #define WIN32_LEAN_AND_MEAN
  4. #define WIN32_EXTRA_LEAN
  5.  
  6. #include <windows.h>
  7.  
  8. #include "ADE32.h"
  9.  
  10. DWORD ade32_table[512] = {
  11. /* 00 */ C_MODRM,
  12. /* 01 */ C_MODRM,
  13. /* 02 */ C_MODRM,
  14. /* 03 */ C_MODRM,
  15. /* 04 */ C_DATA1,
  16. /* 05 */ C_DATA66,
  17. /* 06 */ C_BAD,
  18. /* 07 */ C_BAD,
  19. /* 08 */ C_MODRM,
  20. /* 09 */ C_MODRM,
  21. /* 0A */ C_MODRM,
  22. /* 0B */ C_MODRM,
  23. /* 0C */ C_DATA1,
  24. /* 0D */ C_DATA66,
  25. /* 0E */ C_BAD,
  26. /* 0F */ C_OPCODE2,
  27. /* 10 */ C_MODRM+C_BAD,
  28. /* 11 */ C_MODRM,
  29. /* 12 */ C_MODRM+C_BAD,
  30. /* 13 */ C_MODRM,
  31. /* 14 */ C_DATA1+C_BAD,
  32. /* 15 */ C_DATA66+C_BAD,
  33. /* 16 */ C_BAD,
  34. /* 17 */ C_BAD,
  35. /* 18 */ C_MODRM+C_BAD,
  36. /* 19 */ C_MODRM,
  37. /* 1A */ C_MODRM,
  38. /* 1B */ C_MODRM,
  39. /* 1C */ C_DATA1+C_BAD,
  40. /* 1D */ C_DATA66+C_BAD,
  41. /* 1E */ C_BAD,
  42. /* 1F */ C_BAD,
  43. /* 20 */ C_MODRM,
  44. /* 21 */ C_MODRM,
  45. /* 22 */ C_MODRM,
  46. /* 23 */ C_MODRM,
  47. /* 24 */ C_DATA1,
  48. /* 25 */ C_DATA66,
  49. /* 26 */ C_SEG+C_BAD,
  50. /* 27 */ C_BAD,
  51. /* 28 */ C_MODRM,
  52. /* 29 */ C_MODRM,
  53. /* 2A */ C_MODRM,
  54. /* 2B */ C_MODRM,
  55. /* 2C */ C_DATA1,
  56. /* 2D */ C_DATA66,
  57. /* 2E */ C_SEG+C_BAD,
  58. /* 2F */ C_BAD,
  59. /* 30 */ C_MODRM,
  60. /* 31 */ C_MODRM,
  61. /* 32 */ C_MODRM,
  62. /* 33 */ C_MODRM,
  63. /* 34 */ C_DATA1,
  64. /* 35 */ C_DATA66,
  65. /* 36 */ C_SEG+C_BAD,
  66. /* 37 */ C_BAD,
  67. /* 38 */ C_MODRM,
  68. /* 39 */ C_MODRM,
  69. /* 3A */ C_MODRM,
  70. /* 3B */ C_MODRM,
  71. /* 3C */ C_DATA1,
  72. /* 3D */ C_DATA66,
  73. /* 3E */ C_SEG+C_BAD,
  74. /* 3F */ C_BAD,
  75. /* 40 */ 0,
  76. /* 41 */ 0,
  77. /* 42 */ 0,
  78. /* 43 */ 0,
  79. /* 44 */ C_BAD,
  80. /* 45 */ 0,
  81. /* 46 */ 0,
  82. /* 47 */ 0,
  83. /* 48 */ 0,
  84. /* 49 */ 0,
  85. /* 4A */ 0,
  86. /* 4B */ 0,
  87. /* 4C */ C_BAD,
  88. /* 4D */ 0,
  89. /* 4E */ 0,
  90. /* 4F */ 0,
  91. /* 50 */ 0,
  92. /* 51 */ 0,
  93. /* 52 */ 0,
  94. /* 53 */ 0,
  95. /* 54 */ 0,
  96. /* 55 */ 0,
  97. /* 56 */ 0,
  98. /* 57 */ 0,
  99. /* 58 */ 0,
  100. /* 59 */ 0,
  101. /* 5A */ 0,
  102. /* 5B */ 0,
  103. /* 5C */ C_BAD,
  104. /* 5D */ 0,
  105. /* 5E */ 0,
  106. /* 5F */ 0,
  107. /* 60 */ C_BAD,
  108. /* 61 */ C_BAD,
  109. /* 62 */ C_MODRM+C_BAD,
  110. /* 63 */ C_MODRM+C_BAD,
  111. /* 64 */ C_SEG,
  112. /* 65 */ C_SEG+C_BAD,
  113. /* 66 */ C_66,
  114. /* 67 */ C_67,
  115. /* 68 */ C_DATA66,
  116. /* 69 */ C_MODRM+C_DATA66,
  117. /* 6A */ C_DATA1,
  118. /* 6B */ C_MODRM+C_DATA1,
  119. /* 6C */ C_BAD,
  120. /* 6D */ C_BAD,
  121. /* 6E */ C_BAD,
  122. /* 6F */ C_BAD,
  123. /* 70 */ C_DATA1+C_REL+C_BAD,
  124. /* 71 */ C_DATA1+C_REL+C_BAD,
  125. /* 72 */ C_DATA1+C_REL,
  126. /* 73 */ C_DATA1+C_REL,
  127. /* 74 */ C_DATA1+C_REL,
  128. /* 75 */ C_DATA1+C_REL,
  129. /* 76 */ C_DATA1+C_REL,
  130. /* 77 */ C_DATA1+C_REL,
  131. /* 78 */ C_DATA1+C_REL,
  132. /* 79 */ C_DATA1+C_REL,
  133. /* 7A */ C_DATA1+C_REL+C_BAD,
  134. /* 7B */ C_DATA1+C_REL+C_BAD,
  135. /* 7C */ C_DATA1+C_REL,
  136. /* 7D */ C_DATA1+C_REL,
  137. /* 7E */ C_DATA1+C_REL,
  138. /* 7F */ C_DATA1+C_REL,
  139. /* 80 */ C_MODRM+C_DATA1,
  140. /* 81 */ C_MODRM+C_DATA66,
  141. /* 82 */ C_MODRM+C_DATA1+C_BAD,
  142. /* 83 */ C_MODRM+C_DATA1,
  143. /* 84 */ C_MODRM,
  144. /* 85 */ C_MODRM,
  145. /* 86 */ C_MODRM,
  146. /* 87 */ C_MODRM,
  147. /* 88 */ C_MODRM,
  148. /* 89 */ C_MODRM,
  149. /* 8A */ C_MODRM,
  150. /* 8B */ C_MODRM,
  151. /* 8C */ C_MODRM+C_BAD,
  152. /* 8D */ C_MODRM,
  153. /* 8E */ C_MODRM+C_BAD,
  154. /* 8F */ C_MODRM,
  155. /* 90 */ 0,
  156. /* 91 */ 0,
  157. /* 92 */ 0,
  158. /* 93 */ C_BAD,
  159. /* 94 */ C_BAD,
  160. /* 95 */ C_BAD,
  161. /* 96 */ C_BAD,
  162. /* 97 */ C_BAD,
  163. /* 98 */ C_BAD,
  164. /* 99 */ 0,
  165. /* 9A */ C_DATA66+C_DATA2+C_BAD,
  166. /* 9B */ 0,
  167. /* 9C */ C_BAD,
  168. /* 9D */ C_BAD,
  169. /* 9E */ C_BAD,
  170. /* 9F */ C_BAD,
  171. /* A0 */ C_ADDR67,
  172. /* A1 */ C_ADDR67,
  173. /* A2 */ C_ADDR67,
  174. /* A3 */ C_ADDR67,
  175. /* A4 */ 0,
  176. /* A5 */ 0,
  177. /* A6 */ 0,
  178. /* A7 */ 0,
  179. /* A8 */ C_DATA1,
  180. /* A9 */ C_DATA66,
  181. /* AA */ 0,
  182. /* AB */ 0,
  183. /* AC */ 0,
  184. /* AD */ C_BAD,
  185. /* AE */ 0,
  186. /* AF */ C_BAD,
  187. /* B0 */ C_DATA1,
  188. /* B1 */ C_DATA1,
  189. /* B2 */ C_DATA1,
  190. /* B3 */ C_DATA1,
  191. /* B4 */ C_DATA1,
  192. /* B5 */ C_DATA1,
  193. /* B6 */ C_DATA1+C_BAD,
  194. /* B7 */ C_DATA1+C_BAD,
  195. /* B8 */ C_DATA66,
  196. /* B9 */ C_DATA66,
  197. /* BA */ C_DATA66,
  198. /* BB */ C_DATA66,
  199. /* BC */ C_DATA66+C_BAD,
  200. /* BD */ C_DATA66,
  201. /* BE */ C_DATA66,
  202. /* BF */ C_DATA66,
  203. /* C0 */ C_MODRM+C_DATA1,
  204. /* C1 */ C_MODRM+C_DATA1,
  205. /* C2 */ C_DATA2+C_STOP,
  206. /* C3 */ C_STOP,
  207. /* C4 */ C_MODRM+C_BAD,
  208. /* C5 */ C_MODRM+C_BAD,
  209. /* C6 */ C_MODRM+C_DATA1,
  210. /* C7 */ C_MODRM+C_DATA66,
  211. /* C8 */ C_DATA2+C_DATA1,
  212. /* C9 */ 0,
  213. /* CA */ C_DATA2+C_STOP+C_BAD,
  214. /* CB */ C_STOP+C_BAD,
  215. /* CC */ C_BAD,
  216. /* CD */ C_BAD,
  217. /* CE */ C_BAD,
  218. /* CF */ C_STOP+C_BAD,
  219. /* D0 */ C_MODRM,
  220. /* D1 */ C_MODRM,
  221. /* D2 */ C_MODRM,
  222. /* D3 */ C_MODRM,
  223. /* D4 */ C_DATA1+C_BAD,
  224. /* D5 */ C_DATA1+C_BAD,
  225. /* D6 */ C_BAD,
  226. /* D7 */ C_BAD,
  227. /* D8 */ C_MODRM,
  228. /* D9 */ C_MODRM,
  229. /* DA */ C_MODRM,
  230. /* DB */ C_MODRM,
  231. /* DC */ C_MODRM,
  232. /* DD */ C_MODRM,
  233. /* DE */ C_MODRM,
  234. /* DF */ C_MODRM,
  235. /* E0 */ C_DATA1+C_REL+C_BAD,
  236. /* E1 */ C_DATA1+C_REL+C_BAD,
  237. /* E2 */ C_DATA1+C_REL,
  238. /* E3 */ C_DATA1+C_REL,
  239. /* E4 */ C_DATA1+C_BAD,
  240. /* E5 */ C_DATA1+C_BAD,
  241. /* E6 */ C_DATA1+C_BAD,
  242. /* E7 */ C_DATA1+C_BAD,
  243. /* E8 */ C_DATA66+C_REL,
  244. /* E9 */ C_DATA66+C_REL+C_STOP,
  245. /* EA */ C_DATA66+C_DATA2+C_BAD,
  246. /* EB */ C_DATA1+C_REL+C_STOP,
  247. /* EC */ C_BAD,
  248. /* ED */ C_BAD,
  249. /* EE */ C_BAD,
  250. /* EF */ C_BAD,
  251. /* F0 */ C_LOCK+C_BAD,
  252. /* F1 */ C_BAD,
  253. /* F2 */ C_REP,
  254. /* F3 */ C_REP,
  255. /* F4 */ C_BAD,
  256. /* F5 */ C_BAD,
  257. /* F6 */ C_MODRM,
  258. /* F7 */ C_MODRM,
  259. /* F8 */ 0,
  260. /* F9 */ 0,
  261. /* FA */ C_BAD,
  262. /* FB */ C_BAD,
  263. /* FC */ 0,
  264. /* FD */ 0,
  265. /* FE */ C_MODRM,
  266. /* FF */ C_MODRM,
  267. /* 00 */ C_MODRM,
  268. /* 01 */ C_MODRM,
  269. /* 02 */ C_MODRM,
  270. /* 03 */ C_MODRM,
  271. /* 04 */ C_ERROR,
  272. /* 05 */ C_ERROR,
  273. /* 06 */ 0,
  274. /* 07 */ C_ERROR,
  275. /* 08 */ 0,
  276. /* 09 */ 0,
  277. /* 0A */ 0,
  278. /* 0B */ 0,
  279. /* 0C */ C_ERROR,
  280. /* 0D */ C_ERROR,
  281. /* 0E */ C_ERROR,
  282. /* 0F */ C_ERROR,
  283. /* 10 */ C_ERROR,
  284. /* 11 */ C_ERROR,
  285. /* 12 */ C_ERROR,
  286. /* 13 */ C_ERROR,
  287. /* 14 */ C_ERROR,
  288. /* 15 */ C_ERROR,
  289. /* 16 */ C_ERROR,
  290. /* 17 */ C_ERROR,
  291. /* 18 */ C_ERROR,
  292. /* 19 */ C_ERROR,
  293. /* 1A */ C_ERROR,
  294. /* 1B */ C_ERROR,
  295. /* 1C */ C_ERROR,
  296. /* 1D */ C_ERROR,
  297. /* 1E */ C_ERROR,
  298. /* 1F */ C_ERROR,
  299. /* 20 */ C_ERROR,
  300. /* 21 */ C_ERROR,
  301. /* 22 */ C_ERROR,
  302. /* 23 */ C_ERROR,
  303. /* 24 */ C_ERROR,
  304. /* 25 */ C_ERROR,
  305. /* 26 */ C_ERROR,
  306. /* 27 */ C_ERROR,
  307. /* 28 */ C_ERROR,
  308. /* 29 */ C_ERROR,
  309. /* 2A */ C_ERROR,
  310. /* 2B */ C_ERROR,
  311. /* 2C */ C_ERROR,
  312. /* 2D */ C_ERROR,
  313. /* 2E */ C_ERROR,
  314. /* 2F */ C_ERROR,
  315. /* 30 */ C_ERROR,
  316. /* 31 */ C_ERROR,
  317. /* 32 */ C_ERROR,
  318. /* 33 */ C_ERROR,
  319. /* 34 */ C_ERROR,
  320. /* 35 */ C_ERROR,
  321. /* 36 */ C_ERROR,
  322. /* 37 */ C_ERROR,
  323. /* 38 */ C_ERROR,
  324. /* 39 */ C_ERROR,
  325. /* 3A */ C_ERROR,
  326. /* 3B */ C_ERROR,
  327. /* 3C */ C_ERROR,
  328. /* 3D */ C_ERROR,
  329. /* 3E */ C_ERROR,
  330. /* 3F */ C_ERROR,
  331. /* 40 */ C_ERROR,
  332. /* 41 */ C_ERROR,
  333. /* 42 */ C_ERROR,
  334. /* 43 */ C_ERROR,
  335. /* 44 */ C_ERROR,
  336. /* 45 */ C_ERROR,
  337. /* 46 */ C_ERROR,
  338. /* 47 */ C_ERROR,
  339. /* 48 */ C_ERROR,
  340. /* 49 */ C_ERROR,
  341. /* 4A */ C_ERROR,
  342. /* 4B */ C_ERROR,
  343. /* 4C */ C_ERROR,
  344. /* 4D */ C_ERROR,
  345. /* 4E */ C_ERROR,
  346. /* 4F */ C_ERROR,
  347. /* 50 */ C_ERROR,
  348. /* 51 */ C_ERROR,
  349. /* 52 */ C_ERROR,
  350. /* 53 */ C_ERROR,
  351. /* 54 */ C_ERROR,
  352. /* 55 */ C_ERROR,
  353. /* 56 */ C_ERROR,
  354. /* 57 */ C_ERROR,
  355. /* 58 */ C_ERROR,
  356. /* 59 */ C_ERROR,
  357. /* 5A */ C_ERROR,
  358. /* 5B */ C_ERROR,
  359. /* 5C */ C_ERROR,
  360. /* 5D */ C_ERROR,
  361. /* 5E */ C_ERROR,
  362. /* 5F */ C_ERROR,
  363. /* 60 */ C_ERROR,
  364. /* 61 */ C_ERROR,
  365. /* 62 */ C_ERROR,
  366. /* 63 */ C_ERROR,
  367. /* 64 */ C_ERROR,
  368. /* 65 */ C_ERROR,
  369. /* 66 */ C_ERROR,
  370. /* 67 */ C_ERROR,
  371. /* 68 */ C_ERROR,
  372. /* 69 */ C_ERROR,
  373. /* 6A */ C_ERROR,
  374. /* 6B */ C_ERROR,
  375. /* 6C */ C_ERROR,
  376. /* 6D */ C_ERROR,
  377. /* 6E */ C_ERROR,
  378. /* 6F */ C_ERROR,
  379. /* 70 */ C_ERROR,
  380. /* 71 */ C_ERROR,
  381. /* 72 */ C_ERROR,
  382. /* 73 */ C_ERROR,
  383. /* 74 */ C_ERROR,
  384. /* 75 */ C_ERROR,
  385. /* 76 */ C_ERROR,
  386. /* 77 */ C_ERROR,
  387. /* 78 */ C_ERROR,
  388. /* 79 */ C_ERROR,
  389. /* 7A */ C_ERROR,
  390. /* 7B */ C_ERROR,
  391. /* 7C */ C_ERROR,
  392. /* 7D */ C_ERROR,
  393. /* 7E */ C_ERROR,
  394. /* 7F */ C_ERROR,
  395. /* 80 */ C_DATA66+C_REL,
  396. /* 81 */ C_DATA66+C_REL,
  397. /* 82 */ C_DATA66+C_REL,
  398. /* 83 */ C_DATA66+C_REL,
  399. /* 84 */ C_DATA66+C_REL,
  400. /* 85 */ C_DATA66+C_REL,
  401. /* 86 */ C_DATA66+C_REL,
  402. /* 87 */ C_DATA66+C_REL,
  403. /* 88 */ C_DATA66+C_REL,
  404. /* 89 */ C_DATA66+C_REL,
  405. /* 8A */ C_DATA66+C_REL,
  406. /* 8B */ C_DATA66+C_REL,
  407. /* 8C */ C_DATA66+C_REL,
  408. /* 8D */ C_DATA66+C_REL,
  409. /* 8E */ C_DATA66+C_REL,
  410. /* 8F */ C_DATA66+C_REL,
  411. /* 90 */ C_MODRM,
  412. /* 91 */ C_MODRM,
  413. /* 92 */ C_MODRM,
  414. /* 93 */ C_MODRM,
  415. /* 94 */ C_MODRM,
  416. /* 95 */ C_MODRM,
  417. /* 96 */ C_MODRM,
  418. /* 97 */ C_MODRM,
  419. /* 98 */ C_MODRM,
  420. /* 99 */ C_MODRM,
  421. /* 9A */ C_MODRM,
  422. /* 9B */ C_MODRM,
  423. /* 9C */ C_MODRM,
  424. /* 9D */ C_MODRM,
  425. /* 9E */ C_MODRM,
  426. /* 9F */ C_MODRM,
  427. /* A0 */ 0,
  428. /* A1 */ 0,
  429. /* A2 */ 0,
  430. /* A3 */ C_MODRM,
  431. /* A4 */ C_MODRM+C_DATA1,
  432. /* A5 */ C_MODRM,
  433. /* A6 */ C_ERROR,
  434. /* A7 */ C_ERROR,
  435. /* A8 */ 0,
  436. /* A9 */ 0,
  437. /* AA */ 0,
  438. /* AB */ C_MODRM,
  439. /* AC */ C_MODRM+C_DATA1,
  440. /* AD */ C_MODRM,
  441. /* AE */ C_ERROR,
  442. /* AF */ C_MODRM,
  443. /* B0 */ C_MODRM,
  444. /* B1 */ C_MODRM,
  445. /* B2 */ C_MODRM,
  446. /* B3 */ C_MODRM,
  447. /* B4 */ C_MODRM,
  448. /* B5 */ C_MODRM,
  449. /* B6 */ C_MODRM,
  450. /* B7 */ C_MODRM,
  451. /* B8 */ C_ERROR,
  452. /* B9 */ C_ERROR,
  453. /* BA */ C_MODRM+C_DATA1,
  454. /* BB */ C_MODRM,
  455. /* BC */ C_MODRM,
  456. /* BD */ C_MODRM,
  457. /* BE */ C_MODRM,
  458. /* BF */ C_MODRM,
  459. /* C0 */ C_MODRM,
  460. /* C1 */ C_MODRM,
  461. /* C2 */ C_ERROR,
  462. /* C3 */ C_ERROR,
  463. /* C4 */ C_ERROR,
  464. /* C5 */ C_ERROR,
  465. /* C6 */ C_ERROR,
  466. /* C7 */ C_ERROR,
  467. /* C8 */ 0,
  468. /* C9 */ 0,
  469. /* CA */ 0,
  470. /* CB */ 0,
  471. /* CC */ 0,
  472. /* CD */ C_DATA1,
  473. /* CE */ 0,
  474. /* CF */ 0,
  475. /* D0 */ C_ERROR,
  476. /* D1 */ C_ERROR,
  477. /* D2 */ C_ERROR,
  478. /* D3 */ C_ERROR,
  479. /* D4 */ C_ERROR,
  480. /* D5 */ C_ERROR,
  481. /* D6 */ C_ERROR,
  482. /* D7 */ C_ERROR,
  483. /* D8 */ C_ERROR,
  484. /* D9 */ C_ERROR,
  485. /* DA */ C_ERROR,
  486. /* DB */ C_ERROR,
  487. /* DC */ C_ERROR,
  488. /* DD */ C_ERROR,
  489. /* DE */ C_ERROR,
  490. /* DF */ C_ERROR,
  491. /* E0 */ C_ERROR,
  492. /* E1 */ C_ERROR,
  493. /* E2 */ C_ERROR,
  494. /* E3 */ C_ERROR,
  495. /* E4 */ C_ERROR,
  496. /* E5 */ C_ERROR,
  497. /* E6 */ C_ERROR,
  498. /* E7 */ C_ERROR,
  499. /* E8 */ C_ERROR,
  500. /* E9 */ C_ERROR,
  501. /* EA */ C_ERROR,
  502. /* EB */ C_ERROR,
  503. /* EC */ C_ERROR,
  504. /* ED */ C_ERROR,
  505. /* EE */ C_ERROR,
  506. /* EF */ C_ERROR,
  507. /* F0 */ C_ERROR,
  508. /* F1 */ C_ERROR,
  509. /* F2 */ C_ERROR,
  510. /* F3 */ C_ERROR,
  511. /* F4 */ C_ERROR,
  512. /* F5 */ C_ERROR,
  513. /* F6 */ C_ERROR,
  514. /* F7 */ C_ERROR,
  515. /* F8 */ C_ERROR,
  516. /* F9 */ C_ERROR,
  517. /* FA */ C_ERROR,
  518. /* FB */ C_ERROR,
  519. /* FC */ C_ERROR,
  520. /* FD */ C_ERROR,
  521. /* FE */ C_ERROR,
  522. /* FF */ C_ERROR
  523. }; // ade32_table[]
  524.  
  525.  
  526. int disasm(BYTE* opcode0, disasm_struct* diza){
  527. BYTE* opcode = opcode0;
  528.  
  529. memset(diza, 0x00, sizeof(disasm_struct));
  530. diza->disasm_defdata = 4;
  531. diza->disasm_defaddr = 4;
  532.  
  533. if(*(WORD*)opcode == 0x0000)
  534. return 0;
  535. if(*(WORD*)opcode == 0xFFFF)
  536. return 0;
  537.  
  538. DWORD flag = 0;
  539.  
  540. repeat_prefix:
  541.  
  542. BYTE c = *opcode++;
  543. DWORD t = ade32_table[ c ];
  544.  
  545. if(t & C_ANYPREFIX){
  546. if(flag & t)
  547. return 0;
  548.  
  549. flag |= t;
  550.  
  551. if(t & C_67)
  552. diza->disasm_defaddr ^= 2^4;
  553. else if(t & C_66)
  554. diza->disasm_defdata ^= 2^4;
  555. else if(t & C_SEG)
  556. diza->disasm_seg = c;
  557. else if(t & C_REP)
  558. diza->disasm_rep = c;
  559. // LOCK
  560.  
  561. goto repeat_prefix;
  562. } // C_ANYPREFIX
  563.  
  564. flag |= t;
  565. diza->disasm_opcode = c;
  566.  
  567. if(c == 0x0F){
  568. c = *opcode++;
  569. diza->disasm_opcode2 = c;
  570. flag |= ade32_table[256+c]; // 2nd flagtable half
  571.  
  572. if(flag == C_ERROR)
  573. return 0;
  574. }else if(c == 0xF7){
  575. if(((*opcode) & 0x38) == 0)
  576. flag |= C_DATA66;
  577. }else if(c == 0xF6){
  578. if(((*opcode) & 0x38) == 0)
  579. flag |= C_DATA1;
  580. }else if(c == 0xCD){
  581. if(*opcode == 0x20)
  582. flag |= C_DATA4;
  583. }
  584.  
  585. if(flag & C_MODRM){
  586. c = *opcode++;
  587. diza->disasm_modrm = c;
  588.  
  589. if(((c & 0x38) == 0x20) && (diza->disasm_opcode == 0xFF))
  590. flag |= C_STOP;
  591.  
  592. BYTE mod = c & 0xC0;
  593. BYTE rm = c & 0x07;
  594.  
  595. if(mod != 0xC0){
  596. if(diza->disasm_defaddr == 4){
  597. if(rm == 4){
  598. flag |= C_SIB;
  599. c = *opcode++;
  600. diza->disasm_sib = c;
  601. rm = c & 0x07;
  602. }
  603.  
  604. if(mod == 0x40)
  605. flag |= C_ADDR1;
  606. else if(mod == 0x80)
  607. flag |= C_ADDR4;
  608. else if (rm == 5)
  609. flag |= C_ADDR4;
  610. }else{ // MODRM 16-bit
  611. if(mod == 0x40)
  612. flag |= C_ADDR1;
  613. else if(mod == 0x80)
  614. flag |= C_ADDR2;
  615. else if(rm == 6)
  616. flag |= C_ADDR2;
  617. }
  618. }
  619. } // C_MODRM
  620.  
  621. diza->disasm_flag = flag;
  622.  
  623. DWORD a = flag & (C_ADDR1 | C_ADDR2 | C_ADDR4);
  624. DWORD d = (flag & (C_DATA1 | C_DATA2 | C_DATA4)) >> 8;
  625.  
  626. if(flag & C_ADDR67)
  627. a += diza->disasm_defaddr;
  628. if(flag & C_DATA66)
  629. d += diza->disasm_defdata;
  630.  
  631. diza->disasm_addrsize = a;
  632. diza->disasm_datasize = d;
  633.  
  634. DWORD i;
  635. for(i = 0; i < a; i++)
  636. diza->disasm_addr_b[i] = *opcode++;
  637.  
  638. for(i = 0; i < d; i++)
  639. diza->disasm_data_b[i] = *opcode++;
  640.  
  641. diza->disasm_len = opcode - opcode0;
  642.  
  643. return diza->disasm_len;
  644. } // disasm()
  645.  
  646. int oplen(BYTE *opcode){
  647. disasm_struct diza;
  648. memset(&diza,0,sizeof(diza));
  649.  
  650. disasm((BYTE*)opcode,&diza);
  651.  
  652. if((diza.disasm_flag == C_ERROR) || ((diza.disasm_flag&C_STOP) == C_STOP) || ((diza.disasm_flag&C_REL)==C_REL) || ((diza.disasm_flag&C_BAD)==C_BAD))
  653. return -1;
  654.  
  655. return diza.disasm_len;
  656. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement