PE_Kill

DX0

Новичок
Сообщения
366
Реакции
71
Наткнулся тут на самописный плагин для оли, для восстановления наномитов после армадиллы. Расскажу идею, может кому когда пригодится в аналогичных случаях.

Снял я значит протектор армадилло с одного файла. Но там есть такая защита, как наномиты.Это проставленные int 3 в код файла на место где должен быть джамп, условный или безусловный. При попадании на него, армадилла как отладчик смотрит в своей таблице, что это за тип джампа и эмудирует его, анализируя EFlags. После чего задает тот или иной EIP дочернему процессу. Вроде не сложно, но они сделали хитрый ход. В этой таблице все байты CC что есть в коде. Т.е. и те, что в коде всегда были, это и в адресах и в константах и просто int 3 которые компилятор ставит чтобы выровнять функции. А в качестве Условий и куда переходить просто генерят рандомные данные.

Утилиты что снимают армадиллу сохраняют таблицу. Потом есть возможно запустить программу и следить где сработает наномит и запатчить его. После этого в таблице остаются только необработаные наномиты. И сделать с ними ничего нельзя, нет еще такого инструмента который бы по анализу кода 100% говорил может быть тут наномит или нет. Поэтому просто делают инлайн, который ставит обрабочик int 3 и если когда то исключение произойдет, то повторит логику армадиллы. Т.е. кусочек армадиллы будет в файле всегда. Но как бы оно и не страшно.

Но вот в моем случае мне захотелось полностью убрать эти наномиты. Я готов был на это выделить вменяемое время. Покрутив код в оле, примерно понял как можно анализировать. Если мы перейдем на адрес наномита, то оля пытается выводить дизасм с этого адреса, и не понять нормально это или нет. А если прокрутить окно с листингом вверх, то оля выравнивает код и показывает правильно. Т.е. мне нужен плагин, которвый выведет таблицу наномитов в свою таблицу и я по ней буду перемещаться. А плагин будет перемещаться окно дизасма на нужный адрес, прокручивая вверх. Накидал плагин, и вот для сравнения.
Переходим на адрес наномита:

Не понять, наномит это или нет.

А вот переход с помощью плагина туда же. Это середина процедуры, а не наномит:




Вот еще интересный адрес:


Переходим плагином:

А это банальное выравнивание.

Ну а вот и поганец:


Сделал, чтобы по Enter в плагине джамп восстанавливался:


В итоге получилась листалка. Сидишь жмешь вниз, вниз вниз вниз. Enter. Вниз вниз...
Правда появилась проблема, что глаза очень быстро устают от мельтешения экрана. Поэтому пришлось делать перерывы и на восстановление наномитов ушло часа 2. Как то так...
Вообще, лично я код выравниваю от начала ImageBase или от начала секции ".text", когда работаю с такими адресами и с кодом не выравненым, и при помощи дизассемблера длин обрабатываю такой код. Судя по адресу 0x0044A84D это реальная иснтрукция, тоже самое по адресу 0x00402E23 это тоже реальная инструкция, потому как по опкодам это видно. Я когда исследую код, то я смотрю еще на опкоды, не только на мнемонику, потому как опкод может быть мусор, это и так понятно и без меня. Я понимаю, что есть куча разных jmp-ов, которые указывают на различные куски кода или участки кода, но тут приходит такая мысль, что нужно фильтровать такие jmp-ы на на наличие ret-тов и трассировать код обратно до пролога, ну или по другому алгоритму, тут опять же смотреть нужно и походу писать алгоритм. У каждого свой подход к исследованию защиты, так что это лично мое мнение.
 
Последнее редактирование:

PE_Kill

