1. По причине блокировки роскомнадзором раз в несколько месяцев мы меняем доменное имя. Чтоб не потерять новую ссылку просто зарегистрируйтесь и вы получите сообщение о замене на свою почту!
    Скрыть объявление
Скрыть объявление
По причине блокировки роскомнадзором раз в несколько месяцев мы меняем доменное имя. Чтоб не потерять новую ссылку просто зарегистрируйтесь и вы получите сообщение о замене на свою почту!
Скрыть объявление
Проводите сделки через Гарант-сервис чтоб полностью обезопасить свои покупки.

Автоматизации аудио дампов

Тема в разделе "Реальный кардинг. Заливы на карты. Документы.", создана пользователем Garant-Service, 26 янв 2013.

  1. Garant-Service

    Garant-Service dark-shadow Команда форума Администратор

    Сообщения:
    622
    Симпатии:
    26
    Баллы:
    18
    Здравствуйте, господа воры! В данной статье я расскажу о том, как можно частично автоматизировать работу с декодированием аудиодампов + частично покажу в исходном коде. В качестве бонуса сама программа.
    Возможно данная тема обсуждалась много раз, но я покажу свой вариант решения данного вопроса.

    Наверняка все слышали про "ручной" декод аудио дампов средствами exel. Данная программа построена так же.

    Передо мной была поставлена задача автоматизировать работу дешифровки дампов. Дано - пример аудио + exel-файл.

    Для начала нам понадобится wav-файл (программа умеет работать только с wav-файлами) с дампом. Идеальные характеристики wav: 8 bit, 44100, mono. Необходимо, чтобы в этом файле был только один дамп, возможно состоящий из нескольких частей + она умеет работать с реверсом, т.е. обратный выход карты из картоприемника. Весь код построен на Delphi.

    Вся работа программы основывается на нескольких этапах:
    - определить дискреты и вычислить тайминги;
    - определение битов;
    - сравнение;
    - декод.

    Каждый этап работы программы должен быть визуализирован для четкого понимания где может быть ошибка или потеря бита. Так же она хорошо подходит для отладки устройства (скима).

    Открываем файл и считываем начальные данные (дискреты) и определяем тайминги:


    var r : TWaveResult; i : integer; W1, W2 : SmallInt; _tp:boolean; temp:integer; buf:string;
    ...
    _tp:=false;
    temp:=0;
    if opendialog1.Execute then begin
    r : TWaveResult;
    r := ReadWave(opendialog1.FileName);
    r.Data.seek(0, soFromBeginning);
    for i := 1 to r.Data.Size{ div 1}
    do Begin
    r.Data.readBuffer(W1, 1);
    if (W1 > 138) or (W1 < 118) then tup := true;
    if _tp then temp := temp + 1;
    if (W1 > 138) and (temp > 2) then begin
    if temp <> 3 then
    buf := buf + IntToStr(temp)+#13+#10;
    temp := 0;
    end;
    if (W1 < 118) and (temp > 2) then begin
    if temp <> 3 then
    buf := buf + IntToStr(temp)+#13+#10;
    temp := 0;
    end;
    end;
    Memo1.Lines.Add(buf); // добавляем для визуализации


    После определения таймингов приступаем к этапу определения битов:


    ...
    // Опять же Memo4 добавлен для визуализации
    for i:=0 to Memo1.Lines.Count-1 do begin
    temp := Memo1.Lines.Strings;
    if i=0 then begin Memo4.Lines.Add('0'); goto ggg end;
    if (temp = '') or (temp = ' ') or (temp = 'ПРОПУСК') then goto ggg;
    if temp > 160 then Memo4.Lines.Add('ПРОПУСК') else
    if Memo4.Lines.Strings[Memo4.Lines.Count-1] = 'ПРОПУСК' then Memo4.Lines.Add('0') else
    if (temp * 3 / 4) > StrToInt(Memo1.Lines.Strings[i-1]) then Memo4.Lines.Add('0') else
    if (StrToInt(Memo1.Lines.Strings[i-1]) * 3 / 4) > temp then begin
    if Memo4.Lines.Strings[Memo4.Lines.Count-1] = '0' then begin Memo4.Lines.Add('1'); goto ggg; end;
    if Memo4.Lines.Strings[Memo4.Lines.Count-1] = '1' then begin Memo4.Lines.Add('-1'); goto ggg; end;
    if Memo4.Lines.Strings[Memo4.Lines.Count-1] = '-1' then begin Memo4.Lines.Add('1'); goto ggg; end;
    end else begin
    if Memo4.Lines.Strings[Memo4.Lines.Count-1] = '1' then begin Memo4.Lines.Add('-1'); goto ggg; end;
    if Memo4.Lines.Strings[Memo4.Lines.Count-1] = '-1' then begin Memo4.Lines.Add('1'); goto ggg; end;
    Memo4.Lines.Add(Memo4.Lines.Strings[Memo4.Lines.Count-1]);
    end;
    ggg: begin end;
    end;
    ...


    В этом куске кода нихрена не понятно, но оно работает :)

    Далее идет этап сравнения:



    // Это добавлено для смещения если идет потеря битов
    off0:=true;
    off1:=false;
    off2:=false;
    off3:=false;
    off4:=false;
    found := false;
    for i:=0 to Memo4.Lines.Count-1 do begin
    temp := Memo4.Lines.Strings;
    if temp = 1 then found := true;
    if (temp = 0) and (not found) then begin
    goto ttt;
    end else begin
    check := check + 1;
    Memo3.Lines.Add(Memo4.Lines.Strings);
    if check >= 5 then
    begin
    Memo3.Lines.Add('---');
    check := 0;
    end;
    end;
    ttt: begin end;
    end;
    check := 0;
    for i:=0 to Memo3.Lines.Count-1 do begin
    temp := Memo3.Lines.Strings;
    if temp = '---' then goto sss;
    check := check + 1;
    if check = 1 then bit1 := StrToInt(Memo3.Lines.Strings);
    if check = 2 then bit2 := StrToInt(Memo3.Lines.Strings);
    if check = 3 then bit3 := StrToInt(Memo3.Lines.Strings);
    if check = 4 then bit4 := StrToInt(Memo3.Lines.Strings);
    if check = 5 then bit5 := StrToInt(Memo3.Lines.Strings);
    if check >= 5 then
    begin
    if checkbits(bit1,bit2,bit3,bit4,bit5) then begin
    Memo5.Lines.Add(IntToStr(bit1));
    Memo5.Lines.Add(IntToStr(bit2));
    Memo5.Lines.Add(IntToStr(bit3));
    Memo5.Lines.Add(IntToStr(bit4));
    Memo5.Lines.Add(IntToStr(bit5));
    Memo5.Lines.Add('TRUE');
    end else begin
    Memo5.Lines.Add(IntToStr(bit1));
    Memo5.Lines.Add(IntToStr(bit2));
    Memo5.Lines.Add(IntToStr(bit3));
    Memo5.Lines.Add(IntToStr(bit4));
    Memo5.Lines.Add(IntToStr(bit5));
    Memo5.Lines.Add('FALSE');
    Edit1.Text := Edit1.Text + '!';
    end;
    check := 0;
    end;
    sss: begin
    end;
    ...


    Вот сама функция проверки битов и определения символа:


    function TForm1.checkbits(tbit1, tbit2, tbit3, tbit4,
    tbit5: integer): boolean;
    var buf:string;
    begin
    buf := '';
    result := false;
    // 0
    if (tbit1 = 0) and (tbit2 = 0) and (tbit3 = 0) and (tbit4 = 0) and (tbit5 = 1) then begin buf := '0'; result := true; end;
    // 1
    if (tbit1 = 1) and (tbit2 = 0) and (tbit3 = 0) and (tbit4 = 0) and (tbit5 = 0) then begin buf := '1'; result := true; end;
    // 2
    if (tbit1 = 0) and (tbit2 = 1) and (tbit3 = 0) and (tbit4 = 0) and (tbit5 = 0) then begin buf := '2'; result := true; end;
    // 3
    if (tbit1 = 1) and (tbit2 = 1) and (tbit3 = 0) and (tbit4 = 0) and (tbit5 = 1) then begin buf := '3'; result := true; end;
    // 4
    if (tbit1 = 0) and (tbit2 = 0) and (tbit3 = 1) and (tbit4 = 0) and (tbit5 = 0) then begin buf := '4'; result := true; end;
    // 5
    if (tbit1 = 1) and (tbit2 = 0) and (tbit3 = 1) and (tbit4 = 0) and (tbit5 = 1) then begin buf := '5'; result := true; end;
    // 6
    if (tbit1 = 0) and (tbit2 = 1) and (tbit3 = 1) and (tbit4 = 0) and (tbit5 = 1) then begin buf := '6'; result := true; end;
    // 7
    if (tbit1 = 1) and (tbit2 = 1) and (tbit3 = 1) and (tbit4 = 0) and (tbit5 = 0) then begin buf := '7'; result := true; end;
    // 8
    if (tbit1 = 0) and (tbit2 = 0) and (tbit3 = 0) and (tbit4 = 1) and (tbit5 = 0) then begin buf := '8'; result := true; end;
    // 9
    if (tbit1 = 1) and (tbit2 = 0) and (tbit3 = 0) and (tbit4 = 1) and (tbit5 = 1) then begin buf := '9'; result := true; end;
    // :
    if (tbit1 = 0) and (tbit2 = 1) and (tbit3 = 0) and (tbit4 = 1) and (tbit5 = 1) then begin buf := ':'; result := true; end;
    // ;
    if (tbit1 = 1) and (tbit2 = 1) and (tbit3 = 0) and (tbit4 = 1) and (tbit5 = 0) then begin buf := ';'; result := true; end;
    // <
    if (tbit1 = 0) and (tbit2 = 0) and (tbit3 = 1) and (tbit4 = 1) and (tbit5 = 1) then begin buf := '<'; result := true; end;
    // =
    if (tbit1 = 1) and (tbit2 = 0) and (tbit3 = 1) and (tbit4 = 1) and (tbit5 = 0) then begin buf := '='; result := true; end;
    // >
    if (tbit1 = 0) and (tbit2 = 1) and (tbit3 = 1) and (tbit4 = 1) and (tbit5 = 0) then begin buf := '>'; result := true; end;
    // ?
    if (tbit1 = 1) and (tbit2 = 1) and (tbit3 = 1) and (tbit4 = 1) and (tbit5 = 1) then begin buf := '?'; result := true; end;
    // это необходимо для смещения
    if off0 then Edit1.Text := Edit1.Text + buf;
    if off1 then Edit2.Text := Edit2.Text + buf;
    if off2 then Edit3.Text := Edit3.Text + buf;
    if off3 then Edit4.Text := Edit4.Text + buf;
    if off4 then Edit5.Text := Edit5.Text + buf;
    end;


    После работы в поле Edit1 будет декодированный текст.

    http://www.sendspace.com/file/hzj3yy
    pass:vasiliev
  2. Dozer

    Dozer

    Сообщения:
    1
    Симпатии:
    0
    Баллы:
    1
    Перезалейте софт если нетрудно.

Поделиться этой страницей