磁気ATMカードからのデータの視覚化とデコード

この出版物での関心の対象は、機器や設備が不足している状況で、ATMカードの2番目のトラックからデータを読み取り、デコードすることです。



そもそも、私はあなたに乾いた理論的知識を与えます。 理論に興味がない場合は、スキップできます。



フィルムまたはトラックは、強磁性体の最小(非常に小さい)粒子-残留磁化を持つ物質であるプラスチックです。 フェロマグネットは、学校の顕微鏡や修理用顕微鏡では見分けがつかないほど小さく、ハニカム、顆粒、結晶に似た形状をしています。



表面に塗布するプロセスでは、すぐに方向を通過します。つまり、磁場の線に従って回転します。 これにより、トラックの磁気特性がいくらか改善されます。 その後、固定剤と保護層が適用されます。 すべて、物理的に位置を変更することはできません。磁気誘導ベクトルの方向(同じ残留磁化、磁力線)の変更は、分子レベルでのみ可能になりました。 しかし、製造後のストリップがすぐに磁気特性を持つと考える必要はありません。 第一に、もしそうであれば、それらは小さすぎます。第二に、ベクトルの方向はランダムに方向付けられ、互いに打ち消し合います。



このようなストリップを磁場に入れて待ちます。 エネルギー馬が障壁を飛び越え、これらの粒子の磁気誘導ベクトルの大きさが外部磁場のベクトルと一致せず、粒子自体がエネルギーを蓄えず、実際の永久磁石になるまで待機します。 それだけです。今、このストリップで爪を引きつけ、動物園の猿に衝撃を与えます。



バージン経路を無気力状態から残留磁化状態に移行させる特定の一次磁化があります。 完全な全体像を得るには、ヒステリシスの全体像を考慮する必要があります。これは、強磁性体の考えられるすべての磁気状態を反映しています。 その中には、完全な消磁の2つの状態があります。



これで、カードの実際の磁気ストリップに書き込みと読み取りを行う際のすべての動作に近づきました。



最初のもの。 録音するとき、磁気ストリップの近くにフィールドを作成するヘッドは、実際にその隣ではなくその中にフィールドを作成します。 これを理解するには、単純なルールを覚えておく必要があります。電流が最も抵抗の少ない経路に沿って流れるということです。 今、馬蹄形を想像してください、そう、馬からの普通の馬蹄形。 切れ目があり、ストリップに垂直なギャップで馬蹄形を傾けます。 これは、そのような録音の最新のヘッドです。つまり、ポイント全体がギャップにあり、ギャップはほとんど磁気ストリップに接触しています。



馬蹄をワイヤーで包み、電流を流し、馬蹄は電磁石になり、磁場は馬蹄に沿って流れ、馬蹄が破裂した場所で強い抵抗に会います-空気または特別にそこに付着した絶縁体。



磁場にやるべきことは何ですか? 磁気ストリップ自体に沿って、最も抵抗の少ない経路を辿ってください! ストリップに飛び込んで、それを閉じます。 私たちに有利なのは何ですか。



そのようなストリップ上の離散的な表現方法(以下、デジタル情報を考慮する)は、理論的に大きく異なる可能性があります。 デザイナーの代わりに自分を置き、書き込みと読み取りのプロセスをシミュレートすることができます。 さらに、私たちの手には次の切り札があります。



-情報は固定長のセクションに記録する必要があります。

-2種類のセクションをストリップに記録できます。つまり、磁場の力線の異なる方向で記録できます(ただし、磁気誘導ベクトルと他の量のヒープ。ただし、これらについては気にしません)。 簡単にするために、SNおよびNSとして示します。

-SNおよびNSセクションのタイプはストリップに書き込むことができますが、それらのいずれも異なる磁化の度合いを持つことができます。つまり、たとえば、右側に0〜9の数字を割り当てることに同意して、セクションのいずれかの磁化の度合いのグラデーションを示すことができます増加する磁化の程度を表現します。

-磁気ストリップの近くを通過するヘッドの磁束の変化に応じて読み取りが可能です。 変化する磁束がコアを通過し(馬蹄自体は同じです)、その結果、コアにある巻線の端子に変化する電圧が現れます。



したがって、磁束が変化したときにのみ変化します。 そして、次の3つの場合に変更できます。



a)磁場の線の方向の変化。 つまり、セクションは次の順序で進む必要があります。

(SN)(NS)(SN)。 その結果、大まかに言えば、脈流の2倍の電流が得られます。

b)磁場の強度の変化。 たとえば、このような一連のセクションは、頭部の電流の出現/変化を引き起こすはずです-(SN1)(SN2)(SN9)(SN3)(頭部の電流の振幅の3つの変化)が、これはもはやありません-(SN5)(SN5) (SN5)(SN5)(SN5);