Мудрец
Сообщения
178
Реакции
891
Судя по адресу 0x0044A84D это реальная иснтрукция, тоже самое по адресу 0x00402E23 это тоже реальная инструкция, потому как по опкодам это видно.
А нука расскажи, как это видно по опкодам. Никто не смог за столько лет, а тебе сразу видно. На примере 0x00402E23. Я просто вполне допускаю, что за столько лет отстал от техник дизассемблирования. Разбери пожалуйста по шагам. Начиная от int 3 по адресу 0x00402E23. Типа вот у нас байт CC на адресе 0x00402E23 он не может тут быть, потому что...
С удовольствием почитаю.
 

DX0

Новичок
Сообщения
366
Реакции
71
А нука расскажи, как это видно по опкодам. Никто не смог за столько лет, а тебе сразу видно. На примере 0x00402E23. Я просто вполне допускаю, что за столько лет отстал от техник дизассемблирования. Разбери пожалуйста по шагам. Начиная от int 3 по адресу 0x00402E23. Типа вот у нас байт CC на адресе 0x00402E23 он не может тут быть, потому что...
С удовольствием почитаю.
Потому что по адресу 0x00402E21 идет инструкция lea, которая читая со стека адрес и получает на нее указатель, потом идет аргумент push-a два до lea и после lea, следовательно тут понятно, что функция Copy принимает два аргумента, даже без названия функции это понятно.
 

PE_Kill

Мудрец
Сообщения
178
Реакции
891
Потому что по адресу 0x00402E21 идет инструкция lea
Откуда ты взял адрес 0x00402E21? У тебя есть только 0x00402E23, всё что выше - это загробный мир. Или у тебя есть секретный дизасм, способный разбирать команды в обратную сторону? Насколько знаю, такого нет ни у кого. Если у тебя есть, можешь на этом миллионы заработать.
 

DX0

Новичок
Сообщения
366
Реакции
71
Откуда ты взял адрес 0x00402E21? У тебя есть только 0x00402E23, всё что выше - это загробный мир. Или у тебя есть секретный дизасм, способный разбирать команды в обратную сторону? Насколько знаю, такого нет ни у кого. Если у тебя есть, можешь на этом миллионы заработать.
А jl 0x402E23 это не верный адрес, его можно отсеить путем фильтрации. Тобишь читаешь адрес прыжка, и от начала ImageBase читаешь при помощи дизассемблера длин инструкции, и если адреса равны, то значит адрес верный, иначе ложный.
 

PE_Kill

Мудрец
Сообщения
178
Реакции
891
А jl 0x402E23 это не верный адрес, его можно отсеить путем фильтрации. Тобишь читаешь адрес прыжка, и от начала ImageBase читаешь при помощи дизассемблера длин инструкции, и если адреса равны, то значит адрес верный, иначе ложный.
там нет jl 0x402E23 там есть jl 0x00402EBA

Если его поставить он будет вести на
masm:
 PUSH ECX
XOR EDX,EDX
CMP DWORD PTR SS:[EBP-0x54],0x0
SETE DL
MOVZX EAX,DL
Армадилла не тупая, ставит джампы на рандомные адреса из тех, что распознала. Вообще очень херово недооценивать противника и считать себя умнее, пока это не докажешь.
 

DX0

Новичок
Сообщения
366
Реакции
71
там нет jl 0x402E23 там есть jl 0x00402EBA

Если его поставить он будет вести на
masm:
 PUSH ECX
XOR EDX,EDX
CMP DWORD PTR SS:[EBP-0x54],0x0
SETE DL
MOVZX EAX,DL
Армадилла не тупая, ставит джампы на рандомные адреса из тех, что распознала. Вообще очень херово недооценивать противника и считать себя умнее, пока это не докажешь.
Там где написано у тебя:
"А вот переход с помощью плагина туда же. Это середина процедуры, а не наномит:" левый скриншот, там адрес 0x402E23 я это адрес имел в виду.

Вот https://cracklab.team/index.php?threads/702/ код, написал ;)

PE_Kill, щас тебе один трюк покажу, хотя это не новый трюк, но знать надо, во вовсяком случае мне пригодилось. Всегда, когда вызывается call в стек помещается адрес возврата и через ret идет дальнейшее исполнение, но есть способ, который этот ret могут обойти протекторы, то есть при помощи

