How To Guides Files Links Toplists Forums


Please Vote for US!



Enter TopHackerz TOP Info Sites list and Vote for this site !!!

Enter to .com - The Top 100 Dss Info and Dealer Sites and Vote for this Site

Enter to TopSatSites and Vote for this Site!!!






Vote Now!

Enter to Sat-100.com and Vote for this Site!!!

Please Vote for US!




Syndrome Nagra2 cards, AVR-X Nagra2 cards



Write your own 3m


i for 1 am fed up with all the currect hashing and have noticed that the only way to stay ahead in this hobby is to learn how to write your own 3m's. so lets get to learning. i have put some cut and pastes together to help us all get started. the first cut and paste is for the H card. it's kind of easy and once we learn a little about the H 3m, the HU should be a little easier. remember, these are not mine but only cut and paste and i'm learning just like everyone else.
FOR H CARD............
>Writing a "Private 3M Script"
First it is important to define the term "3M." The term "3M" simply refers to a script's ability to unlock all of the channels, based on the saying "All for one, and One for all!" from the "3 Musketeers," (which came from the old days of hacking cable boxes where all channels were viewable through one channel).

Anyway, "3M" now is just a generic term for a card that has all channels open and no stealth or write protection.

In stealth scripts, the "3M" code refers to the actual part of the code that enables the video.

All scripts that open all of the channels are 3M's, however most people are referring to scripts that auto-update on their own, when they refer to a 3M.

The card auto-updates because it has no commands blocked, and it appears to be a normal subbed card, as much as possible.

The EASIEST type of 3M to write is to modify a valid bin file, by editing it in BasicH.

Before you can write a script to modify the card, you need to be able to edit a bin file manually to make those changes.

If you read through this page carefully you will find everything you need to know to modify a valid bin file with unique jump points and a 3M code.

After you are done editing your valid bin file you will have a private 3M that auto-updates, with private jump points. To remove simply do a 1-STEP clean in BasicH or BasicU.

If you follow the directions you should have a fairly safe 3M to use. If you have a private 3M (that does not have code in any regions that have been changed ago updates) your card would still be running today no matter HOW long they've been you installed it.

They can only send a "killer" ECM that will loop your cards if they have 8 known bytes in a row that they can hash. In order to ZAP your card with an ECM your card needs to be detected as being "hacked."

In order to do this they need to know you card's "signature," and your signature is based on the "extra" data that is on your card: the jump points and 3M code.

If they don't know your jump points or how exactly you broke up your 3M code then it is not possible for them to target you since they won't know the "signature" of your card.

The advantage of picking your own jump point is that your card's signature is different from most people's cards.

They are mainly interested in hashing the most public areas to hash. If you pick the INS54 area then you can bet that a many other people have also figured out what you have.

You should really try to find a jump point outside of the INS 54 area. All were after here is to make your card's signature just enough different than the freeware script users.

Anything you can change will help. If you clone your card then you have 2 known bytes that will be different from your CAM ID, and those bytes are a checksum for the CAM ID.

It MAY be possible that they can check those two bytes against the CAM ID to see if your card is cloned, but they haven't demonstrated that ability yet.

Remember- nothing is foolproof- If your card is in the data stream taking updates, you risk an update possibly writing over part of the 3M software and corrupting your card. Nobody ever knows where the update will occur on the card.

Understanding How Cards Work
The signal is based on packets of data which are sent along with all the video data to every receiver out there.

Some of this data is filtered out before it is passed on to the smart card, such as individual unit authorizations.

Of all the millions of these, only the ones for your smart card are passed on to your smart card.

This is so the smart card does not get totally overloaded with messages for everyone else.

Most of the other data packets DO get to your smart card.

When the signal passes through a card the following routine happens:


Normal Code Cycle
The DSS signal "passes thru" the card and does certain events that are important to the function of the card.

"INS 54" Determines Authorization
The INS 54" is the location of code on the card that determines whether or not you are authorized to view a channel, and is responsible for returning a proper value to any authorization requests.

Normal Code Cycle
The signal comes back from the the "INS 54" area and either authorizes or turns off the signal, based on what value was returned.

When the signal passes through a card that has 3M code on it the following routine happens:


Normal Code Cycles
The DSS signal "passes thru" the card and does certain events that are important to the function of the card.

Jump to Fake Authorization or "3m code"
The card "jumps" from the "INS 54" area to an address you have specified that has your 3M code.

The 3M code "tricks" the card in to thinking that the authorization is present by giving it a ZNT of it's own, and then returning the proper answer, which allows all of the channels to be unlocked (this is the JUMP POINT).

Jump back from the "3M code"
The 3M code jumps back to the address you have specified at the end of the "INS 54" area: 8D2D

End of part 1

Normal Code Cycles
The signal authorizes the signal for all channels based on what was returned from the Fake ZNT or "3M code."

The area of the card that is checked to see if the channel has authorization is called "INS 54." That area in the card's EEPROM is 827B-8D2D.

That's why most, but not all, jump points are placed with in that area. Whenever you change the channel the card checks the "INS 54" area of the card to check and see if that channel is authorized.

When the "check command" reaches your JUMP POINT it jumps out of "INS 54" directly to wherever your 3M code starts.

The signal then bounces around to your selected "jump to" addresses and reads the 3m code (which fools it into thinking that the channel is authorized).

The signal then jumps back to the last byte of INS 54 which is 8D2D where it continues it's normal cycle. During in all of this the card actually thinks it was always in the "INS 54" area of the card, even though it jumped out and back again.

The instruction that is CRITICAL to learn about for writing 3M's is "INS 54". You should trace its path as far as possible in both directions so you can try to understand it completely.

Not all jump points have to be within the INS54 handling routine from 8D03-8D2F (or 8D65) But, it is the INS54 that's the instruction sent when you change channels that returns authorization, so you'll probably want to intercept that instruction somewhere.

Understanding Address Locations
To gain a better understanding of address locations open BasicH and load a .bin file. Clean to USW 26 and look at the BasicH output screen:

Report this post to a moderator | IP: Logged

01-09-2002 01:48 AM



alyn
Old Timer

Registered: Feb 2001
Location:
Posts: 275


Addr: 0 1 2 3 4 5 6 7 8 9 A B C D E F | ASCII

8030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
8040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
8050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 XX 00 | ................
8030 is the address location of the 1st byte of data which is represented in hexadecimal format.

As an example to help you better understand the addresses the address location of the byte represented by XX is 805E.

You will not need to modify your 3M like the above example- it is for learning purposes only.

The datastream passes through your card and goes through it's normal code cycle at 8D17, then it hits 8D1A.

8D1A is the ZNT (Zero Number Test) which is used in authorization of the channels. You simply want to alter the code so that we can send the signal to the 3M code.

Look at theEEPROM MAP and HCDT-Disassembly and study it carefully.

LJMP and LCALL
ljmp "Jump-To" byte: 02

The ljmp Jump-to byte is represented by the hexadecimal byte 02. When the signal encounters a 02, it will immediately look at the next 2 bytes in sequence.

This will be the address location that the signal will go to.

To help you understand the "ljmp" command look at the following example:

Addr: 0 1 2 3 4 5 6 7 8 9 A B C D E F | ASCII

8060: 00 00 00 00 00 00 00 02 80 8A 00 00 00 00 00 00 | ................
8070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
8080: 00 00 00 00 00 00 00 00 00 00 99 00 00 00 00 00 | ................
Notice that starting at address 8067 you encounter a 02 byte.

This tells the signal to look at the next two bytes (The next 2 bytes = 80 8A). The signal will then skip to (jump to) the 808A address and encounter the 99.

The above is only an EXAMPLE of how to spot the "02" and what it means, and how it works. You will not need to modify your 3M like the above example- it is for learning purposes only.