c)aとbの組み合わせ(SN5)(NS5)(NS6)。



問題はないと思われるので、それを取り、任意のオプションを使用して個別のセクションのゼロを表します。 はい、録音はすべて簡単です。 読むときに問題が発生します。 スティックをホイールに入れる主な要因の1つは、読み取り速度、つまり、ヘッドの下のテープの速度です。 カードを手動でドラッグするための人工のデバイスは、手がカードを通過する追加のトリックなしで速度を正確に認識できません(これは可能ですが、追加の磁気時計または他のラインを作成する必要があります)。 ATMでは、よりシンプルで正確なものを実現できます。



それで問題は何ですか? まあ、異なる速度とFIGSは彼女と一緒になります。



そして、単純なメンバーデバイスであるため、次のシーケンスを逆アセンブルします。

(SN)(NS)(NS)(SN)(NS)? (シーケンス1)

(1)(2)(3)(4)(5)



このシーケンスについて何が言えますか? 頭部の電界の極性の変化を正確に3回(セクション1と2、3と4、4と5の間)引き起こすもののみ。



磁場セクションの極性を変更することで頭に浮かぶ最初のコーディングバリアント0と1を考えた場合、SNが1、NSが0であり、+方向に電圧ジャンプを受けたと自信を持って言えます。 1から0。したがって、2つのセクションが認識されます。 しかし、さらに2と3が近くにある場合-(NS)(NS)変化はありませんが、この場所では、以前の電圧サージによって認識された最後のものは0であることが知られています! ただし、このセクションで2つ以上の異なる速度でゼロが正確にいくつあるかを証明してください。 つまり、シーケンス1は正確にシーケンス1であり、たとえばこれではありません。

(SN)(NS)(NS)(NS)(NS)(SN)(NS)? (シーケンス2)

(1)(2)(3)(エラー)(エラー)(4)(5)



3と4の間では、すべてがまったく同じです(電圧サージは横向きです)。3は0、4は1と言えます。同期ラインから周波数コーディングまで、この状況から抜け出す方法はたくさんあります。 これは磁気カードの主なものです-これは周波数F \ 2Fの2倍です。



(NS)(SN)(NS)(NS)(SN)(SN)(NS)(SN)(NS)(SN)

(1)(0)(0)(1)(1)



その意味は明らかです。 コーディング1には、電圧サージを解釈するという事実が使用されます。1つの要素をエンコードするためにセクションの極性の変化の頻度が2倍になります。 よく見ると、このようなエンコードは特定の条件下で上記のエンコードの欠点を完全に排除していることがわかります。



(NS)(NS)でマップを停止するとします。 デバイスが間違ってゼロの数を間違って数えると考えるかもしれません。つまり、(NS)(NS)(NS)(NS)が00になります。実際、これは起こりません。エンコード時に、次のセクショングループへの切り替え条件が極性の変化であるためです、それは起こらず、デバイスは単に0を設定し、極性が変わるのを待って(少なくとも広告を無限に待ちます)、カウンタージェネレーターを再起動してセクションの次のグループを認識します。 デバイスが極性の変化の発生頻度をどのように決定するかという問題は、もちろん興味深いですが、今は必要ありません。



100回読むよりも1回見る方が良い。 磁気カードトラックの内容を見て、自宅でそれらに書かれている内容を明確に理解できるかどうかを確認しましょう。 途中で、軌道の状態を視覚的に評価するためのツールを受け取りました。



おがくずが紙のシートに振りかけられ、その下に磁石があり、力の線に沿って並んでいます。 しかし、マップパスの磁化されたセクションに固執し、それらを裏切ることで裏切る必要があります。



通常のおがくずや金属粉塵は機能せず、粒子が大きすぎます。 プリンターカートリッジにトナー粒子を使用することが提案されています。 それらは非常に注意深く処理され、均質であり、それらのいくつかは磁性顔料を取り入れています。



画像



アイデアの元のソースでは、トナーと澱粉の混合物を使用することが提案されていますが、これは明らかに、トナーまたは特殊なスプレーを使用してカードの状態を評価するというアイデアがずっと前に登場し、トナーが特定のものであったという理由によるものです。 したがって、たとえば、1999年以降はフランスと同等であってはなりません。 現代の店に行き、磁性顔料(図に示すように)、できればカラーのトナーを購入します。



カードを振りかけ、テーブルの上でノックして余分なトナーを振り落とすと、この新たに発見された世界を自由に使うことができます。 ストリップでは、カードが受け取ったエリアのすべての欠陥をすぐに見ることができます。 いくつかの国内のケースでは、これが役に立つかもしれません。



