Алгоритм конвертации test..jxx в if

Тема в разделе "WASM.A&O", создана пользователем Broken Sword, 10 авг 2006.

  1. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    Есть фрагмент кода (достаточно большой), состоящий целиком из операций test над битами в байтах и переходов в зависимости от результатов. Довольно запутанный. Есть ли какой-либо алгоритм быстрого превращения такого кода в высокоуровневые конструкции типа .IF?
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Думаю, автоматического нет для этого. Помню, сам анализировал такой код, приходилось очень вдумчиво восстанавливать алгоритм.
     
  3. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    может быть переписать это "как есть" на С и скормить хорошо оптимизирующему компилятору?
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    green
    Думаю, получится то же самое :) Код не человеком запутан, он стал таким после разворачивания сложных условий.
     
  5. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Broken Sword
    Есть один вариант... Я так понимаю, код получен в ИДА? Если так, то выложи интересующую тебя процедуру в виде asm-файла (желательно без cross-ref, без опкодов и комментариев). Положительного решения не обещаю, но попробую, вдруг получится?
     
  6. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    crypto, там 30 страниц A4 :) Я по странице в час где-то осиливаю, просто интересовал сам алгоритм, а он есть, я уверен. Еще страниц 5 осилю и алгоритм нарисуется сам собой )
     
  7. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Вроде в тему. В принципе, в Олли дебаггере что-то подобное используется. Там опция есть - трактовать последовательность сравнений как кейс...
     
  8. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Broken Sword
    А в виде текстового файла нет? Выложи ради интереса.

    asmfan
    Дык, ИДА тоже может определять кейсы для некоторых случаев. А для подобных конструкций:
    sub eax, 3
    jz @1
    dec eax
    jnz @2
    ...
    @1:
    sub eax, 34
    ja @3
    jb @4
    ...
    ...
    ИДА бессильна.
     
  9. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    Пожалуйста.

    сори за код, не заметил аттача "в быстром ответе", в понедельник прицеплю

    Да, это эвристика nod32 :) полностью расколупанная. Значения 90% флагов уже известны.
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Вижу, выдирание ядер антивирусов становится всё популярнее.. Занятно.
     
  11. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    IceStudent
    если не секрет - где еще видел?)
     
  12. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Broken Sword
    Вот что выдал мой анализатор кода. К сожалению, здесь только структура и некоторые конструкции еще не охвачены (сам увидишь, какие). Я попробую совокупить два текста, но наверное тебе самому проще проверить некоторые места.
    Код (Text):
    1. if (!=)
    2. {
    3. }
    4. if (!=)
    5. {
    6. }
    7. if ((!= || !=) && != && != && (!= || !=) && != && != && !=)
    8. {
    9. }
    10. if (!= && != && != && != && != && != && != && !=)
    11. {
    12. }
    13. if (!=)
    14. {
    15. }
    16. if (!=)
    17. {
    18. }
    19. if (!=)
    20. {
    21. }
    22. if (!=)
    23. {
    24. }
    25. if (!=)
    26. {
    27. }
    28. if (!=)
    29. {
    30. }
    31. if (>= || !=)
    32. {
    33. }
    34. if (!= || (!= && !=) || != || (!= && !=) || != || (!= && !=) || != || (!= && !=) || !=)
    35. {
    36. }
    37. if (!= && !=)
    38. {
    39. }
    40. if (!= && != && !=)
    41. {
    42. }
    43. if (!= && != && !=)
    44. {
    45. }
    46. if ((!= && !=) || ((!= || !=) && !=))
    47. {
    48. }
    49. if (!= && !=)
    50. {
    51. }
    52. if ((!= && (!= || !=)) || (!= && !=))
    53. {
    54. }
    55. if ((!= && (!= || !=)) || !=)
    56. {
    57. }
    58. if (!=)
    59. {
    60. }
    61. if ((!= || !=) && (!= || !=))
    62. {
    63. }
    64. if (!= || != || !=)
    65. {
    66. }
    67. if (!= && (!= || !=))
    68. {
    69. }
    70. if (!= && != && != && !=)
    71. {
    72. }
    73. if (!= && !=)
    74. {
    75.     if (!=)
    76.     {
    77.     }
    78.     if (!=)
    79.     {
    80.     }
    81.     if (!=)
    82.     {
    83.     }
    84.     if (!=)
    85.     {
    86.     }
    87.     if (!=)
    88.     {
    89.     }
    90.     if (!=)
    91.     {
    92.     }
    93.     if (!=)
    94.     {
    95.     }
    96.     if (!=)
    97.     {
    98.     }
    99.     if (!=)
    100.     {
    101.     }
    102.     if (!=)
    103.     {
    104.     }
    105.     if (>=)
    106.     {
    107.     }
    108. }
    109. if (!= && != && !=)
    110. {
    111. }
    112. if (!= && !=)
    113. {
    114. }
    115. if (!= || (!= && !=))
    116. {
    117. }
    118. if ((!= && !=) || (!= && !=) || != || !=)
    119. {
    120. }
    121. if (!=)
    122. {
    123. }
    124. if (!=)
    125. {
    126. }
    127. if (!= || !=)
    128. {
    129. }
    130. if (!=)
    131. {
    132. }
    133. if (!=)
    134. {
    135. }
    136. if (!= || !=)
    137. {
    138. }
    139. if (!=)
    140. {
    141. }
    142. if (>=)
    143. {
    144. }
    145. if (!=)
    146. {
    147. }
    148. if (!=)
    149. {
    150. }
    151. if (!=)
    152. {
    153. }
    154. if (!=)
    155. {
    156. }
    157. if (!=)
    158. {
    159. }
    160. if (!=)
    161. {
    162. }
    163. if (!=)
    164. {
    165. }
    166. if (>=)
    167. {
    168. }
    169. if (< && != && != && != && (!= || !=))
    170. {
    171. }
    172. else
    173. {
    174. }
    175. if (!=)
    176. {
    177. }
    178. if (!= || !=)
    179. {
    180. }
    181. if (!=)
    182. {
    183. }
    184. if (!=)
    185. {
    186. }
    187. if (==)
    188. {
    189. }
    190. if ((== || == || == || !=) && != && != && == && >)
    191. {
    192. }
    193. if (!= && (!= || !=))
    194. {
    195. }
    196. B96 == && ==
    197. B97 == || (== && ==)
    198. J97
    199. @96 b1 loc_138CB51
    200. @97 b1 j1 loc_138CB56
    201. if (!= && != && ((!= && !=) || !=))
    202. {
    203. }
    204. if (!= || !=)
    205. {
    206. }
    207. if (!= || != || !=)
    208. {
    209. }
    210. if (!= || (!= && !=) || != || != || != || !=)
    211. {
    212. }
    213. if (!= || != || !=)
    214. {
    215. }
    216. if (!= || !=)
    217. {
    218. }
    219. if (!=)
    220. {
    221. }
    222. if (!=)
    223. {
    224. }
    225. if (!=)
    226. {
    227. }
    228. if (!=)
    229. {
    230. }
    231. if (!=)
    232. {
    233. }
    234. if (!=)
    235. {
    236. }
    237. if (!=)
    238. {
    239. }
    240. if (!=)
    241. {
    242. }
    243. B124 (!= || != || != || !=) && >= && >=
    244. @123 j1 loc_138CCD6
    245. B125 == || == || == || == || == || ==
    246. B126 >
    247. J126
    248. @124 b1 loc_138CD19
    249. J123
    250. @125 b1 loc_138CD26
    251. @126 b1 j1 loc_138CD2C
    252. if (!= && != && != && != && != && != && != && != && <)
    253. {
    254. }
    255. if (!= && != && !=)
    256. {
    257. }
    258. if (!=)
    259. {
    260. }
    261. if (!= && != && != && !=)
    262. {
    263. }
    264. if ((== || (== && <=)) && != && != && ==)
    265. {
    266. }
    267. if (!= && != && != && (!= || !=) && (!= || !=))
    268. {
    269. }
    270. if (!=)
    271. {
    272. }
    273. if (!=)
    274. {
    275. }
    276. if (!=)
    277. {
    278. }
    279. if (!=)
    280. {
    281. }
    282. if (!=)
    283. {
    284. }
    285. if (!=)
    286. {
    287. }
    288. if (!=)
    289. {
    290. }
    291. if (!=)
    292. {
    293. }
    294. if (== || <) goto loc_138CEC4
    295. if (!= || !=)
    296. {
    297.     goto loc_138CECA
    298. }
    299. if (!= || !=)
    300. {
    301.     if (!=)
    302.     {
    303.     }
    304.     if (!= || !=)
    305.     {
    306.     }
    307.     if (!=)
    308.     {
    309.     }
    310.     if (!=)
    311.     {
    312.     }
    313.     else
    314.     {
    315.         if (!=)
    316.         {
    317.         }
    318.     }
    319.     if (!= || !=)
    320.     {
    321.     }
    322.     if (!=)
    323.     {
    324.     }
    325.     if (!=)
    326.     {
    327.     }
    328.     if (!=)
    329.     {
    330.     }
    331.     if (!=)
    332.     {
    333.         if (!=)
    334.         {
    335.         }
    336.         else
    337.         {
    338.         }
    339.     }
    340.     if (!=)
    341.     {
    342.     }
    343.     if (!=)
    344.     {
    345.         if (== && ==)
    346.         {
    347.         }
    348.         else
    349.         {
    350.         }
    351.     }
    352.     if (!=)
    353.     {
    354.     }
    355.     if (> || (>= && <) || (>= && ==))
    356.     {
    357.     }
    358. }
    359. if (!=)
    360. {
    361. }
    362. if (!=)
    363. {
    364. }
    365. if (!=)
    366. {
    367. }
    368. if (!=)
    369. {
    370. }
    371. if (!=)
    372. {
    373. }
    374. if (!=)
    375. {
    376. }
    377. if (!=)
    378. {
    379. }
    380. if (!=)
    381. {
    382. }
    383. if (!=)
    384. {
    385. }
    386. if (!=)
    387. {
    388. }
    389. if (!= && != && >=)
    390. {
    391. }
    392. if ((!= && !=) || (!= && (!= || !=)))
    393. {
    394. }
    395. if (!=)
    396. {
    397. }
    398. if (!=)
    399. {
    400. }
    401. if (!=)
    402. {
    403. }
    404. if (!=)
    405. {
    406. }
    407. if (!=)
    408. {
    409. }
    410. if (!= && !=)
    411. {
    412. }
    413. if ((!= || !=) && (>= || (>= && <)))
    414. {
    415. }
    416. if (!=)
    417. {
    418. }
    419. if (!=)
    420. {
    421. }
    422. if (!=)
    423. {
    424. }
    425. if (!=)
    426. {
    427. }
    428. if (!=)
    429. {
    430. }
    431. if (!=)
    432. {
    433. }
    434. if (!=)
    435. {
    436. }
    437. if (!=)
    438. {
    439. }
    440. if (>=)
    441. {
    442. }
    443. if (!= && != && != && != && != && != && != && != && != && != && != && != && == && < && <)
    444. {
    445. }
    446. if (!= && (!= || (!= && !=)) && <=)
    447. {
    448. }
    449. if (!=)
    450. {
    451. }
    452. if (!=)
    453. {
    454. }
    455. if (!=)
    456. {
    457. }
    458. if (!=)
    459. {
    460. }
    461. if (!= && >=)
    462. {
    463. }
    464. if (!=)
    465. {
    466. }
    467. if (!=)
    468. {
    469. }
    470. if (!=)
    471. {
    472. }
    473. if (!=)
    474. {
    475. }
    476. if (!=)
    477. {
    478. }
    479. if (!=)
    480. {
    481. }
    482. if (!=)
    483. {
    484. }
    485. if (!=)
    486. {
    487. }
    488. if (!=)
    489. {
    490. }
    491. if (!=)
    492. {
    493. }
    494. if (!=)
    495. {
    496. }
    497. if (!=)
    498. {
    499. }
    500. if (!=)
    501. {
    502. }
    503. if (!=)
    504. {
    505. }
    506. if (!=)
    507. {
    508. }
    509. if (!=)
    510. {
    511. }
    512. if (!=)
    513. {
    514. }
    515. if (!=)
    516. {
    517. }
    518. if (!=)
    519. {
    520. }
    521. if (!=)
    522. {
    523. }
    524. if (!=)
    525. {
    526. }
    527. if (!=)
    528. {
    529. }
    530. if (!=)
    531. {
    532. }
    533. if (!=)
    534. {
    535. }
    536. if (!=)
    537. {
    538. }
    539. if (>)
    540. {
    541. }
    542. if (!= && <= && (!= || != || !=))
    543. {
    544. }
    545. if (!=)
    546. {
    547.     if (<= && !=)
    548.     {
    549.     }
    550. }
    551. if (!= && != && <=)
    552. {
    553. }
    554. if (!= && <=)
    555. {
    556. }
    557. if (!= && <=)
    558. {
    559. }
    560. if (!= && <=)
    561. {
    562. }
    563. if (!= && <=)
    564. {
    565. }
    566. if (!= && != && <=)
    567. {
    568. }
    569. if (!=)
    570. {
    571. }
    572. if (!= && <= && ==)
    573. {
    574. }
    575. if (!= && != && <=)
    576. {
    577. }
     
  13. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    crypto, хммм... с этими "!=" было б лучше если бы наоборот... (т.е. без отрицаний)
     
  14. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Broken Sword
    Дык, != в твоем случае означает, что условие не выполняется, например
    if (ARA_byte_VirusCharacteristics & 0x40 != 0)
    {
    ARA_byte_VirusCharacteristics |= 0x20;
    }
     
  15. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    crypto
    Неплохо. Так и до декомпилятора недалеко.
     
  16. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    crypto, А переменные и биты оно подставлять не может само? :)
     
  17. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Broken Sword
    Оно этому учится... :)
     
  18. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    crypto:
    а не поделишся им?=)))
     
  19. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Он еще на стадии разработки, как ты видел некоторые конструкции он еще не разбирает. Не хочется выпускать сырой продукт.