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