Skip to content

[PIX-LINK A10] PIXA-123456-XXXXX protocol reversing #1

Description

@Python1320

Documenting my findings here for a camera that is likely a derivative of pppp in case a dissector can be made.

Device: Aliexpress camera https://www.aliexpress.com/item/1005006054720973.html (PIX-LINK A10)

  • has a BK7252 (verified inside, pictures pending).
  • apk can be downloaded from: https://qr01.cn/E3BMyh
  • apk name is "shix.pixlink.camera".
  • apk contains libobject_jni.so which appears to be similar to libpppp, since it contains functions such as cs2p2p_PPPP_Initialize and cs2p2p__P2P_Proprietary_Decrypt("SSD@cs2-network.",...) which appears on the internet at least here and here.
  • PPPP_SIMPLE_SHUFFLE table is the same in the apk's .so as here.
  • Default camera password is SHIX_DEFUALT_PWD = "6666" (DEFUALT is not a typo)
  • did is of format PIXA123456XXXXX

Tested on non-direct mode (aka connected to WiFi AP):

  • Traffic is different to pppp-dissector's: every packet starts with 0x9f instead of 0x2c (both directions). Opcodes do not match if the magic packet alone is changed.
  • The device keeps on broadcasting a UDP packet IP 10.0.9.44.11007 > 0.0.0.0.0: UDP, length 48 with payload starting with 0x9f 0x83 0x24 0x22 .... (payload does not change between broadcastings).
  • Simulating offline mode by blocking phone and the device prevents connecting to the device. (Speculation: maybe DNS also needs to be blocked, will keep on testing.)

Intercepted with jnitrace and frida-gadget. Phone is sending json messages to the .so for some commands (might be towards cloud, still learning jnitrace):

{"pro":"set_cypush","cmd":1,"user":"admin","pwd":"1234","pushIp":"47.106.146.11","pushPort":9093,"pushInterval":180,"cyAdmin":"admin","cyPwd":"admin123","isPushPic":1,"isPushVideo":1}
{"pro":"set_datetime","cmd":126,"user":"admin","pwd":"1234","time":1699723191,"tz":-7200}
{"pro":"get_parms","cmd":101,"user":"admin","pwd":"1234"}

Called functions according to jnitrace: PPPPMsgNotify, CallBack_H264Data, SearchResult. Likely similar SDK.

getServer() (StartPPPP?) has likely decryption key at least for some traffic:

if(strcmp("PIXA", vendorstring_or_something))
  {
    return "EIHGFNBBKAIEGEJLELHBFEELGDNNGBMIHFFMAPDMAAJEKEKPDLAJDPPKGALBIBLAAENOKNDAOFNFBICNIF:SHIX";
  }

Keys also exist for XIAODOU and MANY others.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions