Русский / Russian English / Английский

Сейчас на форуме: FORER (+3 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Основной форум —› Использование IDA Pro (part 2)
<< 1 ... 9 . 10 . 11 . 12 . 13 . 14 . 15 . 16 . 17 . 18 . 19 . >>
Посл.ответ Сообщение


Ранг: 2011.4 (!!!!)
Статус: Модератор
retired

Создано: 27 марта 2017 11:54 New!
Цитата · Личное сообщение · #1

Обмен опытом использования и настройки интерактивного дизассемблера и отладчика IDA Pro.
Прошлый топик Использование IDA Pro

| Сообщение посчитали полезным: oxfemale, gent0o0



Ранг: 522.4 (!)
Статус: Участник
Победитель турнира 2010

Создано: 11 сентября 2019 10:55 New!
Цитата · Личное сообщение · #2

plutos пишет:
для любителей языка GO


В блоге (https://rednaga.io/2016/09/21/reversing_go_binaries_like_a_pro/) есть упоминание депозитария Егора Зайцева, но ссылка на его набор с поддержкой Go v.1.7.

После этого Егор добавил поддержку старших версий
https://gitlab.com/zaytsevgu/GoUtils2.0
и переехал на
https://github.com/sibears/IDAGolangHelper

Он докладывал это на Zeronigths в том же 2016 году
https://2016.zeronights.ru/wp-content/uploads/2016/12/GO_Zaytsev.pdf

| Сообщение посчитали полезным: plutos



Ранг: 584.6 (!)
Статус: Участник
_Вечный_Студент_

Создано: 14 сентября 2019 08:39 · Поправил: plutos New!
Цитата · Личное сообщение · #3

--> findrpc <--: Ida script to extract RPC interface from binaries
Idapython script to carve binary for internal RPC structures

Usage: Just run the script findrpc.py.
Features:
•View in a glance which RPC clients and servers are embedded in the binary
•Locate dispatch tables for RPC servers
•Quickly rename every RPC proc handlers found
•(On Windows) Generate decompiled IDL from RPC declarations


*******************************************************
--> deReferencing <--is an IDA Pro plugin that implements new registers and stack views.
Adds dereferenced pointers, colors and other useful information, similar to some GDB plugins (e.g: PEDA, GEF, pwndbg, etc).

Supports following architectures: x86, x86-64, ARM, ARM64, MIPS32 and MIPS64

Requirements
IDA-Pro >= 7.2


Ранг: 584.6 (!)
Статус: Участник
_Вечный_Студент_

Создано: 19 сентября 2019 02:08 New!
Цитата · Личное сообщение · #4

--> IDAMAGNUM <--idamagnum is a plugin for integrating MagnumDB requests within IDA


Ранг: 322.8 (мудрец)
Статус: Участник

Создано: 19 сентября 2019 20:46 · Поправил: DenCoder New!
Цитата · Личное сообщение · #5

Не попадался никому часом плагин для иды(нормальный) для отладки скриптов на питоне?

Пробую pdb. Не понравится, попробую Wing.

p.s. Сам спросил и сам ответил )

Ранг: -12.6 (нарушитель)
Статус: Участник

Создано: 19 сентября 2019 21:38 New!
Цитата · Личное сообщение · #6

Может sark подойдет?

--> Link <--

| Сообщение посчитали полезным: DenCoder



Ранг: 322.8 (мудрец)
Статус: Участник

Создано: 19 сентября 2019 21:46 · Поправил: DenCoder New!
Цитата · Личное сообщение · #7

У самого sark'а не нашёл отладки. Но на странице ссылка на ptvsd. Тоже стоит попробовать, только надо с pip разобраться. На 7ке pip нормально работает, не успел ещё испортить. А на xp не хочет - раньше всё стояло и pip в том числе. Хард полетел, не всё восстановил

Ранг: -12.6 (нарушитель)
Статус: Участник

Создано: 19 сентября 2019 22:08 New!
Цитата · Личное сообщение · #8

У sark нашел еще > вот это <. Может тоже пригодится?


Ранг: 322.8 (мудрец)
Статус: Участник

Создано: 19 сентября 2019 22:13 New!
Цитата · Личное сообщение · #9

Ну это и есть ptvsd )

Ранг: -12.6 (нарушитель)
Статус: Участник

Создано: 19 сентября 2019 22:33 New!
Цитата · Личное сообщение · #10

DenCoder пишет:
Ну это и есть ptvsd )


А я и не обратил внимание, что "заточено" под студию.
Увидел в заголовке слово Debugging и давай быстрей писать комментарий,
чтобы потом гордиться тем, что помог советом самому DenCoder'у.


Ранг: 322.8 (мудрец)
Статус: Участник

Создано: 19 сентября 2019 22:49 New!
Цитата · Личное сообщение · #11

Неплохо бы Wing под XP. Поставиться поставился, со скриптом/импортом разобрался, а запускаешь - не приложение Win32. На 7ке всё ставить - места мало. Этот комп пора на 7ку переводить

Добавлено спустя 0 минут
pdb попробую, что за зверь

Добавлено спустя 1 минуту
А ptvsd собирается минимум на VS2013, как-то тоже неудобство.

Добавлено спустя 8 минут
Хотя вроде увидел, что под VS2010 кто-то пытается поставить, и авторы утверждают, что VS2010 годен.

| Сообщение посчитали полезным: dma



Ранг: 584.6 (!)
Статус: Участник
_Вечный_Студент_

Создано: 19 сентября 2019 22:59 · Поправил: plutos New!
Цитата · Личное сообщение · #12

Использую --> Wing Pro <--на Windows 7, по-моему самое оно.

| Сообщение посчитали полезным: dma



Ранг: 1031.4 (!!!!)
Статус: Участник

Создано: 24 сентября 2019 00:41 · Поправил: reversecode New!
Цитата · Личное сообщение · #13

contest 2019 is over with result


Ранг: 584.6 (!)
Статус: Участник
_Вечный_Студент_

Создано: 24 сентября 2019 03:54 New!
Цитата · Личное сообщение · #14

--> Pwnedbg <-- - debugging the IOS kernel in IDA

Description: load the new IOS kernel cache in IDA, symbolize it, and debug it.


Ранг: 322.8 (мудрец)
Статус: Участник

Создано: 27 сентября 2019 18:20 New!
Цитата · Личное сообщение · #15

Глючно ведёт себя ида 6.8 в некоторых случаях.

Вот такой фрагмент скрипта
Code:
  1.                         print("tail %x" %addr)
  2.                         chsaddr += [addr]
  3.                         ce = getLastInstruction(addr)
  4.                         print("Last instruction %x" %ce)
  5.                         insn = DecodeInstruction(ce)
  6.  
  7.                         ceEnd = ce + insn.size
  8.                         if Byte(ce) == 0xe8: ceEnd = ce
  9.                         nchs = [nch for nch in Chunks(fea)]
  10.                         print("Number of chunks before: %d" %len(nchs))
  11.  
  12.                         analyze_area(addr, ceEnd)
  13.                         print("Analyzing area %x - %x" %(addr, ceEnd))
  14.  
  15.                         nchs = [nch for nch in Chunks(fea)]
  16.                         print("Number of chunks after: %d" %len(nchs))


выводит
Code:
  1. tail f1d5e2
  2. Last instruction f1d5ea
  3. Number of chunks before: 184
  4. Analyzing area f1d5e2 - f1d5ef
  5. Number of chunks after: 184
  6. tail f1d9a5
  7. Last instruction f1d9ae
  8. Number of chunks before: 184
  9. Analyzing area f1d9a5 - f1d9b1
  10. Number of chunks after: 1


И всё, что я создавал, кануло в лету
Фрагмент кода, на котором это происходит
Code:
  1. 00F1D9A5 040 mov     [esp+44h], eax
  2. 00F1D9A9 040 pushf
  3. 00F1D9AA 040 push    dword ptr [esp+48h]
  4. 00F1D9AE 040 retn    4Ch


Видно из лога, что до анализа фрагмента чанки функции все на месте, после анализа - всё слетает. Автоанализ отключён.

Никто с таким не сталкивался?

Ранг: 44.8 (посетитель)
Статус: Участник

Создано: 28 сентября 2019 15:22 New!
Цитата · Личное сообщение · #16

DenCoder пишет:
Глючно ведёт себя ида 6.8 в некоторых случаях.

Да в каждой версии багов до этого самого места...
Ильфак хоть исправляет, когда пинаешься (ну если есть поддержка).
Правда, меньше их не становится. Старые исправляет, новые появляются.
Возможно, что что-то подобное уже исправлено в новых версиях...
Удивляться, что в (уже очень древней) 6.8 что-то не работало вряд ли стоит...
А глючить может где угодно...


Ранг: 322.8 (мудрец)
Статус: Участник

Создано: 28 сентября 2019 22:30 New!
Цитата · Личное сообщение · #17

Решил разобраться, что же происходит внутри иды. Весь алго анализа внутри ida.wll.

У анализатора иды есть несколько состояний, их можно пронумеровать(заданы, как десятичные числа): 10, 20, 25, 30, 35, 38, 40, 50, 60, 70, 80, 90, 200.

В моём случае при анализе участка кода выше внутри функции analyze_area() получается состояние 30. После некоторых операций по свитч-кейс таблице передаётся управление на case 30, откуда вызывается внутренняя функция, в которой удаляется указанный тейл(remove_func_tail()), очищается вообще структура ранее созданной функции(clear_func_struct()), остаётся только несколько тейлов и добавляется новая функция с указанными границами(add_func_ex()).

Разбираюсь дальше

| Сообщение посчитали полезным: plutos



Ранг: 256.9 (наставник)
Статус: Участник

Создано: 28 сентября 2019 23:03 New!
Цитата · Личное сообщение · #18

Может я ничего не понимаю в этой жизни, но full analysis уродского огрызка из 4 инструкций, явно не относящегося к нормальному эпилогу - это такая неизбежная необходимость? На create_insn() можно пройтись по всем четырем (даже если анализ полностью выключен и следующая сама не объявится), в референсах инструкции <теоретически> должен появиться референс на следующую.


Ранг: 322.8 (мудрец)
Статус: Участник

Создано: 28 сентября 2019 23:08 · Поправил: DenCoder New!
Цитата · Личное сообщение · #19

Законченый правильный анализ обфускированной таким образом функции, её фрагмента выставит правильные spd и даст понятие об использовании переменных. Просто это удобство, которого мы временно лишены в таких случаях. Под иду 7.0 скрипт переписывать, а не хотелось бы. Да и не уверен, что там всё ок бы работать. Чтобы это посмотреть, надо сначала скрипт переписать.

Добавлено спустя 3 минуты
На других фрагментах(тейлах) analyze_area() нормально отрабатывает, а на этом всё валит. Хочу разобраться, почему, и по возможности исправить.


Ранг: 256.9 (наставник)
Статус: Участник

Создано: 28 сентября 2019 23:27 · Поправил: f13nd New!
Цитата · Личное сообщение · #20

DenCoder пишет:
Хочу разобраться, почему, и по возможности исправить.

Бери вон лучше auto_mark_range(long start, long end, long queuetype), к которой analyze_area() сводится, это примерно и есть то что надо. Вместо AU_USED и AU_FINAL можно сразу AU_CODE воткнуть. Кстати твой список констант очень напоминает AU_*

| Сообщение посчитали полезным: DenCoder, plutos



Ранг: 322.8 (мудрец)
Статус: Участник

Создано: 29 сентября 2019 00:09 New!
Цитата · Личное сообщение · #21

f13nd пишет:
Кстати твой список констант очень напоминает AU_*

Так и есть, спасибо за подсказку!

f13nd пишет:
Бери вон лучше auto_mark_range(long start, long end, long queuetype), к которой analyze_area() сводится

Этого мало, auto_mark_range() ставит только в очередь. Внутри analyze_area() ставится участок кода в очередь 2 раза, да - AU_USED(40) и AU_FINAL(200), а дальше вызывается внутренняя функция, в которой определяется состояние почему-то AU_PROC(30), потому и всё летит.

Но мысль возникла - может просто вызвать auto_unmark() (В иде 6.8 autoUnmark)? Попробовал так, analyze_area() ничего не снесла. Как-то проверять надо состояние анализатора перед выполнением анализа

Добавлено спустя 6 минут
Да!!! Если выполнить autoWait(), то всё сразу летит. Выходит, в очереди много всего накопилось ещё при отладке скрипта.

В общем, если перед анализом на диапазоне выполнить autoCancel(), то всё ок работает.

Добавлено спустя 16 минут
Научиться бы ещё просматривать, что в очереди. И как бы отменять их все сразу?


Ранг: 256.9 (наставник)
Статус: Участник

Создано: 29 сентября 2019 00:30 New!
Цитата · Личное сообщение · #22

DenCoder пишет:
если перед анализом на диапазоне выполнить autoCancel(), то всё ок работает.

Еще один укол пеницилина покойнику Давно пора гидрой все это делать.


Ранг: 54.9 (постоянный)
Статус: Участник

Создано: 29 сентября 2019 00:41 New!
Цитата · Личное сообщение · #23

Тупой вопрос на фоне остального, но - можно ли поменять цвет стрелок в IDA view (там, где условные переходы). Там зеленый и красный вроде, они мне сливаются в один. Хотелось бы поставить, скажем, желтый и синий или еще как нибудь более контрастно (если это реально).


Ранг: 256.9 (наставник)
Статус: Участник

Создано: 29 сентября 2019 00:55 New!
Цитата · Личное сообщение · #24

morgot, --> Link <--

| Сообщение посчитали полезным: morgot



Ранг: 584.6 (!)
Статус: Участник
_Вечный_Студент_

Создано: 29 сентября 2019 00:59 · Поправил: plutos New!
Цитата · Личное сообщение · #25

To morgot

цвет именно стрелок не менял, но если использовать
--> CSS-based styling <--, то много чего можно сделать. Так что попробуй поиграть с ним.
fiend опередил, возможно его способ проще.

| Сообщение посчитали полезным: morgot



Ранг: 322.8 (мудрец)
Статус: Участник

Создано: 29 сентября 2019 01:01 · Поправил: DenCoder New!
Цитата · Личное сообщение · #26

f13nd пишет:
Давно пора гидрой все это делать.

Она отлажена? Косяков не больше, чем в иде?

morgot пишет:
можно ли поменять цвет стрелок в IDA view (там, где условные переходы).

Вообще-то, меню Options -> Colors -> Graph. Твои будут Yes Edge и No Edge, меняй, сколько хочешь )

В 7.0 не проверял, ставить надо, винду переставлял

| Сообщение посчитали полезным: morgot



Ранг: 256.9 (наставник)
Статус: Участник

Создано: 29 сентября 2019 01:18 New!
Цитата · Личное сообщение · #27

DenCoder пишет:
Она отлажена? Косяков не больше, чем в иде?

Косяков не меньше, зато сам процесс анализа понятней, прозрачней и глубже. И вмешаться можно на любом этапе. При желании можно вообще от всего отказаться и насухую листинг самому анализировать по псевдокоду, который дизасм отдает. Или даже влезть в дизасм, если чем-то не устраивает.


Ранг: 584.6 (!)
Статус: Участник
_Вечный_Студент_

Создано: 29 сентября 2019 04:23 · Поправил: plutos New!
Цитата · Личное сообщение · #28

f13nd пишет:
зато сам процесс анализа понятней, прозрачней и глубже. И вмешаться можно на любом этапе


Поскольку все познается в сравнении, не мог бы ты, если возможно, сделать что-то вроде краткого сравнительного анализа: взять один и тот же код и показать, что делает ида и гидра (не весь listing, конечно, а именно ключевые критические моменты, на которые стоит обращать внимание).
Но обязательно с комментариями, типа "вот тут гидра бьет иду и наоброт".
Лично мне это бы очень помогло в понимании обоих tools и создании полной, обьемной картины анализа.

| Сообщение посчитали полезным: DenCoder



Ранг: 322.8 (мудрец)
Статус: Участник

Создано: 29 сентября 2019 08:38 · Поправил: DenCoder New!
Цитата · Личное сообщение · #29

Сколько я времени в прошлом потратил на новые "передовые" инструменты. Моё мнение - всё новое - ЗЛО!

f13nd пишет:
Или даже влезть в дизасм, если чем-то не устраивает.

Движок может быть с сюрпризом таким, что много чего переписывать, может быть, придётся. А времени, как всегда, ни на что не хватает.


Ранг: 256.9 (наставник)
Статус: Участник

Создано: 29 сентября 2019 17:11 · Поправил: f13nd New!
Цитата · Личное сообщение · #30

plutos пишет:
взять один и тот же код и показать

Допустим есть некоторый известный всем алгоритм и он в x86 (это шулерский прием сравнивать иду по x86, но некоторые считают, что кроме него ничего не существует)

Берем точку входа в него и падаем вниз (пусть не будет тейлов, это шулерский прием, но тейлы тут погоды не сделают):
Code:
  1. import idaapi
  2. from pprint import pprint
  3. ea = 0x0040101D;
  4. crefs = []
  5. while True:
  6.          cref = ida_xref.get_first_cref_from(ea)
  7.          if cref != BADADDR:
  8.                  crefs.append(cref)
  9.                  while True:
  10.                         cref = ida_xref.get_next_cref_from(ea,cref)
  11.                         if cref == BADADDR:
  12.                               break;
  13.                         crefs.append(cref)
  14.          print(hex(ea) + " " + idc.generate_disasm_line((ea),0))
  15.          if ea + ida_ua.decode_insn(ea) not in crefs:
  16.                  break
  17.          ea = ea + ida_ua.decode_insn(ea)
Code:
  1. 0x40101d push    ebp
  2. 0x40101e mov     ebp, esp
  3. 0x401020 push    esi
  4. 0x401021 push    edi
  5. 0x401022 mov     esi, [ebp+arg_0]
  6. 0x401025 xor     edi, edi
  7. 0x401027 xor     eax, eax
  8. 0x401029 dec     eax
  9. 0x40102a cmp     edi, [ebp+arg_4]
  10. 0x40102d jnb     short loc_401055
  11. 0x40102f movzx   ecx, byte ptr [esi+edi]
  12. 0x401033 cmp     ch, 8
  13. 0x401036 jnb     short loc_401052
  14. 0x401038 movzx   edx, cl
  15. 0x40103b xor     edx, eax
  16. 0x40103d shr     eax, 1
  17. 0x40103f shr     cl, 1
  18. 0x401041 test    edx, 1
  19. 0x401047 jz      short loc_40104E
  20. 0x401049 xor     eax, 0EDB88320h
  21. 0x40104e inc     ch
  22. 0x401050 jmp     short loc_401033
  23. 0x401052 inc     edi
  24. 0x401053 jmp     short loc_40102A
  25. 0x401055 not     eax
  26. 0x401057 pop     edi
  27. 0x401058 pop     esi
  28. 0x401059 leave
  29. 0x40105a retn    8

Дизассемблировать ида могёт, никто не сомневался. Даже аргументы процедуры (процедуры!) правильно определила. Но меня до этого процесса не допустили, так что я хочу всё перепроверить или проделать это вместо иды. Пройтись по зависимостям, найти значения, используемые без предварительной инициализации (аргументы) и значения инициализированные, но не использованные (потому что это не процедура). Вон mak недавно показывал, что это оказывается полезная практика.
Для этого в иде есть microcode api и угадайте с 3 попыток почему я вам их не покажу. На самом деле этот скрипт демонстрирует почти все апи, которые в иде можно применить для анализа кода (кроме microcode api, которые для х86 пока большинство могут увидеть только на картинках). На этом с идой всё.

Шуруем в гидру и смотрим что она может нам предложить.
Code:
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import ghidra.app.script.GhidraScript;
  4. import ghidra.program.model.address.Address;
  5. import ghidra.program.model.listing.Instruction;
  6. public class test extends GhidraScript {
  7.          @Override
  8.          protected void run() throws Exception {
  9.                  Address ea = currentProgram.getAddressFactory().getDefaultAddressSpace().getAddress(0x0040101DL);
  10.                  Instruction insn = currentProgram.getListing().getInstructionAt(ea);
  11.                  while (insn != null) {
  12.                         println(insn.getAddress().toString() + " " + insn.toString());
  13.                         insn = insn.getNext();
  14.                  }
  15.          }
  16. }
Code:
  1. test.java> 0040101d PUSH EBP
  2. test.java> 0040101e MOV EBP,ESP
  3. ...
  4. test.java> 0040105a RET 0x8

