nmarkro

EXE5 pack ace stuff

Mar 20th, 2021 (edited)
607
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 2.01 KB | None | 0 0
  1. .gba
  2.  
  3. .macro write_pack_byte,value
  4.     .if (value == 0x00)
  5.         ; do nothing
  6.     .elseif (value <= 0x5A)
  7.         add r2, value
  8.     .elseif (value / 2 <= 0x5A)
  9.         add r2, (value / 2)
  10.         add r2, (value / 2)
  11.         .if (value % 2 != 0)
  12.             add r2, (value % 2)
  13.         .endif
  14.     .else
  15.         add r2, (value / 3)
  16.         add r2, (value / 3)
  17.         add r2, (value / 3)
  18.         .if (value % 3 != 0)
  19.             add r2, (value % 3)
  20.         .endif
  21.     .endif
  22. .endmacro
  23.  
  24. .macro write_pack_word,value
  25.     xor r2, r2
  26.     write_pack_byte ((value >> 0x18) & 0xFF)
  27.     lsl r2, 8
  28.     write_pack_byte ((value >> 0x10) & 0xFF)
  29.     lsl r2, 8
  30.     write_pack_byte ((value >> 0x08) & 0xFF)
  31.     lsl r2, 8
  32.     write_pack_byte ((value >> 0x00) & 0xFF)  
  33. .endmacro
  34.  
  35. .macro write_pack,value
  36.     write_pack_word value
  37.     str r2, [r0, r1]
  38.     add r1, 4
  39. .endmacro
  40.  
  41. ; r0 = pointer to start of pack (+1 b/c we use r0 to jump here)
  42. ; r1 = offset added to r0, used for writing
  43. ; r2 = byte value written
  44.  
  45. .create "pack.dat", 0x02002EAC
  46.     ; r0 = 02002EA1 entering the pack
  47.     ; goal is to get 0x203F2FF in r0 (where our playload is going to start)
  48.     write_pack_word 0x0003C45E
  49.     mov r1, r2          ; can't do "add r0, r2" due to one of the opcode bytes being > 0x5A
  50.     add r0, r1          ; r0 = 02002EA1 + 0x3C45E
  51.     mov r1, 1           ; r1 is now the used as the write offset from r0
  52.    
  53.     ; start writing the actual payload
  54.     write_pack 0x4B02B5FF
  55.     write_pack 0x4D034C02
  56.     write_pack 0xE0074E03
  57.     write_pack 0x04000130
  58.     write_pack 0x00000300
  59.     write_pack 0x0203F32A
  60.     write_pack 0x70286818
  61.     write_pack 0x42203501
  62.     write_pack 0x0000D1F8
  63.    
  64.     bx r0
  65. .close
  66.  
  67. ; based on http://tasvideos.org/forum/viewtopic.php?p=491739#491739
  68. .create "payload.dat", 0x203F300
  69.     push {r0-r7, lr}
  70.     ldr     r3, =0x04000130
  71.     ldr     r4, =0x300
  72.     ldr     r5, =payload
  73.     ldr     r6, =0x08000391 ; awaitFrame function
  74.     b loop
  75.     .pool
  76.    
  77. loop:
  78.     mov lr, pc
  79.     bx r6
  80.    
  81.     ldr     r0, [r3]
  82.     strb    r0, [r5]
  83.     add     r5, 1
  84.     tst     r0, r4
  85.     bne     loop
  86.     ; pop {r0-r7, pc}
  87. payload:
  88. .align 4
  89. .close
Add Comment
Please, Sign In to add comment