The format for the ljmp instruction is:
02 XX XX (The x's are a 2 byte address).

With the ljmp instruction you can jump to the ppv area, and then jump back to any address, however the code is a little longer than when using lcall.

Here is a jump code (to address 8032):
8D1B: 02 80 32 <-- ljmp to address 8032

Here is the 3m code at address 8032 and the jump back to 8D1B:
8032: E4 <-- 3M code
8033: F5 45 <-- 3M code
8035: 75 27 03 <-- 3M code
8038: 02 8D 1B <-- ljmp back to address 8DIB

Let me give another example. Here is what the code might look like before we alter it:
8332: 08
8333: E2
8334: 79 18
8336: 47

Now let us say we want to jump to our 3M code from address 8333 using ljmp. We will pretend our 3M code will go at address 8333.

Here is our new code with the ljmp:
8332: 08
8333: 02 80 31 <-- ljmp to 8032 at address 8031
8336: 47

Since you are skipping the instructions at 8333 by putting the ljmp code there, and then skipping back to 8336, you are missing any instructions on 8333 as well as bypassing 8334.

You must add those instructions (E2 79 18) to the beginning of our 3M code before you jump back to 8336.You must be careful when writing your jump code over original code, and also to be careful when jumping back so that you do not skip execution of any important code.

Here is our 3M code for the ljmp beginning at address 8031:
8031: E2 <-- the instruction from 8333
8032: 79 18 <-- the instruction from 8334
8034: E4 <-- 3M code
8035: F5 45 <-- 3M code
8037: 75 27 03 <-- 3M code
803A: 02 83 36 <-- ljmp back to address 8336

lcall
The format for the lcall instruction is: 12 XX XX (the x's are a 2 byte address)

When you use lcall to jump to your 3M, the address immediately following the jump is pushed onto a stack, and you can return to that address simply by using the 1 byte instruction: 22 (return). This means you do not have a choice of where to return to, but you can do so in 1 byte.

By using lcall instead of ljmp our 3M footprint is 2 bytes smaller. A smaller footprint makes a more difficult target. However, there is no choice of a return location, making it more difficult to randomize the jump signature.

Here is the beginning EXAMPLE unmodified code:
8332: 08
8333: E2
8334: 79 18
8336: 47

We will change the address at 8333 and use lcall to branch to our 3M CODE we will add at address 8032:
8332: 08
8333: 12 80 32 <-- lcall to 8032
8336: 47

Since you are skipping the instructions at 8333 by putting the lcall code there, and then skipping back to 8336, you are missing any instructions on 8333 as well as bypassing 8334.

You must add those instructions (E2 79 18) to the beginning of your 3M code before you jump back to 8336.

You must be careful when writing your jump code over original code, and also to be careful when jumping back so that you do not skip execution of any important code.


Here is our 3M code for the lcall beginning at address 8032:
8032: E2 <-- (the instruction from 8333)
8033: 79 18 <-- (the instruction from 8334)
8035: E4 <-- 3M code
8036: F5 45 <-- 3M code
8038: 75 27 03 <-- 3M code
803B: 22 <-- RETURN command (we do not specify a return address because instruction 22 will automatically take us to the address immediately following the lcall at address 8336)

NOTE: DO NOT USE THE ABOVE EXAMPLES, THESE EXAMPLES CONTAIN 3M CODE THAT IS TOO LONG, AND WILL CAUSE YOU TO GET HASHED, IT IS JUST TO HELP YOU UNDERSTAND THE CONCEPTS INVOLVED WITH LCALL AND LJMP.

Jump Points
The "jump point" is a command in the program that reroutes the program operation to the PPV (or tier) area to execute the 3m routine and turn on the video and audio for our selected channel.

Hiding our 3m routine within either the PPV or tier area is not the real problem. What you need to do is look for a routine ALWAYS gets executed when you change channels, and then locate that address to find a point where we can jump from (and back to following our 3M code).

It also has to be an address that you can overwrite without disturbing the normal card cycle.

Jump points are determined by analyzing the disassembled code that is on the card and carefully choosing a point at which to intercept program flow while at the same time keeping both security from attack and integrity of the card's routine in mind.

Remember to always have a picture of the EPROM table in your head and plan on where your sections will be located. Count the bytes you need to write and make sure you can fit them in your area.

It is also a good idea to take notes on what your starting addresses will be and what are the bytes you will be overwriting with your jump points.

You have to be very careful when choosing your jump points. You'll want your jump to come back just after your orginial jump point so it does not encounter that jump again in the cycle and cause a loop.

End of part 2

If you do not have an unlooper I would not try to many things as you will have to send your card out to a cleaner or buy an unlooper and fix your card.

If you place the jump point after the return jump point at 8d2d then you will have a continuous loop, in other words a "looped" card.

A jump point is not just any random number- it's an EEPROM address within the card where you can place a jump command, or similar instruction, to intercept the normal program flow, redirect it to your routine that forces channel authorization (known as a 3M routine) and then jump back to a point somewhere after your jump point (again, it is not just another random address).

You have to know where to jump from, it cannot be any random address. The only way to do this is to know how the program on the card operates.

If you point to an area of the card which has fixed values in every legitimate card, then every legitimate card will generate the same new 10 keys which ultimately become the correct keys used to get the video.

Until you learn more about how the card operates then you can use any of the known jump points.

Jump points can be tricky to pick. You must have at least SOME knowledge of what those bytes mean and how many of them go together to do something.

If you break up the 3M code correctly the most that they can do is hashing.

Report this post to a moderator | IP: Logged

01-09-2002 01:52 AM



alyn
Old Timer

Registered: Feb 2001
Location:
Posts: 275


When choosing a PRIVATE jump point it would be best to avoid one of these jump points for your private 3M, since they are known and used by freeware, and have been targets of hashing:


8250-8257
8260-8267
8278-827F
8560-8567
8590-8597
8658-865F
8688-868F
8690-8697
8860-8867
8980-8987
89A0-89A7
89B0-89B7
89B8-89BF
8CF8-8CFF
8D00-8D07
8D08-8D0F
8D18-8D1F
8D60-8D67
8F28-8F2F
99A0-99A7 (wrap around address for 89A0 to 89A7)
9D00-9D07 (8D00-8D07)
Update 0001h/1 (8568h-856Bh)
Update 0002h/2 (8FF1h-8FF4h)
Update 0003h/3 (8FF5h-8FF8h)
Update 0004h/4 (8FF9h-8FFCh)
Update 0005h/5 (84F8h-84FBh)
Update 0006h/6 (8588h-858Bh)
Update 0007h/7 (8670h-8673h)
Update 0008h/8 (8460h-8465h)
Update 0009h/9 (8605h-860Ah)
Update 000Ah/10 (8F3Bh-8F46h)
Update 000Bh/11 (8F2Fh-8F3Ah)
Update 000Ch/12 (8F47h-8F52h)
Update 000Dh/13 (8F53h-8F5Eh)
Update 000Eh/14 (8F5Fh-8F5Fh)
Update 000Fh/15 (8965h-8966h)
Update 0010h/16 (8BA5h-8BAAh)
Update 0011h/17 (8F60h-8F68h)
Update 0012h/18 (865Ch-8660h)
Update 0013h/19 (8297h-8297h)
Update 0014h/20 (8F44h-8F44h)
Update 0015h/21 (858Bh-8592h)
Update 0016h/22 (8F70h-8F78h)
Update 0017h/23 (8C05h-8C06h)
Update 0018h/24 (8F79h-8F7Fh)
Update 0019h/25 (85D0h-85D1h)
Update 001Ah/26 (8591h-8594h)
Update 001Bh/27 (8F80h-8F86h)
Update 001Ch/28 (85D0h-85D7h)
Update 001Dh/29 (85CAh-85CBh)
Update 001Eh/30 (8660h-8667h)
Update 001Fh/31 (85D0h-85D7h)
Update 0020h/32 (8658h-865Fh) same as 18
Update 0021h/33 (8687h-8692h)
Update 0022h/34 (8702h-870Dh)
Update 0023h/35 (8693h-869Eh)
Update 0024h/36 (86F6h-8701h)
Update 0025h/37 (8762h-876Dh)
Update 0026h/38 (8732h-873Dh)
Update 0027h/39 (870Eh-8719h)
Update 0028h/40 (869Fh-86AAh)
Update 0029h/41 (86B7h-86C2h)
Update 002Ah/42 (86CFh-86D9h)
Update 002Bh/43 (8867h-8872h)
Update 002Ch/44 (874Ah-8755h)
Update 002Dh/45 (885Bh-8866h)
Update 002Eh/46 (86ABh-86B6h)
Update 002Fh/47 (871Ah-8725h)
Update 0030h/48 (85CFh-85D3h)
Update 0031h/49 (8756h-8761h)
Update 0032h/50 (86C3h-86CFh)
Update 0033h/51 (873Eh-8749h)
Update 0034h/52 (8709h-8710h)
Update 0035h/53 (888Bh-8896h)
The hard part is figure out what address you can use and have the card still work.

You need to figure out what "jump point" addresses have been used by freeware scripts because you want to stay away from those.

Get as many scripts as you can find and make a list of the jump point so you will know which ones to stay away from.

Also you will want to know what addresses are SAFE to use because you don't want to "loop" your card.

Get a card's EEPROM image file open it up in a text editor (like NotePad). Disassemble it and trace the instruction 54 (which starts at 827B). Look at the HCDT-Disassembly and try to figure out what all of these jump points have in common, and soon you will discover private jump points of your own.

To find a new jump point first find an instruction group in the
original H card programming which is executed frequently (INS54 is a good example).

Next, find a set of individual code instructions that is EXACTLY 6 bytes long when complete (such as: three 2 byte instructions, OR 2 three byte instructions, OR one 3 byte instruction and three one byte instructions, etc).

You may then replace the code with your 6 bytes (3 byte jump instruction and 3 random bytes).

Make sure the instructions you replace may be replicated in the 3M (no ajmp or acalls).

Then rewrite the 3M code and include the replaced instructions, and change the jump back in the 3M to the address 6 bytes after your replaced jump instruction.

Also notice: Only 8000-8FFF (User area) gets hashed (the 9000's that got hashed are are "wrap-around" addresses).

If one location can not be split to make a jump then carry out the necessary bytes with your 3M string.

A jump can always be inserted in between the code only to take it to a different location. Try to jump to a different location other then PPV (like 83XX or Old nano area).

Report this post to a moderator | IP: Logged

01-09-2002 01:57 AM



alyn
Old Timer

Registered: Feb 2001
Location:
Posts: 275


Learn to use other ways of intercepting such as Lcall (12 address 22 for ret) Sjump (80 XX for number of bytes to jump down). New ways to check for authorization, hash checking and normal writes can be created making some code obsolete.

You should always keep your code to a minimum exposure to public, and keep it only to yourself. Try to avoid using public jump
points and obvious bytes that shouldn't be on your card.

Avoid having empty areas that should have bytes on a normal card. USe your common sense and try to make your card appear
as much like a "normal" card as possible. REMEMBER- there are other areas to jump from aside INS 54, as evidenced on the list.

You can't always simply jump back to 8d2d, because doing so will skip over necessary code.

If you are jumping outside the ins54 area you USUALLY need to return to the command immediately following the point you jumped from, and you will also most likely need to cycle the overwritten code back in after you jump, before the 3M.

Akso- You can't use data areas as jump points because it never gets executed.

A jump point has to be part of the code that gets executed every time you change a channel, and the card seeks authorization.

"Pay Per View" Area The Pay Per View Area is the part of the card where information is written to record the authorization of PPV events and movies.

When you clean your card the PPV area gets wiped clean so no information is present. When the PPV area is cleaned the area is "zeroed-out" (represented by NULL or 00 values).

The PPV area starts at 8028 and ends at 80EF. Refer to the EEPROM MAP to find the PPV area).

We can easily use the PPV area of the card to store data such as 3M code. You can use any part of the PPV area that you want, but remember that "valid" PPV's are 8 bytes long, so you will need to add random bytes (any number from 00 to FF) before and/or after your 3M code in order to cloak it, as well as appear to be a valid PPV purchase.

The card expects that your PPV purchases will all start at either the "0" address or the "8" address. There are 25 PPV slots. Each PPV slot is 8 bytes long. The first PPV slot is "8028-802F," the second slot is "8030-8037," the third slot is "8038-803F," and so on.

It is a good idea to work out all of the "jump to's" on paper prior to editing your bin, so you can mark the jumps clearly, etc..

End of part 3
Here is a PPV area scratch pad for you to work from:

Addr: 0 1 2 3 4 5 6 7 8 9 A B C D E F | ASCII

8020: 00 00 00 00 00 00 00 00 | ................
8030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
8040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
8050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
8060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
8070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
8080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
8090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
80A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
80B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
80C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
80D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
80E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
PRINT OUT THE ABOVE WORKSHEET TO MAP OUT YOUR JUMP POINTS PRIOR TO EDITING YOUR BIN
REMEMBER

The PPV (and tier area) are not where you put your jump point.

These are the areas that the 3m activation routine is stored.
It is best not to have the jump to addresses overlap across the "07" and "08" address, UNLESS you fill in the entire line with additional random bytes to make it appear as 2 purchases.

You should also never start your 3M code on a 0 or an 8 in order to hide your code from the checking routine.

Make the 80x6 and 80xE addresses appear to be valid PPV purchases.

Here are a few examples of "valid" PPV purchases:

87 D9 69 D8 01 8F 01 00
8A C8 69 D8 01 8F 01 00
8B B6 69 D8 01 8F 01 00
81 1E 69 DA 01 8F 01 00
83 4C 69 D9 01 8F 01 00
81 DD 69 DA 01 8F 01 00
85 13 69 D8 01 8F 01 00
81 E9 69 DA 01 8F 01 00
81 52 69 DA 01 8F 01 00
81 9A 69 DA 01 8F 01 00
8E F3 69 D9 04 4B 01 00
81 12 69 DA 01 8F 01 00
83 E9 69 D8 01 8F 01 00
83 1D 69 DA 01 8F 01 00
82 89 69 DA 01 8F 01 00
82 7D 69 DA 01 8F 01 00
81 3B 69 DA 01 8F 01 00
81 6E 69 DA 01 8F 01 00
81 CB 69 D9 01 8F 01 01
91 07 69 D7 01 F3 01 01
8E CB 69 D7 03 1F 01 01
8E E9 69 D7 04 4B 01 01
8F 4B 69 D7 03 83 01 01
90 16 69 D7 03 83 01 01
80 FC 69 D9 07 CB 01 01
81 11 69 D9 01 8F 01 01
81 1D 69 D9 01 8F 01 01
81 2A 69 D9 01 8F 01 01
81 51 69 D9 01 8F 01 01
81 6D 69 D9 01 8F 01 01
81 82 69 D9 01 8F 01 01
81 E8 69 D9 01 8F 01 01
82 F2 69 D9 01 8F 01 01
83 41 69 D7 01 8F 01 01
85 03 69 D7 01 8F 01 01
88 A7 69 D7 01 8F 01 01
8C 8F 69 D7 01 8F 01 01
8D E1 69 D7 03 E7 01 01
8C 7A 69 D8 04 AB 09 01
82 88 69 D9 01 8F 00 01
85 9C 69 D7 01 8F 00 01
00 59 6B C1 22 C4 09 01
90 29 69 D8 03 83 01 00


You will note that the above PPV code has many addresses that are roughly the same, and once in awhile a few oddballs.

The most important ones to keep the same are the beginning (1 or 8 ppv address slots) and the end (7 or F address slots).

The best thing to do is get your own PPV examples to work from, so you can see the code for yourself.

Load an activation script on your card, and purchase a few PPV's and you will notice that they will follow the above patterns with few exceptions.

Some people have noticed that a while after they install the P3M on their card that one of the "random" bytes, or one of their 3M string changed to an 06.

If you clear the byte and put the card back in the IRD and check it again a few minutes later it is back to 06, 20 or 26.

This sometimes results in the 3M code failing to authorize the channel (call Ext. error) or even a fake Ext. 745 error.
The "PPV status byte" is changing. Changes to bytes at XX06h and XX0Eh in the PPV area only occur when certain bit patterns exist in those locations. Some bytes are fine, others are not.

Look at a valid PPV string to see what the card "needs" to see at certain addresses.

Storing anything in the PPV area without knowing exactly how it is affected by the card could be dangerous.

Some cards have been looped by having these bytes change.

Many other instructions can and have been changed, sometimes resulting in the 3M code failing to authorize the channel (call Ext. 721, 711, etc.) all the way to a fake Ext. 745 error being generated.

The BEST way to avoid this is to break up the 3M string and jump from chunk to chunk.

You'll have to know the instructions so as not to break apart an instruction and its parameters.

If you do this you may have to fix part of your 3M code if it supports locks/limits via a 20 4E xx type instruction.

Instruction 20 is JB (Jump if bit set) and has a relative address as a parameter that normally jumps XX bytes ahead if bit 4E is set.

If you move the bytes after that command around, it may be more bytes away and you'll need to correct this.

What is happening is the card is updating the status of what it thinks is a valid PPV entry.

The card has logic to set status bits to indicate what state the PPV is in. They are being updated by cmd18 which gets called from instruction 36 and command 29/49.

Instruction 36 is called to get card info, probably for delivery of info via phone line if connected.

Cmd 29/49 seems to be related to buying/viewing PPV.

It only affects the 80x6 and 80xE addresses of the PPV area.

The offending routine that writes the x6's looks like it's Cmd18/MatchFound/Ins46 at 165Bh in the ROM specifically with the four instructions at 1682h.

When it gets to this section of the routine, it sets bits 1 and 2 of the 7th byte of the PPV slot (80x6 and 80xE), but it would seem to avoid that area of the code completely if both bits 0 and 1 are already set (i.e. second digit = 3, 7, B, or F).

Now, depending on how it gets there, it may skip over it if only one or the other is set.

The PPV area is touchy, which is why most scripts restrict their code to the tier area, which is not affected by normal operations of the card.

Addresses in the PPV area that end in 06h or 0Eh could be modified (depending on exactly what the value in those locations is).

Your best bet is to be aware of the fact when constructing a 3M string in the PPV area, and either work around it (you could skip over the 06h/0Eh addresses by SJMP'ing over them) or only use the tier area.

If you decide to use the tier area, you aren't disabling processing of the deferred command buffer (i.e., a simple 3M that is stored in the tier area), then it is conceivable for it to be affected by a packet containing special Cmd41 or Cmd42 entries ("Add or update tier" or "Drop tier" commands). You can also prevent tier wipes by corrupting the global key Group Key 0.

3m Code
The 3m Code we will be using includes the following sequence of bytes: 75 27 03 20 4E 08 E4 F5 45 028D 2D

There are many combinations and variations you can use. If you don't use the locks & limits you can use the following 3M code:

E4 F5 45 75 27 03 028D 2D

If you DO want the locks & limits use this code:

20 4E 06 E4 F5 45 75 27 028D 2D

The byte 02 means "ljmp" or "JUMP TO," and the address that follows is "8D 2D," which means that our 3M code returns back to the 8D 2D address.

Until you become more advanced at writing 3M's you MUST jump from "8D 1A", and you MUST jump back to "8D 2D."

Report this post to a moderator | IP: Logged

01-09-2002 01:59 AM



alyn
Old Timer

Registered: Feb 2001
Location:
Posts: 275


The 3M code can be broken up into parts:

Part 1 : 75 27 03
Part 2: 20 4E 08
Part 3: E4
Part 4: F5 45 028D 2D

We do this because it makes it harder for your test card to be looped, hashed, or destroyed, since ECM's are hashed on a basis of 8 bytes, so we split our code to avoid this.

You can split up your 3M code as much as you want, jas long as the bytes are in order.

Writing the 3M code to your Card using "LCall" and jump points
Note: Do NOT use the addresses that we use in this example if you want to be private!

In other words, choose your own random points to jump to.

In the Basic H screen dump you will notice at 8D1A the bytes = 20 38 10. You need to change this value to include a jump to and the address you want to jump to. 20 38 10 will now be replaced with 02 XX XX (XX XX = The address location of your 3m code)
It is safest to use the PPV area to store your 3M code at first.

The PPV area is between addresses 8028 - 80EF.
Aside from 8D1A other known jump FROM points are: 8D11, and 8D20. Experiment a bit, and you can find your own spot to jump FROM to make your 3M TOTALLY private.

As mentioned earlier, you can break the 3m code up into parts, and jump around to addresses within different areas of the PPV area.

(NOTE: THE FOLLOWING IS AN EXAMPLE ONLY! DO NOT USE THIS EXAMPLE!! MAKE ONE OF YOUR OWN TO AVOID BEING TARGETED BY DTV!)

Start BasicH and insert your card in to your programmer. Read your EEPROM and save your bin file, and remove your card.

Load a VALID .bin file into BasicH and clean it to 26 updates by clicking on the AMBULANCE icon (clean EEPROM in memory), and selecting "clean to 26 updates".

End of part 4
Enable Edit mode in BasicH. NOTE: You are editing the bin file in memory, and not the card itself!

Be careful when editing the bin file to make sure you are editing the CORRECT addresses.

Replace the code at 8D1A with "0280 61" (jump to address 8061)
Addr: 0 1 2 3 4 5 6 7 8 9 A B C D E F | ASCII
8D10: 00 00 00 00 00 00 00 00 00 00 02 80 61 00 00 00 | ................
At address 8061 write "75 27 03 02 80 51" (First part of the 3M & jump to 8051)
Addr: 0 1 2 3 4 5 6 7 8 9 A B C D E F | ASCII
8060: 00 75 27 03 02 80 51 00 00 00 00 00 00 00 00 00 | ................
At address 8051 write "20 4E 08 02 80 49" (Second part of the 3M and jump to 8049)
Addr: 0 1 2 3 4 5 6 7 8 9 A B C D E F | ASCII
8050: 00 20 4E 08 02 80 49 00 00 00 00 00 00 00 00 00 | ................
At address 8049 write "E402 80 31" (Third part of the 3M and jump to 80D3)
Addr: 0 1 2 3 4 5 6 7 8 9 A B C D E F | ASCII
8040: 00 00 00 00 00 00 00 00 00 E4 02 80 31 00 00 00 | ................
At address 8031 write "F5 45 02 8D 2D" (fourth part of the 3M and jump back to 8D2D to continue the normal code cycle)
Addr: 0 1 2 3 4 5 6 7 8 9 A B C D E F | ASCII
8030: 00 F5 45 02 8D 2D 00 00 00 00 00 00 00 00 00 00 | ................
Now your edited bin should look something like this:
Addr: 0 1 2 3 4 5 6 7 8 9 A B C D E F | ASCII
8020: 00 00 00 00 00 00 00 00 | ................
8030: 00 F5 45 02 8D 2D 00 00 00 00 00 00 00 00 00 00 | ................
8040: 00 00 00 00 00 00 00 00 00 E4 02 80 31 00 00 00 | ................
8050: 00 20 4E 08 02 80 49 00 00 00 00 00 00 00 00 00 | ................
8060: 00 75 27 03 02 80 51 00 00 00 00 00 00 00 00 00 | ................
8070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
8080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
8090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
80A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
80B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
80C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
80D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
80E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
8D10: 00 00 00 00 00 00 00 00 00 00 02 80 61 00 00 00 | ................

(note: at line 8D10 in this example, do NOT change the other addresses to "0"'s, just change the address at 8D1A. Again- this is an EXAMPLE- design your own!).

NOTE: It is also a good idea to add random bytes (any hex number from 00 to FF) BEFORE and AFTER your 3M code to further "stealth" the code.

For example: the first part of our 3M code would look like:
XX 75 27 03 0280 A3 XX

The XX's represent random hexidecimal bytes (any hex number from 00 to FF), and the first set of random bytes would start one address earlier than our jump point, and the last set of random numbers would be at the address after our "jump back to" address (in the above example the "jump back to" address is "80A3").

For example: If our "jump to address was "8005," and we are adding ONE set of random bytes before the jump address then the random bytes would go at 8004."

PPV code is displayed as sets of 8 bytes, so remember to add only enough random code to bring the string to 8 bytes.

Remember, bytes are sets of 2 numbers, so 00 00 00 is 3 bytes.
let's say we want to put the 1st part of the code at 8061:

Addr: 0 1 2 3 4 5 6 7 8 9 A B C D E F | ASCII
8060: 00 75 27 03 02 80 51 00 00 00 00 00 00 00 00 00 |

We would want our string to be eight bytes long, and the 1st part of our 3M (with the jump command and address) is only 6 bytes long, so we add a random byte (any number from 00 to FF) BEFORE our 3M code at address 8061, and another random byte AFTER our 3M code, at 8066 and 8067.

At a glance it appears to be a "valid" PPV purchase which are 8 bytes long. KEEP IN MIND WHAT A "VALID" PPV PURCHASE LOOKS LIKE!

Here is what the 1st part of our 3M code a 8061, with RANDOM BYTES added will look like:


Addr: 0 1 2 3 4 5 6 7 8 9 A B C D E F | ASCII
8060: XX 75 27 03 02 80 51 XX 00 00 00 00 00 00 00 00 |

Now your edited bin WITH RANDOM BYTES should look something like this:
Addr: 0 1 2 3 4 5 6 7 8 9 A B C D E F | ASCII
8020: 00 00 00 00 00 00 00 00 | ................
8030: XX F5 45 02 8D 2D XX XX 00 00 00 00 00 00 00 00 | ................
8040: 00 00 00 00 00 00 00 00 XX E4 02 80 31 XX XX XX | ................
8050: XX 20 4E 08 02 80 49 XX 00 00 00 00 00 00 00 00 | ................
8060: XX 75 27 03 02 80 51 XX 00 00 00 00 00 00 00 00 | ................
8070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
8080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
8090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
80A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
80B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
80C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
80D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
80E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
8D10: 00 00 00 00 00 00 00 00 00 00 02 80 61 00 00 00 | ................

XX= random bytes

REMEMBER: Never start your 3M code on a 0 or an 8 address, and if it crosses the "border" between the two address be sure to fill in the bytes to make it look like a valid PPV purchase.

The best thing to do is to either use the above examples, or load an activation script on your card and "buy" some PPV's and look at the code in BasicH.

When constructing your own jump to areas in the PPV, keep in mind that it fills in slot one, then slot two, and so on until 25, so it is best to avoid large gaps like in the above example.

Also, if your 3M string ends on a 7 you may have problems. Also try to follow the pattern that the card expects to see in the PPV area, by referring to the above examples.

Again, the card expects that your PPV purchases will all start at either the "0" address or the "8" address.

End of part 5

There are 25 PPV slots. Each PPV slot is 8 bytes long, so it is best not to have the jump points overlap across the "07" and "08" address, unless you fill in the entire line with additional random bytes to make it appear as 2 purchases.

The first slot is "8028-802F," the second slot is "8030-8037," the third slot is "8038-803F," and so on.

Disable "Edit Mode" and save the edited bin with a different name. Clean your card with a One-Step clean with BasicH, twice to 26 updates, or until zero file differences.

Then write the modified bin to your card (NOTE: do not clean the bin after you have modified it or you will lose your jump point data in the PPV area- clean the bin BEFORE you modify it).

Next use WHISPER, which is a script that will activate your card, but it won't work unless you have a modified bin.

It is possible to edit your bin manually to include this data, however it is not necessary.

Reboot your IRD, insert your card and watch TV!

--------------------------------------------------------------------------------

Report this post to a moderator | IP: Logged

01-09-2002 02:00 AM



alyn
Old Timer

Registered: Feb 2001
Location:
Posts: 275


Understanding Packets (advanced):

The DTV system is based on packets of data which are sent along with all the video data to every receiver out there.

Some of this data is filtered out before it is passed on to the smart card, such as individual unit authorizations.

Of all the millions of these, only the ones for your smart card are passed on to your smart card.

This is so the smart card does not get totally overloaded with messages for everyone else. Most of the other data packets DO get to your smart card.

There are dozens of types of data packets, but only a few are of vital importance.

The first vital packet is the 4840 packet, which is what you get immediately after you tune to a new channel (and at regular periods afterwards too)

An example could look like this:

48 40 00 00 XX 40 09 10 10 00 01 4A 12 34 02 41 03 33 42 00 0C AA BB CC DD EE

Let's break this down: 48 40 00 00 XX

Here 48 40 describes the type of packet and the XX is the number of bytes to follow

40 is an echo of the packet type back to the receiver to show the smart card is working 09 10 10 00.

Here 09 is the command to set the key to be used in all subsequent decryption routines.

In this case, key 10 is pointed to, which is a generic key shared by all smart cards. The smart card uses an algorithm which generates 10 bytes every time it is called.

It uses the previous value for these 10 bytes and a new value found in the "A register" or accumulator.

Once the 09 command has been issued, almost every byte read in after that goes through this algorithm and so causes a new set of 10 bytes to be generated.

So the only time you can predict in advance what these 10 bytes are is just after the 09 command has been issued.

The algorithm is complex enough that trying to calculate the correct result would take years of processing even with a super-computer.

01 4A 12 34 Here 01 is the command to load the time and date, where 4A would be the month and 12 34 the digital hour, minute (not directly related to our 24 hour clock).

You should note following the above description of the 10 byte key process that reading in these 4 bytes causes a unique new set of 10 keys to be created after each of the 4 bytes is read in so any attempt to intercept and modify these dates causes the wrong 10 bytes to be created.

02 41 Here 02 is the command to load the program rating and the viewing status.

The 1st digit '4' means you need a subscription to watch, it would be '8' if it was a preview or free.

The 2nd digit is the parental rating. It should be repeated that any attempt to change the '41' (you need a subscription) to '81' (you can watch for free) will also generate the wrong 10 keys.

03 33 42 00 Here 03 is the command to check the subscription list in the smart card to see if the smart card is valid for channel 3342 at this time.

So here is where the smart card response starts to change depending on whether it does have a valid entry for channel 3342 or not.

Again, you can't intercept and change the data from the 3342 that the system demands you have to a different number that you know your smart card does have without creating the wrong 10 keys.

This 03 command can be repeated a number of times because any channel may have more than one channel identifier that it will accept. (This is to simplify selling packages of channels without needing a unique subscription for every single channel).

On a Pay-Per-View movie (PPV) the 03 command is replaced by an 06 command but the end result is the same.

0C AA BB CC DD EE Here 0C is the command to check the integrity of all the received data, everything that is after the initial 09 command was issued, right up to and including the final byte 'EE'.

As explained, every single byte read causes yet another call to the decryption algorithm to generate yet another new set of 10 keys.

The purpose of the 'AA BB CC DD EE' is that these 5 bytes are checked against the first 5 bytes of these newly created 10 keys and all 5 of them must match exactly.

If they do not, because of noise say, or because the data was intercepted and altered, then no match occurs and the process which generates the correct video keys will not execute.

You can't guess these 5 numbers as there are 256*256*256*256*256 possibilities (which is a lot).

That is the end of the 4840 packet. The smart card goes back to idle waiting for the next packet.

What it is has stored however, is a set of 10 keys and a status for whether it is allowed to watch this channel or not.

The receiver as yet does not know what this status is, so no video is being shown.

Almost immediately after this comes the next vital packet, 4854. This has a simpler format: 48 54 00 00 00 with nothing else to follow.

The smart card recognizes the 48 54 type and echoes the 54 back. Then it uses the status it created with the '4840 packet' to generate a further version of the 10 keys.

It crunches them through the on-die ASIC so that a pure software emulator can't be used.

Then it does a final software encryption and sends the resulting 10 keys over to the receiver, together with the status info.

What is vital is that the correct 10 keys are only sent if the accompanying status shows the smart card is valid for that channel at that time.

Otherwise, a different set of 10 keys will be sent, created earlier by the '484A packet', and these will NOT result in any video.

These 10 keys are then fed to the MPEG decoder to sort out the video which will be turned on if the sequence is correct.

(The audio is not encrypted, it will be turned on if the correct status is sent even if the wrong keys are sent)

You should have learned by now that;

These two packets are crucial.
If you change ANY byte between the 09 command in the 4840 packet and the last byte of the 4840 packet, you will generate the wrong 10 keys and get no video/audio.

You can add other commands in the 4840 packet than the simple 01 (time) 02 (rating) and 03 (subscription), as long as the correct final 5 bytes are calculated by the system to generate the required 10 keys correctly.

You can, for example, include a 60 command, followed by a sub command string B5.

60 B5 03 81 23 01 What this does is cause yet another new set of the 10 keys to be created 8 times, one for every value it finds in the EEROM at location 8123.

You can specify the number of 8 byte blocks to check (the example shows 01 for 1 block) and you can specify a list of addresses to check.

The actual address would not be 8123 but another address (or list of addresses) in the 8XXX area which corresponds to code altered by 'pirates'.

If you point to an area of EEROM (or ROM for that matter) which you know has fixed values in every legitimate card, then every legitimate card will generate the same new 10 keys which ultimately become the correct keys used to get the video.

If any 'pirate' cards have different code in that area, then they will generate different 10 keys and get no video.

They won't be damaged, they simply won't work! Because you can use a list to specify addresses to check, you can with a few short key strokes cover most of the so-called free space where any 3M type routines might be written.
.........................................................................................................

Report this post to a moderator | IP: Logged

01-09-2002 02:04 AM



alyn
Old Timer

Registered: Feb 2001
Location:
Posts: 275


>FOR HU CARD
>
Op codes or operational codes are used to tell the ird what to do they are the instructions on the card. We are not ready for the opcodes just yet - we must first define what a jump point is - where they are and how to use.

What are the RAM addresses? we need this too.

You see the card has RAM (2K or 2000 bytes). Each byte is one address.

The card has ROM (Read Only Memory) and within it has some addresses that are write only once. I need the amount of rom and the addresses.

The card has eeprom. eeprom is rewriteable memory - but it is only good for a specified number of writes (approx 500,000) this area is how large - well if the range is 2000 - 39ff - approx 6K.

The first few lines in your Hex (short for Hexadecimal) script will be the following:

Line 1 #Extreme Hex
Line 2 #C-PromptAreaInfo
Line 3 #C-OptionsOFF
Line 4 #C-CopyKey
Line 5 #C-CleanEEP
Line 6 #C-EndMsg=Merry Xmas
Line 7 #C-StartMsg=Happy New Year
Line 8 :0220140025DACB
Line 9 ::042460000000000078
Line 10 ::0424A4000000000034
Line 11 ::04240C0000000000CC
Line 12 ::102500000D0D0000000000000000000000000000B1
Line 13 ::10251000000C000000000000FFFFFFFF7FFE81892C
Line 14 ::02246500000075

Line 1 is used to indicate that the file is a Extreme HU Hex script.
Line 2 is used to tell Extreme HU to prompt the user for area info (what locals do you want).
Line 3 is used to tell Extreme HU not to display options.
Line 4 is used to copy the 12 byte key (more later on this)
Line 5 is used to tell Extreme HU to clean the card's eeprom.
Line 6 is a message you can display to the user in a dialog box (a dialog box is the little box that prompts you) at the beginning of the scripts execution (at the start)
Line 7 is a message that is displayed in a dialog box at the end of the scripts execution
Line 8 is used to add Fuse Bytes (is the card activated and married)
Line 9 & 10 is used to clear the Receivers (IRD) serial number
Line 11 is used to clear the IRD (Receiver) password
Line 12 & 13 are used to Add the guide (locals and style of programming)
Line 14 is used to fix the fourth byte of the ATR (this is done as a precaution as it can become currupted)


The following jump points are being hashed.

2711h-2ACDh,2D4Ch-2D8Bh,2F08h-3156h,3159h-3939h,393Dh-3F47h,22F2h-237Ch,23D5h-2405h,2698h-2711h,2CD0h-2CDFh,2CE8h-2D4Bh,2D4Ch-2DB6h,
3F58h-3F67h,3F88h-3FFEh

3159h-3939h, and 393Dh-3F47h.

Now two questions for all of you!

What does hashing mean?
What does the little "h" next to the addresses mean

Hashing
Hashing is the transformation of a string of characters into a usually shorter fixed-length value or key that represents the original string. Hashing is used to index and retrieve items in a database because it is faster to find the item using the shorter hashed key than to find it using the original value. It is also used in many encryption algorithms.
As a simple example of the using of hashing in databases, a group of people could be arranged in a database like this:

Abernathy, Sara
Epperdingle, Roscoe
Moore, Wilfred
Smith, David
(and many more sorted into alphabetical order)
Each of these names would be the key in the database for that person's data. A database search mechanism would first have to start looking character-by-character across the name for matches until it found the match (or ruled the other entries out). But if each of the names were hashed, it might be possible (depending on the number of names in the database) to generate a unique four-digit key for each name. For example:
7864 Abernathy, Sara
9802 Epperdingle, Roscoe
1990 Moore, Wilfred
8822 Smith, David
(and so forth)
A search for any name would first consist of computing the hash value (using the same hash function used to store the item) and then comparing for a match using that value. It would, in general, be much faster to find a match across four digits, each having only 9 possibilities, than across an unpredictable value length where each character had 26 possibilities.
The hashing algorithm is called the hash function (and probably the term is derived from the idea that the resulting hash value can be thought of as a "mixed up" version of the represented value). In addition to faster data retrieval, hashing is also used to encrypt and decrypt digital signatures (used to authenticate message senders and receivers). The digital signature is transformed with the hash function and then both the hashed value (known as a message-digest) and the signature are sent in separate transmissions to the receiver. Using the same hash function as the sender, the receiver derives a message-digest from the signature and compares it with the message-digest it also received. They should be the same.

The hash function is used to index the original value or key and then used later each time the data associated with the value or key is to be retrieved. Thus, hashing is always a one-way operation. There's no need to "reverse engineer" the hash function by analyzing the hashed values. In fact, the ideal hash function can't be derived by such analysis. A good hash function also should not produce the same hash value from two different inputs. If it does, this is known as a collision. A hash function that offers an extremely low risk of collision may be considered acceptable.

Here are some relatively simple hash functions that have been used:

The division-remainder method: The size of the number of items in the table is estimated. That number is then used as a divisor into each original value or key to extract a quotient and a remainder. The remainder is the hashed value. (Since this method is liable to produce a number of collisions, any search mechanism would have to be able to recognize a collision and offer an alternate search mechanism.)
Folding: This method divides the original value (digits in this case) into several parts, adds the parts together, and then uses the last four digits (or some other arbitrary number of digits that will work ) as the hashed value or key.
Radix transformation: Where the value or key is digital, the number base (or radix) can be changed resulting in a different sequence of digits. (For example, a decimal numbered key could be transformed into a hexadecimal numbered key.) High-order digits could be discarded to fit a hash value of uniform length.
Digit rearrangement: This is simply taking part of the original value or key such as digits in positions 3 through 6, reversing their order, and then using that sequence of digits as the hash value or key.
A hash function that works well for database storage and retrieval might not work as for cryptographic or error-checking purposes. There are several well-known hash functions used in cryptography. These include the message-digest hash functions MD2, MD4, and MD5, used for hashing digital signatures into a shorter value called a message-digest, and the Secure Hash Algorithm (SHA), a standard algorithm, that makes a larger (60-bit) message digest and is similar to MD4.


It is pretty hard to find a non hashed jump point in the eeprom. But using a method of cloaking (hiding) we can use a known jump point if we don't make it look obvious to the hash. Please read what a hash is and you will see we can get around it if we cloak.

Now how do we cloak? Well lets begin looking a dsstechpro.hex:

Line 1 #Extreme Hex
Line 2 #C-PromptAreaInfo
Line 3 :102590008A24E78D25F7066022258B011A22A88B55
Line 4 :1025A000011B8C01008A00667D3B29061E7DD72A0F
Line 5 :1025B00006058A260C00417DD82A06058A260D00CC
Line 6 :1025C000377DD92A06058A260E002D7D3529061469
Line 7 :1025D0007D082A06058A260A001E7D092A06058A24
Line 8 :1025E000260B00147D3229060A7D3F2A06058A261D
Line 9 :0725F0000F00058E0066F9E3
Line 10 ::0125F70006DD
Line 11 :1025F8008E0068F97640B5077203B8D5B5D5088C52
Line 12 :082608003C180100C5AA2412D0
Line 13 :033507008E25907E
Line 14 :033BD7008C25FC3E
Line 15 :01323F00F995
Line 16 :00000001FF

Line 3 Broken Down
:10 2590 00 8A 24 E7 8D 25 F7 06 60 22 25 8B 01 1A 22 A8 8B 55

: - Normal Line not encrypted

10 - write 16 bytes (remember in hex 10 = 16)

25 90 or 2590 is the address to start writing at (this is a rule - when you start a line with ":" you must follow it with the number of bytes to write "10" and then the address which will always be two bytes or four characters (2590)

00 - begin write (this is a rule too!)

Line 3 Continued
: 10 25 90 00 - defined above

8A 24 E7 8D 25 F7 06 60 22 25 8B 01 1A 22 A8 8B
55

55 - is the checksum. A checksum is a count of the number of bits in a transmission unit that is included with the unit so that the receiver can check to see whether the same number of bits arrived. If the counts match, it's assumed that the complete transmission was received. Both TCP and UDP communication layers provide a checksum count and verification as one of their services. This is calculated by Extrem HU for you - don't give it to much thought.

Report this post to a moderator | IP: Logged

01-09-2002 02:06 AM



alyn
Old Timer

Registered: Feb 2001
Location:
Posts: 275


Operational codes are used to give instructions. They are simply a language that is very short (byte by byte) to instruct a device to do something. We need opcode understanding if we are going to decypher 8A 24 E7 8D 25 F7 06 60 22 25 8B 01 1A 22 A8 8B.

Before we jump in lets list some opcodes and explain them. We know 8C means jump to and that we must follow 8C with an address to jump to. We also know that each is address is two bytes long or four characters long.

Lets start reviewing each opcode and thier meaning and how they are used - and why they were used here:

8A 24 E7 8D 25 F7 06 60 22 25 8B 01 1A 22 A8 8B


you have the opcode library you will see this
8Ah 3 MOV &ad16,A

What does this mean? Well lets see we know the little "h" is for hexadecimal and the 8A is the opcode so we can now ignore the little h.

Next the 3 - I'll let you think on that - give me the answer if you can!

Now the MOV - that's a Mnemonic - simply a shortened way of explaining the action this operation code will do. So what does it do - it says Move.

Now the &ad16 - ignore the & look at the ad16 - 16-bit Absolute Address - what does this mean? give me answer if you can!

Now the A - what the heck does it mean?
8A means to copy something to someplace.

So we know we have to copy from an address to an address - so look at the line

8A 24 E7 8D 25 F7 06 60 22 25 8B 01 1A 22 A8 8B

we copy (8A) location what ever is at 24 E7 (24E7) to ? (hold that thought). So we know that we copy the value at 24E7 what do we do with it? Well lets look at the next byte - 8D.

8D means CMP or compare - hmmm - compare eh. compare what? the next two bytes are the address to compare what we copied (24 F7) 24F7

So now we know we are to copy 24E7 and compare it to 25F7 but what do we do next. 06 JNZ - what the heck is JNZ, well actually it means Jump if not equal to zero. Where do we jump to? look at the next two bytes - 2225 (22 25). But what if it is equal to zero - then proceed to the next byte (opcode).


8A means copy into memory the information at 24E7
8D means compare what you copied into memory (24E7) to 25F7

This is comparing the DSW update to ensure it equals 06.


Now here is the 3M part
: 10 25F8 00 8E 00 68 F9 76 40 B5 07 72 03 B8 D5 B5 D5 08 8C 52
: 08 2608 00 3C 18 01 00 C5 AA 24 12 D0
: 03 3507 00 8E 25 90 7E
: 03 3BD7 00 8C 25 FC 3E
: 01 323F 00 F9 95

Let s do the first line:

: 10 25F8 00 8E 00 68 F9 76 40 B5 07 72 03 B8 D5 B5 D5 08 8C 52
define it and tell me why it's here! Look at extreme Hu in the HU Map you'll notice that this address is in the ZKT table. (hmmm cloaking)

Notice the jump at the end - the next two bytes - the address - is found on the next line (3C18) the jump to the authorization.


u can overwrite the register when you no longer need the value

10 25F8 00 8E 00 68 F9 76 40 B5 07 72 03 B8 D5 B5 D5 08 8C 52
Let take off the 10 25F8 00 and the check sum 52. We all know what these mean at this point - if not ask now!

We leave 8E 00 68 F9 76 40 B5 07 72 03 B8 D5 B5 D5 08 8C

but do we care about 8E 00 68 F9 76 40 B5 07 72 03 B8 D5 B5 D5 08 - is this not just some data to help cloak the jump 8C?

3M Continued
Line 1 : 10 25F8 00 8E 00 68 F9 76 40 B5 07 72 03 B8 D5 B5 D5 08 8C 52
Line 2 : 08 2608 00 3C 18 01 00 C5 AA 24 12 D0
Line 3 : 03 3507 00 8E 25 90 7E
Line 4 : 03 3BD7 00 8C 25 FC 3E
Line 5 : 01 323F 00 F9 95

Line 1 explained

10 - (write 10h bytes)
25F8 - (starting at 25F8)
00 - (start the write)
8E 00 68 - (Call (Do) cmd 82 starting at 0068)
F9 - (return)
76 40 B5 07 - (BTJO - check bit 6 of register B5 if 1 go to addr 7 steps away) else go on
72 03 B8 - (copy #03 into register B8 setting bits 0 and 1)
D5 B5 - (clear register B5)
D5 08 -(clear register 08)
8C __ __ - (branch to ?? ??) on next line
52 - checksum

Now obviously we can just use this code as it will go down. But do we need to do all the above before we get to the Jump?

You guys are fast - well the answer before the question - yes we need to authorize video but not all in one location (hmmm - cloaking

If you read what a hash is you know that if you take the value of 3M code if will equal to some value - they can use this to hunt your code and kill it.

So if we break it up enough and put it in a range of addresses not easily searched we can successfully cloak our code.

You can use a jump 8C or maybe another opcode. Lets Review
we know that we are now in the 3M part and that the one we see here is being hashed. We know we have to break the code up and hide it or ...

OR how about this - I need lots of help here - we write code to write to the RAM. We use the MOV (copy) opcode to place each piece of code to RAM then execute it with CMP.

Let's go back a minute
We haven't finished completing the breakdown of the lines.

We know we need this line and what it does

:1025F8008E0068F97640B5077203B8D5B5D5088C52

this line contains the jump address 3C18 but anything else?

:082608003C180100C5AA2412D0

Lets break out the code for video part 1
76 40 B5 07 and add it in 3 lines of code where the result will be copying the code to RAM - We'll pick starting address 0023.

: 10 25F8 00 8A 00 34 76 8A 00 35 40 8A 00 36 B5 8A 00 37 07
: 10 2608 00 8A 00 38 72 8A 00 39 03 8A 00 40 B8 8A 00 41 D5
: 10 2616 00 8A 00 42 B5 8A 00 43 D5 8A 00 44 08 8A 00 45 8C
: 10 2626 00 8A 00 46 3C 8A 00 47 18 00 00 00 00 XX 00 34 00

We must know exactly what command is used to copy bytes to RAM addresses - I am using 8A - 8A is a register copy not an address unless I'm wrong. We can substitute 8A for the correct opcode as soon as we find it.
Next we will substitue XX for the CMP or call function that will run the code in RAM.
Find the mistakes?
The post above said it 8A moves to register 8B to Address. You have to move to register then from register to RAM.

Maybe Like this?
: 10 25F8 00 8A 26 04 8B 00 34 8A 26 05 8B 00 35 76 40
: 10 2606 00 8A 26 12 8B 00 36 8A 26 13 8B 00 37 B5 07
Did you spot the mistake
look at the number of bytes to be written - it's not 16 (10h) it 14 (0Dh).

Let's Review
We are writing to RAM from code that is going to writen in the eeprom we then execute the code in ram from the eemprom

: 0D 25F8 00 8A 26 04 8B 00 34 8A 26 05 8B 00 35 76 40

: 0D 2606 00 8A 26 12 8B 00 36 8A 26 13 8B 00 37 B5 07

: 0D 2614 00 8A 26 20 8B 00 38 8A 26 21 8B 00 39 72 03

: 0D 2614 00 8A 26 2E 8B 00 40 8A 26 2F 8B 00 41 B8 D5

: 0D 2614 00 8A 26 3C 8B 00 42 8A 26 3D 8B 00 43 B5 D5

: 0D 2614 00 8A 26 3C 8B 00 44 8A 26 3D 8B 00 45 08 8C

Now this should be mixed up alittle - don't write is in line as i have

did this in word - it doesn't line up to good here - the first line in the address (last byte) the second line is the actual line of script, the third - what is being written

Part 1, Card Prep

#Extreme Hex
#C-OptionsOFF
#C-CopyKey
#C-CleanEEP
#C-StartMsg=
#C-EndMsg=
#C-PromptAreaInfo

Part 2, DSW Update

:10 2590 00 8A 24 E7 8D 25 F7 06 60 22 25 8B 01 1A 22 A8 8B 55
:10 25A0 00 01 1B 8C 01 00 8A 00 66 7D 3B 29 06 1E 7D D7 2A 0F
:10 25B0 00 06 05 8A 26 0C 00 41 7D D8 2A 06 05 8A 26 0D 00 CC
:10 25C0 00 37 7D D9 2A 06 05 8A 26 0E 00 2D 7D 35 29 06 14 69
:10 25D0 00 7D 08 2A 06 05 8A 26 0A 00 1E 7D 09 2A 06 05 8A 24
:10 25E0 00 26 0B 00 14 7D 32 29 06 0A 7D 3F 2A 06 05 8A 26 1D
:07 25F0 00 0F 00 05 8E 00 66 F9 E3
::01 25F7 0006 DD

Part 3, Clear IRD and Set Guide

::04 2460 00 00 00 00 00 78
::04 24A4 00 00 00 00 00 34
::10 2500 00 0D 0D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 B1
::10 2510 00 00 00 00 00 00 00 00 00 FF FF FF FF 7F FE 81 89 38

Part 4, Add Fuse Bytes

: 02 2014 00 25 DA CB

Part 5, Authorization

: 10 25F8 00 8E 00 68 F9 76 40 B5 07 72 03 B8 D5 B5 D5 08 8C 52
: 08 2608 00 3C 18 01 00 C5 AA 24 12 D0

8E 00 68 means lcall like jump to addy 00 68
F9 is the return for 8E
76 40 B5 07 MEANS check to see if video is allowed
72 03 B8 means enable video
D5 B5 D5 08 means clear nags
8C is the start of the jump back to 3C18 addy

Rewrite Part 5 as follows

D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
25D0 : 10 25DO 00 8A 00 FE 8B 00 30 8A 00 FD 8B 00 31 8A 00 FF 8B
76 40 B5

E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
25E0 : 10 25EO 00 00 32 8A 00 FC 8B 00 33 8A 00 FB 8B 00 34 8A 00
07 72

F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
25F0 : 10 25FO 00 FA 8B 00 35 18 3C 8C 08 D5 B8 03 72 07 40 76 B5
03

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
2600 : 10 260O 00 8A 00 F9 8B 00 36 8A 00 F8 8B 00 37 8A 00 00 8B
B8 D5

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
2610 : 10 261O 00 00 38 8A 00 FF 8B 00 39 8A 00 F8 8B 00 40 8A 00
B5 D5

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
2620 : 10 262O 00 F7 8B 00 41 8A 00 F6 8B 00 42 8A 00 F5 8B 00 43
08 8C 3C

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
2630 : 06 263O 00 8A 00 F4 8B 00 44
18
The Lines would look like this
: 10 25DO 00 8A 25 FE 8B 00 30 8A 25 FD 8B 00 31 8A 25 FF 8B
: 10 25EO 00 00 32 8A 25 FC 8B 00 33 8A 25 FB 8B 00 34 8A 25
: 10 25FO 00 FA 8B 00 35 18 3C 8C 08 D5 B8 03 72 07 40 76 B5
: 10 260O 00 8A 25 F9 8B 00 36 8A 00 F8 8B 00 37 8A 00 00 8B
: 10 261O 00 00 38 8A 25 FF 8B 00 39 8A 25 F8 8B 00 40 8A 25
: 10 262O 00 F7 8B 00 41 8A 25 F6 8B 00 42 8A 25 F5 8B 00 43
: 06 263O 00 8A 25 F4 8B 00 44
We are looking for a Call opcode
What opcode is used to call a routine (set of instructions)

AE
AF
9E
9F
F4EE
F4EF

When you enter the script do it by byte by byte. The checksums must be added by extreme hu automatically and the first part :10203000 - that should not be entered. you enter 2030 in the address field

Report this post to a moderator | IP: Logged

01-09-2002 02:07 AM



alyn
Old Timer

Registered: Feb 2001
Location:
Posts: 275


The idea is to put the code in Ram then run it. then erase it, and so on and so on...
If they try to hash they wont find the code!
We write the lines of code to ram - execute them and then erase them. Thats what humask did BUT it write to the eeprom - killing the card after so many writes. RAM IS constantly written to it is built to handle this and will not hurt a card. If done correctly it can't be detected.

When we finally go holy shi... I mean eureka we will move to a new thread and recap. that way we don't have to weed through so much of my bad humour.

Lets confirm the following:

1. RAM addresses that can be used.

2. Opcodes that will be used to:
Move data to the register
Move data from the register to an absolute address
Call a subroutine and return

3. Addresses to use to put the loading code into - the code we use to put code into RAM (the zkt will not be the locale as we have made it public - this address along with the final ram addresses will be determined but not used in the examples)

We have the RAM address but are unsure of where to place the code within it. Yes there are specific addresses used for processing and we don't want to use those. But remember we only want to write the code to ram - execute it - erase it. this will happen each time the card is hot (each time a video packet needs to verified).

We know the registers are at the beginning so we can't use the first couple of addresses. What addresses should we use. Now if we say will DAVE put code in ram and keep checking it - probably - but we can simply retrive what's in RAM hold it, write our code, execute our code and rewrite the original values back.

Now how about the opcodes - the opcodes we are using are fat - they aren't refined lets get a little more creative and use the nice ones to our advantage - this will shorten our code and allow us to cloak easily.
.........................................................................................................
>FOR HU CARD
>HU EEPROM INFORMATION:

2014 - 2015: Fuse Byte - 25 DA subscribed or 20 DF virgin

2024 - 2105: PPV area

2106 - 22F1: Tier area

2406 - 2407: Spending Limit

240C - 240F: Password

2410 - 2415: Zip Code

2460 - 2463: IRD number prewrite info

24a4 - 24a8: ird number

24C0 - 24C7: Eeprom Decrypt key 1

24C8 - 24C9: USW Counter

24D8 - 24DB: CAM ID number

24E0 - 24E0: Time Zone

2500 - 2500: Guide Byte?

2550 - 258F: Primary ZKT Table

2590 - 25CF: Secondary ZKT Table

25D0 - 260F: Tertiary ZKT Table

2658 - 265F: Eeprom decrypt key 2


command dispatch

SendATRVec 288C 8C C2 98 ljmp SendATR ;
func288FVec 288F 8C C0 EC ljmp func_C0EC ;
func3EEBVec 2892 8C 3E EB ljmp func_3EEB ;
GetByteFrmZKTModulusVec 2895 8C 3B 06 ljmp GetByteFromZKTModulus ;
Set2AToZKTSecretVec 2898 8C 3B 34 ljmp Set2AToZKTSecret ;
func3819Vec 289B 8C 38 19 ljmp func_3819 ;
func3978Vec 289E 8C 39 78 ljmp func_3978 ;
28A1 8C C2 7A ljmp func_C27A ;
func3C96Vec 28A4 8C 3C 96 ljmp func_3C96 ;
func393AVec 28A7 8C 39 3A ljmp func_393A ;
funcE074Vec 28AA 8C E0 74 ljmp func_E074 ;
func2F43Vec 28AD 8C 2F 43 ljmp func_2F43 ;
PreprocessPktVec 28B0 8C 37 00 ljmp PreprocessPkt ;
funcE30EVec 28B3 8C E3 0E ljmp func_E30E ;
func28B6Vec 28B6 8C 3D 12 ljmp func_3D12 ;
func3780Vec 28B9 8C 37 80 ljmp func_3780 ;
func3770Vec 28BC 8C 37 70 ljmp func_3770 ;
funcE043Vec 28BF 8C E0 43 ljmp func_E043 ;
func3C96Vec_ 28C2 8C 3C 96 ljmp func_3C96 ;
28C5 8C 3D 56 ljmp func_3D56 ;
funcD6B2Vec 28C8 8C D6 B2 ljmp func_D6B2 ;
func29C4Vec 28CB 8C 29 C4 ljmp func_29C4 ;
func2F56Vec 28CE 8C 2F 56 ljmp func_2F56 ;
func3181Vec 28D1 8C 31 81 ljmp func_3181 ;
func3F37Vec 28D4 8C 3F 37 ljmp func_3F37 ;
func2AC5Vec 28D7 8C 2A C5 ljmp func_2AC5 ;
func3B55Vec 28DA 8C 3B 55 ljmp func_3B55 ;
func3B79Vec 28DD 8C 3B 79 ljmp func_3B79 ;
func28E0Vec 28E0 8C 36 EA ljmp func_36EA ;
funcC430Vec 28E3 8C C4 30 ljmp CallFunction@36 ;
func33B7Vec 28E6 8C 33 B7 ljmp func_33B7 ;
func2F9DVec 28E9 8C 2F 9D ljmp func_2F9D ;
funcD6F6Vec 28EC 8C D6 F6 ljmp func_D6F6 ;
func3103Vec 28EF 8C 31 03 ljmp func_3103 ;
funcD343Vec 28F2 8C D3 43 ljmp func_D343 ;
func36F5Vec 28F5 8C 36 F5 ljmp func_36F5 ;
func231EVec 28F8 8C 23 1E ljmp func_231E ;
28FB 8C 37 73 ljmp func_3773 ;
func3ED0Vec 28FE 8C 3E D0 ljmp func_3ED0 ;
DispatchInstructionVec 2901 8C 30 5C ljmp DispatchInstruction ;
2904 8C EC 9C ljmp func_EC9C ;
2907 8C 37 72 ljmp ret_3772 ;
func290AVec 290A 8C 37 72 ljmp ret_3772 ;


INS dispatch routine:

305F 32 BE mov i,PktInsByte ;
3061 AA 30 73 mov a,@i+Ins00Jump ;
3064 D0 29 mov 29h,a ;
3066 AA 30 74 mov a,@i+3074h ;
3069 D0 2A mov 2ah,a ;
306B 8E C3 7A lcall SendInsByteToIRD ; Send INS byte to IRD if packet length is non-zero
306E 9E 2A icall @2ah ; Call appropriate function to handle the packet
3070 8C 34 04 ljmp 3404h ;

Ins00Jump 3073 C3 58 dw DecoyIns
Ins02Jump 3075 CE 77 dw Ins02-Send8Bytes@24D0
Ins04Jump 3077 C7 EC dw Ins04-RecvByte@2016
Ins06Jump 3079 CF F8 dw Ins06-SendByte@2016
Ins08Jump 307B C3 58 dw DecoyIns
Ins0AJump 307D C3 58 dw DecoyIns
Ins0CJump 307F C3 58 dw DecoyIns
Ins0EJump 3081 C3 58 dw DecoyIns
Ins10Jump 3083 C3 58 dw DecoyIns
Ins12Jump 3085 C7 FB dw Ins12-Send8Bytes@2000
Ins14Jump 3087 C3 58 dw DecoyIns
Ins16Jump 3089 C3 58 dw DecoyIns
Ins18Jump 308B C3 58 dw DecoyIns
Ins1AJump 308D C3 58 dw DecoyIns
Ins1CJump 308F C3 58 dw DecoyIns
Ins1EJump 3091 C3 58 dw DecoyIns
Ins20Jump 3093 C3 58 dw DecoyIns
Ins22Jump 3095 C3 58 dw DecoyIns
Ins24Jump 3097 C3 58 dw DecoyIns
Ins26Jump 3099 C3 58 dw DecoyIns
Ins28Jump 309B C7 F5 dw Ins28-Send#00h#80hToIRD
Ins2AJump 309D CF 56 dw Ins2A-SendMoreCardInfo
Ins2CJump 309F C8 06 dw Ins2C-GetUserLimits
Ins2EJump 30A1 C6 A4 dw Ins2E-SetUserLimits
Ins30Jump 30A3 CC C4 dw Ins30
Ins32Jump 30A5 3E DC dw Ins32
Ins34Jump 30A7 C3 58 dw DecoyIns
Ins36Jump 30A9 CF 08 dw Ins36
Ins38Jump 30AB C9 83 dw Ins38-EnableCardSwap
Ins3AJump 30AD C3 58 dw DecoyIns
Ins3CJump 30AF C3 58 dw DecoyIns
Ins3EJump 30B1 C3 58 dw DecoyIns
Ins40Jump 30B3 D0 EE dw Ins40/42-CmdPacket
Ins42Jump 30B5 D0 EE dw Ins40/42-CmdPacket
Ins44Jump 30B7 30 14 dw Ins44-RecvCardSwapData
Ins46Jump 30B9 3F 20 dw Ins46
Ins48Jump 30BB CE 3F dw Ins48-SetUserPassword
Ins4AJump 30BD 37 10 dw Ins4A-InitZKT
Ins4CJump 30BF C6 E4 dw Ins4C-Marry/CheckIRD
Ins4EJump 30C1 C3 58 dw DecoyIns
Ins50Jump 30C3 C3 58 dw DecoyIns
Ins52Jump 30C5 CE AD dw Ins52-GetUserPassword
Ins54Jump 30C7 3B A1 dw Ins54-GetDecryptionSeed
Ins56Jump 30C9 C9 A0 dw Ins56-SendCardSwapData
Ins58Jump 30CB CE B8 dw Ins58-SendCardInfo
Ins5AJump 30CD 37 22 dw Ins5A-PerformZKT
Ins5CJump 30CF C8 A0 dw Ins5C-SendStatusBytes
Ins5EJump 30D1 C5 49 dw Ins5E

Report this post to a moderator | IP: Logged

01-09-2002 02:09 AM



alyn
Old Timer

Registered: Feb 2001
Location:
Posts: 275


ins-54 area

3BA1 8E 3E D6 LCALL 3ED6h
3BA4 77 10 B8 2F JBCLR B8h.4, 3BD7h
3BA8 D5 08 ?? 08h ??
3BAA D5 B8 ?? B8h ??
3BAC 77 08 D0 08 JBCLR D0h.3, 3BB8h
3BB0 72 16 08 MOV 08h, #16
3BB3 74 04 B8 ORL B8h, #04
3BB6 00 51 SJMP 3C09h
3BB8 76 40 B5 4D JBSET B5h.6, 3C09h
3BBC 88 01 76 30 MOVW 30h, 0176h
3BC0 88 00 A0 32 MOVW 32h, 00A0h
3BC4 72 08 06 MOV 06h, #08
3BC7 8E E5 B7 LCALL E5B7h
3BCA D5 A8 ??? A8h ??
3BCC D5 A9 ??? A9h ??
3BCE 74 01 B8 ORL B8h, #01
3BD1 8E 3C 74 LCALL 3C74h
3BD4 89 00 96 ??? 0096h ??
3BD7 C5 CLR I
3BD8 AA 24 F4 MOV A, @I+24F4h
3BDB D0 0B MOV 0Bh, A
3BDD AA 00 A0 MOV A, @I+00A0h
3BE0 43 00 0B ??? 0Bh, #00 ??
3BE3 AA 2A E4 MOV A, @I+2AE4h
3BE6 13 0B XRL A, 0Bh
3BE8 AB 00 A0 MOV @I+00A0h, A
3BEB C3 INC I
3BEC 5D 0C CMP I, #0C
3BEE 0F E8 JLT 3BD8h
3BF0 8E DE D9 LCALL DED9h
3BF3 8E DF 61 LCALL DF61h
3BF6 7D 17 C6
3BF9 06 03 JNZ 3BDEh
3BFB 72 04 B8 MOV B8h, #04
3BFE 77 08 B8 03 JBCLR B8h.3, 3C05h
3C02 74 02 D1 ORL D1h, #02
3C05 76 01 B8 0F JBSET B8h.0, 3C18h
3C09 C5 CLR I
3C0A B5 CLR A
3C0B AB 00 A0 MOV @I+00A0h, A
3C0E AB 00 88 MOV @I+0088h, A
3C11 C3 INC I
3C12 5D 0A CMP I, #0A
3C14 0F F5 JLT 3C0Bh
3C16 00 37 SJMP 3C4FH
3C18 C5 CLR I
3C19 88 01 76 2C MOV 2Ch, 0176h
3C1D A6
3C1E 01 3D
3C20 FC 80 35
3C23 8E 3C A0 LCALL 3CA0h
3C26 A8
3C27 01 76
3C29 30
3C2A EE
3C2B 13 D8 XRL A, D8h
3C2D 9B 2C MOVW @2Ch, A
3C2F 70 01 2C ADDW 2Ch, #01
3C32 C3 INC I
3C33 5D 0A CMP I, #0A
3C35 0F E6 JLT 3C1Dh
3C37 88 01 76 2C MOVW 2Ch, 0176h
3C3B C5 CLR I
3C3C 9A 2C MOVW A, @2Ch
3C3E AB 00 A0 MOV @I+00A0h, A
3C41 AB 00 88 MOV @I+0080h, A
3C44 B5 CLR A
3C45 9B 2C MOVW @2Ch, A
3C47 C3 INC I
3C48 70 01 2C ADDW 2Ch, #01
3C4B 5D 0A CMP I, #0A
3C4D 0F ED JLT 3C3Ch
3C4F 77 40 B7 03 JBCLR B7h.6, 3C56h
3C53 8E 3D 90 LCALL 3D90h
3C56 76 01 B6 04 JBSET B6h.0, 3C5Eh
3C5A D5 A8 ??? A8h ??
3C5C D5 A9 ??? A9h ??
3C5E 8E 3C 74 LCALL 3C74h
3C61 C5 CLR I
3C62 AA 00 88 MOV A, @I+0088h
3C65 AB 00 A0 MOV @I+00A0h, A
3C68 C3 INC I
3C69 5D 08 CMP I, #08
3C6B 0F F5 JLT 3C62h
3C6D 98 D6 C3 MOVW C3h, D6h
3C70 98 A7 D6 MOVW D6h, A7h
3C73 F9 RET

3C74 42 B5 AA
3C77 12 B8 MOV A, B8h
3C79 25 07
3C7B D0 AB MOV ABh, A
3C7D 32 C7 MOV I, C7h
3C7F 34 C8 ??? , C8h ??
3C81 02 05 JZ 3C88h
3C83 74 01 D2 ORL D2h, #01
3C86 D5 08 ??? 08h ??
3C88 42 08 AC
3C8B C5 CLR I
3C8C AA 00 A0 MOV A, @I+00A0h
3C8F E1 SEND A
3C90 C3 INC I
3C91 5D 0D CMP I, #0D
3C93 0F F7 JLT 3C8Ch
3C95 F9 RET

3C96 A6
3C97 01 3D
3C99 FC 21 30
3C9C 8E 3C A0 LCALL 3CA0h
3C9F F9 RET

3CA0 B8
3CA1 C8
3CA2 D5 DB ??? DBh ??
3CA4 D5 DC ??? DCh ??
3CA6 D0 D8 MOV D8h, A
3CA8 7B
3CA9 05 DC ??? DCh ??
3CAB 32 DB MOV I, DBh
3CAD AA 00 A8 MOV A, @I+00A8h
3CB0 1B D8 ADD A, D8h
3CB2 AB 00 A8 MOV @I+00A8h, A
3CB5 D0 DA MOV DAh, A
3CB7 AA 00 A0 MOV A, @I+00A0h
3CBA 13 DA XRL A, DAh
3CBC AB 00 A0 MOV @I+00A0h, A
3CBF 13 DC XRL A, DCh
3CC1 25 1F
3CC3 C0
3CC4 AA 3C F2 MOV A, @I+3CF2h
3CC7 D0 DA MOV DAh, A
3CC9 32 DB MOV I, DBh
3CCB 53 06
3CCD AA 00 A8 MOV A, @I+00A8h
3CD0 13 DA XRL A, DAh
3CD2 AB 00 A8 MOV @I+00A8h, A
3CD5 B0
3CD6 BD
3CD7 D0 DA MOV DAh, A
3CD9 32 DB MOV I, DBh
3CDB 53 05
3CDD AA 00 A0 MOV A, @I+00A0h
3CE0 1C DA ??? , DAh ??
3CE2 AB 00 A0 MOV @I+00A0h, A
3CE5 43 00 D8 ??? D8h, #00 ??
3CE8 D3 DB ??? DBh ??
3CEA 7D 08 DB CMP? DBh, #08
3CED 0F B9 JLT 3CA9h
3CEF C4
3CF0 B4
3CF1 F9 RET
.........................................................................................................
>FOR HU CARD
>-----Paste-----

lets see, at our last class we learned about the hu card in general...how we access it etc....well to day we are going to start picking the eeprom apart......

(Refer to HU Eeprom Maps, etc for the following)

You will see somethings that look familiar to you in the hu eeprom, ppv area, a tier area, some stuff that looks like the h card, but if you dump an hu card you will not see all 000`s there like on a virgin h card you will see a bunch of numbers..this is because part of the hu card is encrypted. yep that is correct each hu card is encrypted with a different set of eeprom keys that generated when the card is first started up.

there are actually two sets of keys that are xor`d (an exclusive or) together to get one single key....

an exclusive or is a binary bit comparison in which
1 xor 1 =0
0 xor 0=0
1 xor 0=1
0 xor 1=1

this gives an 8 byte key that can be used to decrypt the eeprom..actually the key must be listed twice for the 16 byte addreses.

not all of the eeprom is encrypted just mainly the general stuff like ppv, tier areas, ird # etc.

there are a lot of blank areas in the hu card, i am not quite sure why they are there but it gives us many places to put code.

if you dump an hu card you will see a bunch of hex numbers so besides the general stuff and the hu eeprom keys what are all those numbers and what do they mean???

those numbers are operation codes or opcodes. they are hex numbers (instructions) that the card understands.. in other words each number 00-ff has a different meaning and we use these opcodes to "talk" to the card and tell it what to do.. some opcodes have some extra bytes that go along with them. these other bytes can be part of a numeric instruction/calculation, or can just simply be an address like 8c 20 50 (jump to the address 2050)


one of the main parts of the eeprom that we will be concerned with is the ins 54 area.. this is the part of the eeprom that checks to see if we are authorized to view each channel...look through the disasembly and see if you can find what the ins 54 area is looking for to be set...


ok that is enough for today there will be a chat class thursday at 9pm eastern, 8 central, if you have any questions feel free to ask them... you can post them below if you want or bring them to the chat.....

woody


ok lets talk about what it takes to activate an hu card.....

1)we need to set the fuse bytes
2) we need to write the 12 byte key
3) we need to write our 3m code

we set the fuse bytes to 25 da which basically means that this card is married and activated... the fuse bytes are located at 2022-2023

next we need to write a 12 byte key...the 12 byte key is originally located at 2ae4 and is written at 24f4...this is nothing more than a card key, it is changed with the usw...when usw 1 hit it changed the 12 byte key.. the reason that we transfer the 12 byte key is that it is transfered on any sub card... if we corrupt the 12 byte key we can partially write protect the card from taking updates... but a corrupted 12 byte key could potentially be an ecm target..

now the 3m code...
a 3m code is nothing more than a string of numbers that set the video bits and clear the video nag...so what are the strings???

74 02 27 ;this set the video bit
75 ef 28 ; this clears the nag

now in the h card the nag was called at the same time as the check for the video bit.. on the hu they are called at different times forcing us to do one of two things..

1) use two jump points one for the videoand one for the nag

2) use 1 jump point and do a check to see what the card is checking for then clear the nag or set the video bit depending on what the card is looking for.....

now i used a new term.."jump point"...a jump point is a place in the card`s code where we tell the card to jump from it original code to code that we want it to execute...it is usually accompanied by a return jump... a jump back to the card`s code...

now i can imagine u guys have a dazed look on your faces...its ok we are going to go back over this in class four in which we will cover jump points in detail...

some questions u should be asking yourself

where do we put the 3m code?
where do we put the jump points?
how do we check for what the card is looking for?
what am i going to have for dinner??

i am not sure when the next chat class will be ....i will post it a few days before the class

ok today we are going to talk about jump points......

what is a jump point??
well a jump point is a place that the normal operation of the card and jump to some code that we want to execute...

it looks like this

8C XX XX ;where XXXX= place we want to jump to

8C 20 50 ;jump to address 2050

after the code is executed there is usually a return jump which returns from the code we wanted to execute to the cards normal operation....

so where are good places to jump from???
well this is a touchy subject....the original hu 3m jumped from 283A and eclipse uses 283D.....if you refer to class 3 you see that eclipse and input.hex all use a single jump to set the bits for video and to clear the nag....


private jumps
yes the hu is full of private jumps...there are a bunch of places that we can jump from...if you find some do not post them...by posting them you are doing more harm than good....

how to find private jumps....well you just have to follow the code...by far the most complex thing to do is clear the nag...setting the video bit is pretty easy and there are a lot of places to do it....

the next chat class will be thursday at 9 pm eastern time......

i am sorry for the lack of posts by me but i have been extremly busy


-----End Paste-----

Report this post to a moderator | IP: Logged

01-09-2002 02:10 AM



All times are GMT. The time now is 01:00 AM.


Pages (33): [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 » Last Thread Next Thread

Show Printable Version | Email this Page | Subscribe to this Thread

Forum Jump:
Please select one: -------------------- Private Messages User Control Panel Who's Online Search Forums Forums Home -------------------- General-- New people, please read here first. - Read only-- Website / Forums suggestions.-- Joke of the day-- The SoapBox-- Scammer's-- IRC (Webchat) questions and commnets.General DTV Discussion Area-- Current Events-- ECM and Hashing Discussion-- The "Dave Letter" forum and/or recent busts.-- Questions or Comments about the dssworldH card related topics-- H Card General Programming-- H Card Unlooping-- Bootloader Discussion-- H CardEmulators and Data LoggingDTV Tools-- **** H and HU Card Files Area ****---- HU Files---- H Files---- HU EMU Files---- H EMU---- Flashing Tools---- Extreme HU---- Misc H and HU files---- Other Kool Tools-- Script Writing 101-- Atmel Flashing-- General Hardware Modifications-- P4 cardsHU card related topics-- HU Card General Programming-- HU Card Unlooping Discussion-- HU Emulation and data loggingDishNetwork Discussion Area-- Dish Network Newbie-- Dish Network Software Discussion Area-- Dish Network Hardware Discussion Area-- Dish Network AVR/Atmega/Emulation-- *** Dishnet Files ***-- Dish Network JTAG/TSOP-- General DishNet AreaHardware How to - Read Only-- Loaders-- DTV Emulators-- Emulation cubes-- Bootloaders-- AVR's-- J-Tags-- TSOP Locking-- Dishnet emulationMisc Hacking-- Cable Hacking-- Warez-- Tivo Hacking-- C-Band-- PS2-- GLA / SKY Discussion Area-- XBOX HackzGeneral Entertainment-- Gaming Area-- Movies & Tv Shows-- Dssware Toys-- Computer Help-- Sports-- Satellite Installation HelpAdults Only! XXX-- gimmie porn!-- Freaky Shit
Rate This Thread:
Select a rating... 5 .. Best 4 3 .. Average 2 1 .. Worst

Forum Rules:You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts HTML code is ON
vB code is ON
Smilies are ON
[IMG] code is ON