Пример ret. Способ 1:
...
pop eax
jmp eax
...
Пример ret. Способ 2:
...
mov eax, dword [esp]
add esp, 4
jmp eax
...
и еще есть трюки...

эти два способа выполняют роль ret-а, так что на заметку. Я это к тому, что когда обрабатываешь код, тебе нужно дойти до конца jmp eax понять какой регистр он использует, потом от jmp eax читать код обратно, пока не встретишь первый pop eax, хотя бывают способы через ModRM mov eax, dword [esp], и все эти нюансы нужно учесть, это просто на самом деле и их не много. Но нужно учесть один нюанс как я лично это сделал. Бывают такие случаи, когда это может быть и не ret, а прыжок на следующую инструкцию. Вопрос, как понять, что это ret? Все просто! Находишь call копируешь после call следующий адрес и сравниваешь с адресом в jmp мпе. На самом деле способов куча.
 

PE_Kill

Мудрец
Сообщения
178
Реакции
891
Да ну ерунда всё это. Вот в крипторе весело было. Он генерил (это без морфа) что то вроде:
Код:
mov exx, const
sub exx, const
xor exx, const
ror exx, const
cmp exx, const
jb branch
terminate_process
Пришлось писать эмулятор математики. Писалось всё под дизасм Mediana.

Проверка на то, что это команда шифрования
Код:
function TEcNode.IsCryptReg(Index: Integer; Reg: Byte): Boolean;
const
  CryptInsts: array [0..6] of Word = (
    ID_ADD, ID_SUB, ID_AND, ID_XOR, ID_OR, ID_ROL, ID_ROR
  );
var
  Inst: TInstruction;
  function InstId_In_CryptInsts(Id: Word): Boolean; inline;
  var
    i : Integer;
  begin
    Result := True;
    for i := 0 to SizeOf(CryptInsts) - 1 do
      if Id = CryptInsts[i] then Exit
    ;
    Result := False;
  end;
begin
  Inst := PEcCommand(FList.Items[Index])^.Inst;
  Result := (InstId_In_CryptInsts(Inst.Id)) and
            (Inst.Ops[0].Flags and OPERAND_TYPE_REG = OPERAND_TYPE_REG) and
            (Inst.Ops[0].Size = 4) and
            (Inst.Ops[0].Value.Reg.RType = REG_TYPE_GEN) and
            (Inst.Ops[0].Value.Reg.RCode = Reg) and
            (Inst.Ops[1].Flags and OPERAND_TYPE_IMM = OPERAND_TYPE_IMM);
end;
Тут собственно детект и восстановление
Код:
// cmp/test/and reg32, imm32
  if (i >= 0) and
     ((EcNode.EcCmd[i]^.Inst.Id = ID_CMP) or (EcNode.EcCmd[i]^.Inst.Id = ID_TEST) or (EcNode.EcCmd[i]^.Inst.Id = ID_AND)) and
     (EcNode.EcCmd[i]^.Inst.Ops[0].Flags and OPERAND_TYPE_REG = OPERAND_TYPE_REG) and
     (EcNode.EcCmd[i]^.Inst.Ops[0].Size = 4)and
     (EcNode.EcCmd[i]^.Inst.Ops[0].Value.Reg.RType = REG_TYPE_GEN) and
     (EcNode.EcCmd[i]^.Inst.Ops[1].Flags and OPERAND_TYPE_IMM = OPERAND_TYPE_IMM) and
     (EcNode.EcCmd[i]^.Inst.Ops[1].Size = 4) then