続けなければなりません。 全体の関心は、カメラ、虫眼鏡、またはもちろん顕微鏡のみでカードの内容を読み取ることにあります。 さらに明らかなように、カメラは3番目から2番目のトラックを分析するのに十分です。 写真は、一般的なデジタルカメラとデジタル顕微鏡の写真です。



画像



トラック番号2(ABA)全体。



画像



ペイントプログラムでプロットされたランドマークを含むトラック番号2(ABA)全体。





そして同じトラック、もう少し大きい:







もちろん、便宜上、顕微鏡の画像を使用します。



だから、分析。 しかし、最初に標準に目を向ける必要があります。



ISO 7810 Credit.Cardサイズ文書の物理的特性

ISO 7811-1エンボス加工

ISO 7811-2磁気ストライプ-低保磁力

ISO 7811-3エンボス文字の場所

ISO 7811-4トラック1および2の場所

ISO 7811-5トラック3の場所

ISO 7811-6磁気ストライプ-高保磁力

ISO 7813金融取引カード



次に、ドキュメントの右側で、上から下を見てください。

-マップの描画とその寸法は3.375×2.125インチ、1インチ= 2.54 cmで、85 * 54 mmです。 調査したマップのサイズと一致します。

-「Magnetic Stripe Encoding-Financial Transaction Cards」行は、マップの端からの距離をインチ単位で示し、トラック(トラック)の特性を一種のテーブル形式で示します。 合計3つのトラックがあり、それぞれに独自の名前があります。



トラック1 IATA

トラック2 ABA

TRACK 3 THRIFT



各トラックの密度記録密度(ビット/インチ)。

文字構成(パリティビットを含む)「デバイスキャラクター」、実際には、パリティビットと情報の内容(制御文字を含む)の文字の内容を考慮した、1バイトあたりのビット数。 最初のトラックには数字と文字の両方が含まれ、2番目と3番目のトラックには数字のみ(40デジタル文字)が含まれていることがわかります。

下と左は、トラック形式のデコードです。



理論的には、2番目のABAトラックには1インチあたり75ビット以下を含める必要があります。 つまり、トラック全体で3.375(カードの長さ)* 75(1インチあたりの容量)= 253.125ビット= 253ビット以下です。 バイトのサイズは5ビットで、エンコードは数字のみで、253/5 = 50文字ですが、標準では40文字あります。余分なものは、トラックの最初の同期シーケンス-ゼロです。



5ビットエンコーディングについては、以下のリンクで説明しています。



--Data Bits-- Parity b1 b2 b3 b4 b5 Character Function 0 0 0 0 1 0 (0H) Data 1 0 0 0 0 1 (1H) " 0 1 0 0 0 2 (2H) " 1 1 0 0 1 3 (3H) " 0 0 1 0 0 4 (4H) " 1 0 1 0 1 5 (5H) " 0 1 1 0 1 6 (6H) " 1 1 1 0 0 7 (7H) " 0 0 0 1 0 8 (8H) " 1 0 0 1 1 9 (9H) " 0 1 0 1 1 : (AH) Control 1 1 0 1 0 ; (BH) Start Sentinel 0 0 1 1 1 < (CH) Control 1 0 1 1 0 = (DH) Field Separator 0 1 1 1 0 > (EH) Control 1 1 1 1 1 ? (FH) End Sentinel
      
      





さて、開始するには、開始する必要があります。 デコードテーブルを使用して、デコード用のプログラムを作成します。 もちろん、視覚化中に取得したダンプも必要です(もちろん、個人データを非表示にするために少し変更されていますが、ちなみにそこに猫が泣きました)。



000000000000000000000000000000000000000110111111100000000000010000000000010101010101010110000001000010000010101010101010001101001001001000110101010101010110010000000101010101010101011001000001000101010101010101010101010001000001



さて、プログラム自体:



  .686 ; create 32 bit code .model flat, stdcall ; 32 bit memory model option casemap :none ; case sensitive include \masm32\include\windows.inc include \masm32\include\masm32.inc include \masm32\include\gdi32.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\shell32.inc includelib \masm32\lib\masm32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib .data? .data Handle_File_Input dd 0 Handle_File_Result dd 0 InputFile db "Content_track_2.txt", 0 ResultFile db "Result.txt", 0 flStr OFSTRUCT <> NBW dd ? , 0 NBR dd ?, 0 title_box db "[ABA] track-decoder", 0 ms1 db "  :    [Start_Sentinel]       ,   .  -   ?", 0 ms2 db " -  ", 0 ms3 db "     Content_track_2.txt", 0 ms4 db " ,    Result.txt.  ,            .", 0 bet db 254 dup (030h) en db 0ffh Start_Sentinel db "1010", 0ffh ;  ;bet db "00000000000000000000000000000000000000011011111110000100001000010000101010100010101100001000010000101011010100001000010001000001010001000001000100000" ;bey db "110100111001001010110101010001011001000001001011011001101011010100100000100001010101010110000000000000000" result db 60 DUP(0) val_0 db '.' ;00000 val_1 db 030h ;00001 -  val_2 db 038h ;00010 -  val_3 db '?' ;00011 val_4 db 034h ;00100 -  val_5 db '?' ;00101. val_6 db '?' ;00110 val_7 db '?' ;00111 val_8 db 032h ;01000 -  val_9 db '?' ;01001 val_10 db '?' ;01010 val_11 db '?' ;01011 val_12 db '?' ;01100 val_13 db 036h ;01101 -  val_14 db '?' ;01110 val_15 db '?' ;01111 val_16 db 031h ;10000 -  val_17 db '?' ;10001 val_18 db '?' ;10010 val_19 db 039h ;10011 -  val_20 db '?' ;10100 val_21 db 035h ;10101 -  val_22 db 'M' ;10110 -  val_23 db '?' ;10111 val_24 db '?' ;11000 val_25 db 033h ;11001 -  val_26 db 'S' ;11010 -  val_27 db '?' ;11011 val_28 db 037h ;11100 -  val_29 db '?' ;11101 val_30 db '?' ;11110 val_31 db 'E' ;11111 -  .code start: begin: push OF_READWRITE push offset flStr push offset InputFile call OpenFile cmp eax, 0ffffffffh ;     jz ext ;       mov dword ptr [Handle_File_Input], eax push FILE_BEGIN push NULL push 0 push eax call SetFilePointer ;     push 0 push Handle_File_Input call GetFileSize mov ebx, 254 cmp eax, ebx ;  .     cmova eax, ebx ;   254  push NULL push offset NBW push eax push offset bet push Handle_File_Input call ReadFile ;  lea esi, [en-1] ;   lea edi, bet ;   reverse: cmp esi, edi jbe end_reverse mov al, byte ptr [esi] mov ah, byte ptr [edi] mov byte ptr [edi], al mov byte ptr [esi], ah dec esi inc edi jmp reverse end_reverse: ;------  Start_Sentinel------------------------------------------- mov edi, offset bet mov al, 030h mov ecx, 0ffh repz scasb ;     "1" mov edx, edi xor edx, offset [Start_Sentinel+1] ;            jnz continue_1 push 0 push offset title_box push offset ms2 ;  push 0 call MessageBoxA jmp ext continue_1: ;--            (  ) SS ;--      ,     -   SS (  ) ;--     SS    -          xor edx, offset [Start_Sentinel+1] ; edx  mov eax, edi mov ebx, offset Start_Sentinel search_SS: mov esi, eax inc eax mov ecx, -1 mov edi, ebx repz cmpsb ;     ecx   cmp cx, -6 loopnz search_SS dec eax ;   eax     sub eax, edx jz continue_2 ;     SS push 4 push offset title_box push offset ms1 push 0 call MessageBoxA ;     ;[ms+191] cmp eax, 1 jnz ext continue_2: mov byte ptr [result], 'S' ; dec esi ;    SS mov ecx, 5 mov eax, offset [en-1] sub eax, esi xor edx, edx div ecx mov ecx, eax ;   5 mov edi, offset [result+1] mov ebx, offset val_0 pars: lodsd mov edx, eax lodsb sub al, 30h sub edx, 030303030h shl dl, 4 xor al, dl shl dh, 3 xor al, dh bswap edx shl dl, 1 xor al, dl shl dh, 2 xor al, dh xlat stosb loop pars push OF_READWRITE push offset flStr <habracut /> push offset ResultFile call OpenFile mov dword ptr [Handle_File_Result], eax push FILE_BEGIN push NULL push 0 push eax call SetFilePointer ;     push NULL push offset NBW push 60 push offset result push dword ptr [Handle_File_Result] call WriteFile ext: push Handle_File_Input call CloseHandle push Handle_File_Result call CloseHandle push 4 push offset title_box push offset ms4 push 0 call MessageBoxA ;     cmp eax, 6 jz begin exit: push 0 call ExitProcess end start
      
      





そして最後に、結果自体:



S5224559648685547M08081211550005850000EM ...



疑わしいことに、地図に刻まれた数字や文字に似ています。



次のトラックはすでに暗号化されていますが、それはまた別の時間です。



便利なリンク



en.wikipedia.org/wiki/Hysteresis

www.dataip.co.uk/Reference/MagneticCardBCD.php

stripesnoop.sourceforge.net/devel/layoutstd.pdf

PatrickGöllの本-磁気カードとPC。



All Articles