Немного усложнив видим псевдокод, который можно анализировать.
Code:
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import ghidra.app.script.GhidraScript;
  4. import ghidra.program.model.address.Address;
  5. import ghidra.program.model.listing.Instruction;
  6. import ghidra.program.model.pcode.PcodeOp;
  7. public class test extends GhidraScript {
  8.          @Override
  9.          protected void run() throws Exception {
  10.                  Address ea = currentProgram.getAddressFactory().getDefaultAddressSpace().getAddress(0x0040101DL);
  11.                  Instruction insn = currentProgram.getListing().getInstructionAt(ea);
  12.                  while (insn != null) {
  13.                         println(insn.getAddress().toString() + " " + insn.toString());
  14.                         PcodeOp[] insn_pcode = insn.getPcode();
  15.                         for (int i=0;i<insn_pcode.length;i++) {
  16.                               println(" " + insn_pcode[i].toString());
  17.                         }
  18.                         insn = insn.getNext();
  19.                  }
  20.          }
  21. }
Code:
  1. test.java> 0040101d PUSH EBP
  2. test.java>   (unique, 0x1b50, 4) COPY (register, 0x14, 4)
  3. test.java>   (register, 0x10, 4) INT_SUB (register, 0x10, 4) , (const, 0x4, 4)
  4. test.java>    ---  STORE (const, 0x1a1, 8) , (register, 0x10, 4) , (unique, 0x1b50, 4)
  5. test.java> 0040101e MOV EBP,ESP
  6. test.java>   (register, 0x14, 4) COPY (register, 0x10, 4)
  7. test.java> 00401020 PUSH ESI
  8. ...

Так делать нельзя, это только для демонстрации:
Code:
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import ghidra.app.script.GhidraScript;
  4. import ghidra.program.model.address.Address;
  5. import ghidra.program.model.listing.Instruction;
  6. import ghidra.program.model.pcode.PcodeOp;
  7. import ghidra.program.model.pcode.Varnode;
  8. public class test extends GhidraScript {
  9.          @Override
  10.          protected void run() throws Exception {
  11.                  Address ea = currentProgram.getAddressFactory().getDefaultAddressSpace().getAddress(0x0040101DL);
  12.                  Instruction insn = currentProgram.getListing().getInstructionAt(ea);
  13.                  List<Long> initialized_not_used_registers = new ArrayList<Long>();
  14.                  while (insn != null) {
  15.                         PcodeOp[] insn_pcode = insn.getPcode();
  16.                         for (int i=0;i<insn_pcode.length;i++) {
  17.                               Varnode output = insn_pcode[i].getOutput();
  18.                               Varnode input1 = insn_pcode[i].getInput(0);
  19.                               Varnode input2 = insn_pcode[i].getInput(1);
  20.                               if (input1!=null && input1.isRegister()) {
  21.                                    if (initialized_not_used_registers.contains(input1.getOffset())) {
  22.                                        initialized_not_used_registers.remove(input1.getOffset());
  23.                                    }
  24.                               }
  25.                               if (input2!=null && input2.isRegister()) {
  26.                                    if (initialized_not_used_registers.contains(input2.getOffset())) {
  27.                                        initialized_not_used_registers.remove(input2.getOffset());
  28.                                    }
  29.                               }
  30.                               if (output!=null && output.isRegister()) {
  31.                                    if (!initialized_not_used_registers.contains(output.getOffset()))initialized_not_used_registers.add(output.getOffset());
  32.                               }
  33.                         }
  34.                         insn = insn.getNext();
  35.                  }
  36.                  for (Long varnode : initialized_not_used_registers) {
  37.                         println(""+varnode);
  38.                  }
  39.          }
  40. }
Code:
  1. test.java> 523
  2. ...
  3. test.java> 0
  4. ...

Отфильтровав эту портянку можно будет найти в ней 0, соответствующий регистру eax в адресном пространстве регистров. Он был инициализирован "(register, 0x0, 4) INT_NEGATE (register, 0x0, 4)" и не использован. Это значение, которое функция возвращает. В аргументы не полез, для них нужно писать нормальный солвер, но главное что возможности есть.

| Сообщение посчитали полезным: Vintersorg, plutos, sim_19, omeh2003



Ранг: 322.8 (мудрец)
Статус: Участник

Создано: 29 сентября 2019 17:33 · Поправил: DenCoder New!
Цитата · Личное сообщение · #31

Кому что больше нравится )

Если честно, джавовский код для меня ещё тот гемор, но только с недавних времён. Хочу о нём забыть пока что)
<< 1 ... 9 . 10 . 11 . 12 . 13 . 14 . 15 . 16 . 17 . 18 . 19 . >>
 eXeL@B —› Основной форум —› Использование IDA Pro (part 2)

Видеокурс ВЗЛОМ