...
// Далее раскручиваем листинг назад и тестит операции через
IsCryptReg
...
// Запускаем мат симулятор
RegVal := EcNode.EmuleCrypt(i, RegVal)
...
// Эмулируем команду сравнения
InitEFlags(EFlags);
      case EcNode.EcCmd[i]^.Inst.Id of
        ID_CMP: SetEFlagsBySub(RegVal, EcNode.EcCmd[i]^.Inst.Ops[1].Value.Imm.Misc.Imm32, DWord(RegVal - EcNode.EcCmd[i]^.Inst.Ops[1].Value.Imm.Misc.Imm32), 4, EFlags);
        ID_TEST: SetEFlagsByTest(RegVal, EcNode.EcCmd[i]^.Inst.Ops[1].Value.Imm.Misc.Imm32, 4, EFlags);
        ID_AND: SetEFlagsByTest(RegVal, EcNode.EcCmd[i]^.Inst.Ops[1].Value.Imm.Misc.Imm32, 4, EFlags);
      end;
      if CheckJccCond(EcNode.EcCmd[Index]^.Inst.Id, EFlags) then
        begin
          CreateInstruction(PeFile.Raw2Va(PeFile.Ptr2Raw(EcNode.EcCmd[Index]^.Ptr)),
                            Format('jmp 0%.08X', [EcNode.EcCmd[Index]^.Inst.Ops[0].Value.Imm.Misc.Imm32]),
                            EcNode.EcCmd[Index]^.Inst);
          EcNode.EcCmd[Index]^.IsEcNop := True;
          EcNode.EcCmd[Index]^.Comment := 'jcc imm32->jmp imm32';
          EcNode.EndPtr := PeFile.Va2Ptr(EcNode.EcCmd[Index]^.Inst.Ops[0].Value.Imm.Misc.Imm32);
        end
      else
        begin
          EcNode.EcCmd[Index]^.IsEcNop := True;
          EcNode.EcCmd[Index]^.Comment := 'jcc imm32->nop';
        end
      ;
 

DX0

Новичок
Сообщения
366
Реакции
71
Да ну ерунда всё это. Вот в крипторе весело было. Он генерил (это без морфа) что то вроде:
Код:
mov exx, const
sub exx, const
xor exx, const
ror exx, const
cmp exx, const
jb branch
terminate_process
Пришлось писать эмулятор математики. Писалось всё под дизасм Mediana.

Проверка на то, что это команда шифрования
Код:
function TEcNode.IsCryptReg(Index: Integer; Reg: Byte): Boolean;
const
  CryptInsts: array [0..6] of Word = (
    ID_ADD, ID_SUB, ID_AND, ID_XOR, ID_OR, ID_ROL, ID_ROR
  );
var
  Inst: TInstruction;
  function InstId_In_CryptInsts(Id: Word): Boolean; inline;
  var
    i : Integer;
  begin
    Result := True;
    for i := 0 to SizeOf(CryptInsts) - 1 do
      if Id = CryptInsts[i] then Exit
    ;
    Result := False;
  end;
begin
  Inst := PEcCommand(FList.Items[Index])^.Inst;
  Result := (InstId_In_CryptInsts(Inst.Id)) and
            (Inst.Ops[0].Flags and OPERAND_TYPE_REG = OPERAND_TYPE_REG) and
            (Inst.Ops[0].Size = 4) and
            (Inst.Ops[0].Value.Reg.RType = REG_TYPE_GEN) and
            (Inst.Ops[0].Value.Reg.RCode = Reg) and
            (Inst.Ops[1].Flags and OPERAND_TYPE_IMM = OPERAND_TYPE_IMM);
end;
Тут собственно детект и восстановление
Код:
// cmp/test/and reg32, imm32
  if (i >= 0) and
     ((EcNode.EcCmd[i]^.Inst.Id = ID_CMP) or (EcNode.EcCmd[i]^.Inst.Id = ID_TEST) or (EcNode.EcCmd[i]^.Inst.Id = ID_AND)) and
     (EcNode.EcCmd[i]^.Inst.Ops[0].Flags and OPERAND_TYPE_REG = OPERAND_TYPE_REG) and
     (EcNode.EcCmd[i]^.Inst.Ops[0].Size = 4)and
     (EcNode.EcCmd[i]^.Inst.Ops[0].Value.Reg.RType = REG_TYPE_GEN) and
     (EcNode.EcCmd[i]^.Inst.Ops[1].Flags and OPERAND_TYPE_IMM = OPERAND_TYPE_IMM) and
     (EcNode.EcCmd[i]^.Inst.Ops[1].Size = 4) then
