Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

W1cked

Member
  • Content Count

    16
  • Joined

  • Last visited

  • Days Won

    2

Everything posted by W1cked

  1. W1cked

    Conquer Map Editor/Creator

    The closest thing I have is a command line dmap reader that I built in Go. I had to have the dmap system in my source for validation anyway, but creating it for command line wasn't that much more difficult. A visual editor on the other hand, like @Spirited said, would probably take a lot of work. I'm actually happy that Ultimation didn't share it, but that's just my opinion.
  2. If the servers are shut down, that usually means the patch servers will likely be taken down too. So in that case, whatever you have on the disc will be what you are stuck with. This is the case with almost all modern games.
  3. W1cked

    Hello world

    Hey everyone, I have made a few posts already but I figured I would give an introduction as well. I'm currently in school for Computer Science, and going to hopefully continue until I get my masters in Data Analytics. I'm older than most college students as I chose to serve in the military before going. I've played Conquer for a long time, the earliest that I can remember is that CP's didn't exist, and top + was 8 I believe. I primarily use Go, although I have used C# but mostly just using the Unity library. I'm currently working on a Go 5017 source, but the scope for this is a lot smaller than Spirited's Chimera project. So that's pretty much it, hope to see you all around!
  4. W1cked

    Hello world

    @Spirited Don't worry, my Go code can't be much better. I think we're all pretty critical of ourselves when we look back. I've never looked at my code from 6 months prior and thought "Wow, what a good job." I'm not really sure why I want a Data Analytics, Finance is really where I would like to apply my software skills. Like trading platforms, brokers, or banks. @Omicron @Twelve I'm pretty interested in it, always have been. I've just now been able to find time to actually do something. I hope to have something released soon in 5017 patch. I'm hoping to maybe fix some potential unclean (or what I view as unclean) habits in some sources. My first order of business, in my 5017 server I scraped the idea of switch statements for packet handling. I've created a router, something like a simple http router if you have ever used Go. So instead of having abnormally large switch statements for handling packets, at initialization you specify what "process" goes to the uint16. c.Router.Add(NewRoute().Name(packets.MsgAccountType).Process(MsgAccountProcess)) In my opinion, this makes the code base far more manageable and readable. The router uses a map[uint16]*Route, and the Route contains some information including what process to run for that packet. Since it uses a map, finding the Route happens in constant time (which isn't TOO big of a deal, but it still helps.) I'm hoping to also use something like this for handling some sub actions of packets, like MsgAction.
  5. W1cked

    Packet [1052] Game

    I'm a little confused on why this occurs, and I've looking through a few sources to try to figure it out, but it appears something is occurring that I can't see. I pass packet [1055] from the account server to the client with a uint32 for the Client Identity and another uint32 for the Authentication Code. Identity = 1000000 Auth Code = 2 The client then responds to the account server with [28 0 28 4 64 66 15 0 10 0 0 0 114 101 115 46 100 97 116 0 0 0 0 0 0 0 0 0] Which is packet [1052], with the Identity of 1000000 which appears to be correct. This is where I get lost. The client then connects to the game server, and immediately sends packet [1052]. [28 0 28 4 0 0 0 0 0 0 0 0 0 0 69 110 0 0 0 0 0 0 0 0 0 0 0 0] 28 Length, [1052] Type, and the Identity and additional data are 0's. Why is the client not passing along the identity to the game server?
  6. W1cked

    Packet [1052] Game

    @Spirited that’s what i’ve been using. I’m having to go through sources to find out the sequences. I have the ciphers working (i think) but what i’m struggling with now is that the game crashes when i send the ANSWER_OK packet. I’m guessing that it has something to do with the cipher. I’m trying to debug a couple of sources to figure out what i’m doing different.
  7. W1cked

    Packet [1052] Game

    I am an overly confident programmer who makes simple binary mistakes, and refuses to acknowledge that it could have possibly been me who messed up. This has caused me a great deal of time wasted. I was using the wrong method of the binary littlendian package.
  8. W1cked

    RC5 Package - Go

    I had help from @Spirited to figure this stuff out and port it to Go. I know a lot of people in the emulator communities don't use Go, but I hope with more packages released it will lift the barrier for people to use it. It's pretty straight forward, use the NewRC5 method instead of a struct literal. Encrypt by calling Encrypt and supplying a dst byte slice the same size as the src slice. For Decrypting, do the same thing. This adheres to the Cipher.Block interface, so for your client/conn structs you can just use that interface type. package rc5 import ( "encoding/binary" "math/bits" ) const ( WordSize = 16 Rounds = 12 KeySize = WordSize / 4 SubSize = 2 * (Rounds + 1) ) type RC5 struct { Key []uint32 Sub []uint32 } func NewRC5() RC5 { c := RC5{} c.Key = make([]uint32, KeySize) c.Sub = make([]uint32, SubSize) //Conquer default key c.generateKeys([]byte{ 0x3C, 0xDC, 0xFE, 0xE8, 0xC4, 0x54, 0xD6, 0x7E, 0x16, 0xA6, 0xF8, 0x1A, 0xE8, 0xD0, 0x38, 0xBE, }) return c } func (r *RC5) generateKeys(buf []byte) { //Initialize key expansion //seedLength := len(buf) / WordSize * WordSize for i := 0; i < KeySize; i++ { r.Key[i] = binary.LittleEndian.Uint32(buf[i*4:]) } //Generate r.Sub r.Sub[0] = 0xB7E15163 for i := 1; i < SubSize; i++ { r.Sub[i] = r.Sub[i-1] - 0x61C88647 } //Generate key vector var a, b uint32 var i, j int for x := 0; x < 3*SubSize; x++ { r.Sub[i] = bits.RotateLeft32(r.Sub[i]+(a+b), 3) a = r.Sub[i] r.Key[j] = bits.RotateLeft32(r.Key[j]+(a+b), int(a+b)) b = r.Key[j] i = (i + 1) % SubSize j = (j + 1) % KeySize } } func (r *RC5) Encrypt(dst, src []byte) { length := len(src) / 8 if (len(src) % 8) > 0 { length = length + 1 } copy(dst, src) for word := 0; word < length; word++ { a := binary.LittleEndian.Uint32(dst[8*word:]) + r.Sub[0] b := binary.LittleEndian.Uint32(dst[(8*word + 4):]) + r.Sub[1] for round := 1; round <= Rounds; round++ { a = bits.RotateLeft32(a^b, int(b)) + r.Sub[2*round] b = bits.RotateLeft32(b^a, int(a)) + r.Sub[2*round+1] } binary.LittleEndian.PutUint32(dst[8*word:], a) binary.LittleEndian.PutUint32(dst[8*word+4:], b) } } func (r *RC5) Decrypt(dst, src []byte) { length := len(src) / 8 if (len(src) % 8) > 0 { length = length + 1 } copy(dst, src) for word := 0; word < length; word++ { a := binary.LittleEndian.Uint32(dst[8*word:]) b := binary.LittleEndian.Uint32(dst[(8*word)+4:]) for round := Rounds; round > 0; round-- { b = bits.RotateLeft32(b-r.Sub[2*round+1], -int(a)) ^ a a = bits.RotateLeft32(a-r.Sub[2*round], -int(b)) ^ b } binary.LittleEndian.PutUint32(dst[8*word:], a-r.Sub[0]) binary.LittleEndian.PutUint32(dst[8*word+4:], b-r.Sub[1]) } } func BlockSize() int { return 8 }
  9. W1cked

    RC5 Package - Go

    Thanks! I use Goland, but I don't think I have golint on it. Thank you for the tip!
  10. W1cked

    Go RC5 Cipher Problems

    Nevermind, I was nowhere close. I’ll repost when I make changes.
  11. W1cked

    Go RC5 Cipher Problems

    For future visitors, you can find the completed and functional code at
  12. W1cked

    Go RC5 Cipher Problems

    Using your Comet source I was able to get the Decrypt up and running! Thank you. Question about the Encrypt though. It appears that L112 will throw an OutofRange exception. https://gitlab.com/spirited/comet/blob/master/src/Comet.Network/Security/RC5.cs#L112 Is there a reason why dst is made into a new byte array an eight of the size of the src array?
  13. W1cked

    Legacy TQ Cipher - Optimized Library

    Thanks Cpt! I’ve been using your Cops source for reference on my 5017 Go project! Your source is definitely a lot cleaner and easier to follow than a lot of sources.
  14. W1cked

    Go RC5 Cipher Problems

    5017
  15. W1cked

    Go RC5 Cipher Problems

    I'm not very well versed in C#, so some of the things I was porting I took guesses on. Everything compiles, but the resulting bytes are definitely not correct. For password "test" I get 45 253 45 253 0 0 0 0 0 0 0 0 0 0 0 0 as a result after RC5 "decrypt" Also, I can rewrite this to fit the cipher interface. I do like that, and it is more "idiomatic" than mine is by far. package rc5 import "errors" const ( RC5_PW32 = 0xB7E15163 RC5_QW32 = 0x61C88647 RC5_32 = 32 RC5_12 = 12 RC5_SUB = RC5_12*2 + 2 RC5_16 = 16 RC5_KEY = RC5_16 / 4 ) type RC5 struct { mKey [RC5_KEY]uint32 mSub [RC5_SUB]uint32 } /// CO2: { 0x3C, 0xDC, 0xFE, 0xE8, 0xC4, 0x54, 0xD6, 0x7E, 0x16, 0xA6, 0xF8, 0x1A, 0xE8, 0xD0, 0x38, 0xBE } func NewRC5(seed []byte) (RC5, error) { c := RC5{} if len(seed) != 16 { return c, errors.New("seed does not have expected 16 bytes") } for z := 0; z < RC5_KEY; z++ { c.mKey[z] = uint32(seed[z]) } c.mSub[0] = RC5_PW32 for i := 1; i < RC5_SUB; i++ { c.mSub[i] = c.mSub[i-1] - RC5_QW32 } i, j, x, y := uint32(0), uint32(0), uint32(0), uint32(0) count := 3 * Max(RC5_KEY, RC5_SUB) for k := 0; k < count; k++ { c.mSub[i] = rotl(uint32(c.mSub[i]+x+y), 3) x = c.mSub[i] i = (i + 1) % RC5_SUB c.mKey[j] = rotl((c.mKey[j] + x + y), x+y) y = c.mKey[j] j = (j + 1) % RC5_KEY } return c, nil } func (rc *RC5) Decrypt(buf *[]byte, length int) { leng := length / 8 for k := 0; k < leng; k++ { lv := uint32(buf[2*k]) rv := uint32(buf[2*k+1]) for i := RC5_12; i >= 1; i-- { rv = rotr((rv - rc.mSub[2*i+1]), lv) ^ lv lv = rotr((lv - rc.mSub[2*i]), rv) ^ rv } buf[2*k] = byte(lv - rc.mSub[0]) buf[2*k+1] = byte(rv - rc.mSub[1]) } } func rotl(aValue uint32, aCount uint32) uint32 { leftShift := uint32(aCount % 32) rightShift := 32 - leftShift return (aValue << leftShift) | (aValue >> rightShift) } func rotr(aValue uint32, aCount uint32) uint32 { rightShift := uint32(aCount % 32) leftShift := 32 - rightShift return (aValue >> rightShift) | (aValue << leftShift) } func Min(x, y int) int { if x < y { return x } return y } func Max(x, y int) int { if x > y { return x } return y }
  16. W1cked

    Go RC5 Cipher Problems

    Hey Spirited, that’s actually what I tried to use initially. Then i tried to port CptSky’s but I think I was way off. I’ll post it again. As for the Go package you posted, would it not work directly? I tried using it directly, but perhaps I was doing something wrong?
×

Important Information

By using this site, you agree to our Terms of Use.