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

vasiliev

BANNED
Messages
60
Reputation
0
Reaction score
4
Points
8
Please note, if you want to make a deal with this user, that it is blocked.
Автоматизации декода аудио дампов

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

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

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

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

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

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

Открываем файл и считываем начальные данные (дискреты) и определяем тайминги:
Code:
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); // добавляем для визуализации

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

Code:
...
// Опять же Memo4 добавлен для визуализации
for i:=0 to Memo1.Lines.Count-1 do begin
temp := Memo1.Lines.Strings[i];
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;
...
В этом куске кода нихрена не понятно, но оно работает :)

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

Code:
// Это добавлено для смещения если идет потеря битов
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[i];
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[i]);
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[i];
if temp = '---' then goto sss;
check := check + 1;

if check = 1 then bit1 := StrToInt(Memo3.Lines.Strings[i]);
if check = 2 then bit2 := StrToInt(Memo3.Lines.Strings[i]);
if check = 3 then bit3 := StrToInt(Memo3.Lines.Strings[i]);
if check = 4 then bit4 := StrToInt(Memo3.Lines.Strings[i]);
if check = 5 then bit5 := StrToInt(Memo3.Lines.Strings[i]);

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;
...
Вот сама функция проверки битов и определения символа:

Code:
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

Только для carder.market

// добавлено
На бесплатной основе предоставляю исходники, но при условии, что будут дописаны функции, которые будут необходимы другим участникам борда. В проге есть весь базовый функционал и очень удобно дописывать свой код.
 
Last edited:

Garriet

Carder
Messages
65
Reputation
5
Reaction score
6
Points
8
хоть что то получилось раскодировать с помощью твоей проги?
 

Status

Professional
Messages
127
Reputation
10
Reaction score
12
Points
18
Тут как я понял, по одному дампу втыкать ? Или можно просто запись со скима с кучей дампов ?
 

Garriet

Carder
Messages
65
Reputation
5
Reaction score
6
Points
8
по одному дампу. только толку от этого)
 

Status

Professional
Messages
127
Reputation
10
Reaction score
12
Points
18
Чето у меня ни че не определил, как толку от этого ??? Помойму хорошая прога. Если работать будет. На соседней площадке, если я не ошибаюсь такое же творение продают за 300$
 

vasiliev

BANNED
Messages
60
Reputation
0
Reaction score
4
Points
8
Please note, if you want to make a deal with this user, that it is blocked.
Да, безусловно. Хоть прога изначально и создавалась, как основное средство для декода данных, но в дальнейшем ее предназначение было для отладки. С помощью нее можно понять какая головка лучше, какая хуже, какая скорость считывания более оптимальная (следовательно какой банкомат больше подходит для идеального декода данных) и т.д. В данный момент прога является базовой, но в нее можно с легкостью дописывать функции, для большего удобства работы.
В данный момент я ее не использую, т.к. работаю с флеш-кишками. Прогу можно допилить к примеру для работы с блютуз-гарнитурой.

---------- Сообщение добавлено в 12:58 AM ---------- Предыдущее сообщение размещено в 12:55 AM ----------

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

Ninja

Moderator
Messages
2,350
Reputation
394
Reaction score
450
Points
83
Вот вся проблема в том, что многие реальщики не хотят аудио - запары с декодом.
 

vasiliev

BANNED
Messages
60
Reputation
0
Reaction score
4
Points
8
Please note, if you want to make a deal with this user, that it is blocked.
по одному дампу. только толку от этого)
В начале статьи написано, что прога работает на основе exel-файла. Здесь не полная, а частичная автоматизация декода. Но опять же повторюсь, что можно дописать под все, что угодно. Кароч, если кто-то хочет дописать прогу - могу на безплатной основе поделиться исходниками, но при условии что будут дописаны функции, которые будут обговорены и интересны другим участникам борда. Повторюсь, что прога базовая и в нее можно с легкостью дописывать все необходимые функции.

---------- Сообщение добавлено в 01:05 AM ---------- Предыдущее сообщение размещено в 01:03 AM ----------

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

Garriet

Carder
Messages
65
Reputation
5
Reaction score
6
Points
8
готов проинвестировать проект. у меня не получается расдекодить даже половину трека.
 

Ninja

Moderator
Messages
2,350
Reputation
394
Reaction score
450
Points
83
Могу сказать, что очень интересны твои начинания. Надеюсь, что сработаешься с кем-то из нашего коллектива.
 

vasiliev

BANNED
Messages
60
Reputation
0
Reaction score
4
Points
8
Please note, if you want to make a deal with this user, that it is blocked.
готов проинвестировать проект. у меня не получается расдекодить даже половину трека.
В данный момент в инвестициях я не нуждаюсь, но помощь с декодом безусловно могу. Пиши в ЛС, что не получается раскодить.
 

kkk

Professional
Messages
187
Reputation
17
Reaction score
21
Points
18
Распознать вавку и понаставить битов - это половина задачи.
Вторая половина - распознать кривые руки холдера, которые двигают карту неравномерно.
Так бит 1 может быть растянут простым рывком до 00. Равно как и 00 небольшим толчком сожмется до 1. Собственно, можно декодить и подряд, проверяя в конце весь трек через LRC , но тут кроется микро-пиздец: если поменять местами цифры в треке, то LRC будет одинаков, а трек будет уже неверный.
На практике имеем - холдер дернул карту, прога распознала не 12301, а 12310... показывает - LRC вроде бы совпало, радуемся, идем в банкомат, а там - хуй, плюемся, идем обратно декодить заново и искать ошибку.

Так что, учи прогу распознавать кривые руки. :)
 

vasiliev

BANNED
Messages
60
Reputation
0
Reaction score
4
Points
8
Please note, if you want to make a deal with this user, that it is blocked.
Распознать вавку и понаставить битов - это половина задачи.
Вторая половина - распознать кривые руки холдера, которые двигают карту неравномерно.
Так бит 1 может быть растянут простым рывком до 00. Равно как и 00 небольшим толчком сожмется до 1. Собственно, можно декодить и подряд, проверяя в конце весь трек через LRC , но тут кроется микро-пиздец: если поменять местами цифры в треке, то LRC будет одинаков, а трек будет уже неверный.
На практике имеем - холдер дернул карту, прога распознала не 12301, а 12310... показывает - LRC вроде бы совпало, радуемся, идем в банкомат, а там - хуй, плюемся, идем обратно декодить заново и искать ошибку.

Так что, учи прогу распознавать кривые руки.
Большое спасибо за подсказку! Учту.
 

leg@

Professional
Messages
186
Reputation
2
Reaction score
19
Points
18
Читайте оба трека. Валид реально будет при похуй че там дергали под 100проц.
 

vasiliev

BANNED
Messages
60
Reputation
0
Reaction score
4
Points
8
Please note, if you want to make a deal with this user, that it is blocked.
Читайте оба трека. Валид реально будет при похуй че там дергали под 100проц.
Сейчас она умеет только один трек читать. В принципе добавить второй - так же не есть проблема. Спасибо. Учту.
 

leg@

Professional
Messages
186
Reputation
2
Reaction score
19
Points
18
Там неразбирался в софт твой, мерялка длительностей на тини85 нада? Их можно в эксель загонять сходу или назат в звук превратить.
 

vasiliev

BANNED
Messages
60
Reputation
0
Reaction score
4
Points
8
Please note, if you want to make a deal with this user, that it is blocked.
нада =)
 
Top