...
// Далее раскручиваем листинг назад и тестит операции через
IsCryptReg
...
// Запускаем мат симулятор
RegVal := EcNode.EmuleCrypt(i, RegVal)
...
// Эмулируем команду сравнения
InitEFlags(EFlags);
      case EcNode.EcCmd[i]^.Inst.Id of
        ID_CMP: SetEFlagsBySub(RegVal, EcNode.EcCmd[i]^.Inst.Ops[1].Value.Imm.Misc.Imm32, DWord(RegVal - EcNode.EcCmd[i]^.Inst.Ops[1].Value.Imm.Misc.Imm32), 4, EFlags);
        ID_TEST: SetEFlagsByTest(RegVal, EcNode.EcCmd[i]^.Inst.Ops[1].Value.Imm.Misc.Imm32, 4, EFlags);
        ID_AND: SetEFlagsByTest(RegVal, EcNode.EcCmd[i]^.Inst.Ops[1].Value.Imm.Misc.Imm32, 4, EFlags);
      end;
      if CheckJccCond(EcNode.EcCmd[Index]^.Inst.Id, EFlags) then
        begin
          CreateInstruction(PeFile.Raw2Va(PeFile.Ptr2Raw(EcNode.EcCmd[Index]^.Ptr)),
                            Format('jmp 0%.08X', [EcNode.EcCmd[Index]^.Inst.Ops[0].Value.Imm.Misc.Imm32]),
                            EcNode.EcCmd[Index]^.Inst);
          EcNode.EcCmd[Index]^.IsEcNop := True;
          EcNode.EcCmd[Index]^.Comment := 'jcc imm32->jmp imm32';
          EcNode.EndPtr := PeFile.Va2Ptr(EcNode.EcCmd[Index]^.Inst.Ops[0].Value.Imm.Misc.Imm32);
        end
      else
        begin
          EcNode.EcCmd[Index]^.IsEcNop := True;
          EcNode.EcCmd[Index]^.Comment := 'jcc imm32->nop';
        end
      ;
Ну смотря какой протектор еще, так то спору нет. Все равно авторы продумывают алгоритм так, чтобы их распаковщик мог распаковать их же протектор. Было бы глупо, если бы был бы протектор и небыло бы ключа. Mediana дизассемблер классный инструмент, спору нет. А на счет алгоритма это понятно, главное что работает.

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

Во всяком случае протектор который я исследую, там базой были числа зашифрованных api функции, которые в последствии расшифровывались, и вот этот декриптор я написал, ну там прям не супер пупер декриптор, там чисто идет работа с числами, типа сложить и вычесть, не более того. А так, криптор, декриптор можно реализовать, главное время и желание.

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

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

PE_Kill

Мудрец
Сообщения
178
Реакции
891
PE_Kill, а ты какой язык программирования знаешь не считая паскалья?
Из тех, что компилируются

На котором прям сейчас смогу писать: masm32, Pascal, Go Lang
На которых пописывал временами: C(без плюсов), VB

Или же написать новый движок на паскале, так сказать, провести рефакторинг.
Не нужно оно. Прот помер походу. Доделаю реконструкцию TLS и выложу с сорсами.

Единственное, что возможно сделаю, если смогу, это декомпиляция Delay VM2. Т.к. это мой единорог, цель так сказать, которой я не добился в свое время. Анпакер ее поддерживает на самом деле, но он был выложен без ядер декомпилятора. А эти ядра для конкретной версии каждое. А хотел сделать эвристический.

Щас как раз сорсы перебираю, вспоминаю, как мы с Неркловым расколупывали эту VM параллельно, делясь наработками. Но тогда и он и я пришли к одному решению. Полностью восстановить эмулятор, чтобы он вместо исполнения восстанавливал инструкции. А т.к. эмулятор под каждый билд аспра модифицировался (его структуры), то универсально ни я ни Внекрылов сделать не смогли.

Есть тут олды? Внекрылов смог сделать универсальный декомпиль по итогу?
 

DX0

Новичок
Сообщения
366
Реакции
71
Из тех, что компилируются

На котором прям сейчас смогу писать: masm32, Pascal, Go Lang
На которых пописывал временами: C(без плюсов), VB


Не нужно оно. Прот помер походу. Доделаю реконструкцию TLS и выложу с сорсами.

Единственное, что возможно сделаю, если смогу, это декомпиляция Delay VM2. Т.к. это мой единорог, цель так сказать, которой я не добился в свое время. Анпакер ее поддерживает на самом деле, но он был выложен без ядер декомпилятора. А эти ядра для конкретной версии каждое. А хотел сделать эвристический.

Щас как раз сорсы перебираю, вспоминаю, как мы с Неркловым расколупывали эту VM параллельно, делясь наработками. Но тогда и он и я пришли к одному решению. Полностью восстановить эмулятор, чтобы он вместо исполнения восстанавливал инструкции. А т.к. эмулятор под каждый билд аспра модифицировался (его структуры), то универсально ни я ни Внекрылов сделать не смогли.

Есть тут олды? Внекрылов смог сделать универсальный декомпиль по итогу?
Ну, кстати, я тебе скажу, что твой распаковщик DecomAS распаковывает ASProtect у программы ePochta, только почему то программа не запускается и пишит, что не верный адрес, как я понял, это из-за не верного OEP-а. Так то, планируешь написать что-то новое, или как? Ты если что, то пиши, помогу чем смогу.
 
Последнее редактирование:

Sp1n

Мудрец
Сообщения
116
Реакции
72
PE_Kill

> нет еще такого инструмента который бы по анализу кода 100% говорил может быть тут наномит или нет.

Это простая задача на покрытие кода. Нужно узнать основные входные адреса для процедур, далее парсить каждую процедуру что бы весь флоу получить. Арма может есчо релатив бранчи вставлять. Стабы спецом делает так, что бы сломать флоу, на два jcc с одинаковым CC - второе невалид флоу.

Получить опорные адреса для покрытия позволяет трансляция. Арма сыпет много фаултов, но они прозрачны, разве что дельта тск < 100 в сех должна быть.
 

PE_Kill

Мудрец
Сообщения
178
Реакции
891
Ну, кстати, я тебе скажу, что твой распаковщик DecomAS распаковывает ASProtect у программы ePochta, только почему то программа не запускается и пишит, что не верный адрес, как я понял, это из-за не верного OEP-а. Так то, планируешь написать что-то новое, или как? Ты если что, то пиши, помогу чем смогу.
Скинь ссылку, я проверю на доделаной версии.
 

DX0

Новичок
Сообщения
366
Реакции
71
Ок. Щас скину в ЛС
 

PE_Kill

Мудрец
Сообщения
178
Реакции
891
Ок. Щас скину в ЛС
Очень странная прога. Старым анпакером у меня не анпачится на вин 10, сам анпакер падает. А новый который я пофиксил, распаковывает.
Прога загружается в отладчик без ошибок, но при старте под отладчиком начинются бесконечно сыпать исключения деления на ноль.

Там прога активно работает с секцией BSS. И вот анпакер как раз ругается, что BSS заполнена данными. Хоть убей не помню, почему такой кейс есть в анпакере, видимо были прецеденты. Возможно она заполнялась на версиях аспра 1.x он до OEP может функции вызывать из программы. А тут 2.5 версия. Очень интересно. TLS доделаю и подробнее гляну.

PS. Но вообще там весь код перешифрован, без ключа всё равно не снять.. 30 пошифрованых блоков.

PPS: Нашел в сорсах дешифровщик метаданных для пошифрованых кусков, можно не искать спертый код, вот он весь в таблице:
Код:
Self check...
Size of TEncryptedRecord: 0x1B
---------------------------------
Read PE file...
Loading records...
Data size: 0x0000032A
Records count: 30
Markers: (id: count)
  #1: 30

Starting plain text attack...
Gamma found: [0xE3979A92, 0xCFFFD2A6, 0x525697C3]
Decrypted markers:
Id  | Marker RVA | Code RVA | Code Size
----------------------------------------
1   |  00C8E463  | 00C8E468 | 0000001E |
1   |  00C83237  | 00C8323C | 00000014 |
1   |  00C830DC  | 00C830E1 | 00000014 |
1   |  00C83013  | 00C83018 | 00000057 |
1   |  00C82F8E  | 00C82F93 | 00000014 |
1   |  00C82684  | 00C82689 | 0000005E |
1   |  00C7E901  | 00C7E906 | 00000025 |
1   |  00C7E883  | 00C7E888 | 00000019 |
1   |  00C7E2CD  | 00C7E2D2 | 0000018F |
1   |  00C7634B  | 00C76350 | 00000012 |
1   |  00C76062  | 00C76067 | 000000F0 |
1   |  00C72A8D  | 00C72A92 | 0000003D |
1   |  00C705F6  | 00C705FB | 00000686 |
1   |  00C6E8BA  | 00C6E8BF | 00000032 |
1   |  00BA2665  | 00BA266A | 000000C9 |
1   |  00B6105B  | 00B61060 | 0000009D |
1   |  00AF82FB  | 00AF8300 | 00000027 |
1   |  0099FDD5  | 0099FDDA | 0000000E |
1   |  0099F591  | 0099F596 | 0000001F |
1   |  0084D38D  | 0084D392 | 000000D9 |
1   |  0084C60C  | 0084C611 | 000001F9 |
1   |  00843233  | 00843238 | 00000025 |
1   |  00843195  | 0084319A | 00000066 |
1   |  00841F73  | 00841F78 | 00000023 |
1   |  00840722  | 00840727 | 0000005D |
1   |  0083CCD8  | 0083CCDD | 0000004B |
1   |  0083CC92  | 0083CC97 | 0000002B |
1   |  00813719  | 0081371E | 0000001F |
1   |  00810F18  | 00810F1D | 0000007E |
1   |  0051787C  | 00517881 | 00000073 |
 
Последнее редактирование:

PE_Kill

Мудрец
Сообщения
178
Реакции
891
Вот за это + (y)!
Если не секрет, в каких целях используешь?
Какой материал изучал, для познания Go?
Так его для одной единственной цели используют - написание серверов или микросервисов, которые по сути те же сервера только специфичные. Для того оно и создавалось. Нет конечно фанаты лепят туда всё, что угодно, даже интринсики и гуй, но так же развлекались и фанаты Delphi и ничем это хорошим не закончилось.

А насчет материалов, да ниче не использовал. Как то давно подход выработал что берем любой манул по Hello Worlds а дальше ставим реальную задачу и начинаем кодить штудируя Stack Overflow, How To..., сорсы либ и прочее. Я в качестве такой задачи сделал неофициальный клиент к mail.ru облаку, используя браузерное API.
А ну, а клиент сам по себе был сервером. Т.е. он предоставлял API для загрузки файлов, а сам при этом как прокси использовал mail.ru
 

Sp1n

Мудрец
Сообщения
116
Реакции
72
PE_Kill

Потестил метод, нашло 700 бранчей. Как ты такое втыкал в отладчик хз, там глаза не то что устанут, а вытекут :)

При трансляции вызывается код в архиве, там кстати ксед. Помечает инструкции и все ветви, добавляет найденные бранчи в авл. Так что задача не сложная.

arm.png
 

Прикрепленные файлы:

  • Love
Реакции: mak
Верх Низ