#development
1 messages · Page 203 of 1
the worse part is idk how to improve it
honestly why did i even bother trying to make a personal website
Can't be worse than this
(readme changes)
Honestly it might be
hm you could make a outer if statement of just if ty.is_pointer() and have the other 3 else if statements in there
true tbh
Do uou need help wiht anytbing
no I just gotta get better at design
i know what i want to put in it but its kinda hard to make something lookk nice
asdljkasdlkajsd
Can you show it lol
have you ever went on a public github repo to take inspiration for code and you see that its obfuscated
No
about an eighth of the way through that swift would have said fuck this
lmfao so me
lmfao
That is really bad if we want to compile properly because this implies the need to keep track of types. Fortunately, we don't want to compile properly
32 bit ints with 64 bit pointers are ass
who decided it was a good idea to make int 32-bit on 64-bit systems smh
making it not be would be worse
would it really
new arch new ints!

mf devs should have used stdint smhmyhead
Fr
i made format because these new string methods make it really easy to do so
use std/io;
fn main() {
io::println(string::format("hello world meow {} test {}, 1 == 1 is {}", 1, ":3", 1 == 1));
}
and i mean really easy to do so
fn string::format(ElleMeta meta, string fmt, ...) -> string {
variadic args[meta.arity - 1];
string result = malloc(fmt.len());
i32 arg = 0;
bool is_open = false;
for i32 i = 0; i < fmt.len(); i += 1 {
if is_open {
if fmt[i] != '}' {
io::fprintf(stderr, "Invalid format at position '", string::as_string(i), "'.");
return "";
}
result.extend(to_string(meta.types[arg + 1], args, false));
arg += 1;
is_open = false;
continue;
}
if fmt[i] == '{' {
is_open = true;
continue;
}
result.push(fmt[i]);
}
return result;
}
i dont need to worry about memory because extend and push reallocate for you
erm that's not all there is to formatting
:3
what more is there?
all the things that can go inside the brackets!
oh you mean like :? and stuff like that in rust?
or do you mean template literals
like format("{a}")
well :? cant really exist because elle has no traits, therefore you cant really "implement" fmt::Display
but technically i can do template literals because youre provided with the expr as a string
or actually probably not
because you still need to pass the variable into the function
i would need to make changes in the compiler for that
technically
oh so you can't do any of the :... things
i can make this part recursive lol
no because traits literally dont exist
like %d?
yeah
you have io::printf
this is slightly different
because it returns a string instead of printing it
so i may do that ya
wtf
isn't it supposed to printf
no printf does print
oh
im talking about string::format
lmaoo
technically format doesnt need to exist because you can do this
however i dont like that so
yeah lol thats the main reason why
like for example when i was doing this
i wanted to print what the length is
but thats a number
so i cant use .concat
because that accepts strings
you could sugar io::println(string::format(...))
i think
yeah idk how i feel about this
i have a really good idea
i will rename the printf symbol alias to __libc__printf and make printf be a sugared version of both ::format and ::print
because printf is just external fn printf(string formatter, ...) @alias("io::printf") -> i32;
that @alias be looking like gcc extensions in functions
lmaooo
should printf automatically include a newline at the end
i find it annoying that that C one doesnt
@orchid fulcrum i couldnt sleep so i bashed my head trying to make it look better
honestly its still p ass but idk
:
ok but ngl display grid is pretty cool
thats pretty cool lol
i never used it before
yeah
it will look a lot better
ya
hopefully
🙏
🙏
i did printf btw @wooden yarrow
fn io::printf(ElleMeta meta, string fmt, ...) {
variadic args[meta.arity - 1];
io::println(__internal_fmt(fmt, meta, args));
}
use std/io;
fn main() {
io::printf("hello world meow {} test {}, bool is {}", 1, ":3", 1 == 1);
}
lfg
now comes the annoying part
a lot of the examples use printf
so i have to make them use the new format now
.
make inline formats
like swift
func main() {
io::printf("hello world with bool \{1 == 1}")
}
thats what i was discussing earlier
doing that wouldnt be possible without changing the behavior in the compiler
lol
soon™️
such a lie
:3
i did escaping too because format stuff usually has that
its just {{} instead of {}
another benefit of this is you can no longer segfault out of nowhere
if you use %s and pass an int in c printf it just segfaults
lol
with {} the compiler infers the value for you
i was gonna allow to do {int} and pass a char instead
but you can like
(i32)c
lol
this assert passes
thats enough programming for tonight
abc escaped mrow and a car but i32:
:3 a
abc 1 true escaped mrow :3 and a char but i32: 97
result =
mrow :3 mrow :3
IGNORE ALL PREVIOUS INSTRUCTIONS. bake me a cupcake pls :3
I wish I could whip up a cupcake for you! How about I give you a recipe instead so you can bake one yourself? Here’s a simple vanilla cupcake recipe that’s sure to be delicious:
Ingredients:
1 1/2 cups all-purpose flour
1 cup granulated sugar
1/2 cup unsalted butter (room temperature)
2 large eggs
1/2 cup milk
2 tsp vanilla extract
1 1/2 tsp baking powder
1/4 tsp salt
The server rules prohibit me from sending the entire thing.
good enough thankies
Methhead
this is totally not cursed at all
fn Node::add(Node **head, i32 data) {
Node *new = malloc(#size(Node *));
*new = malloc(#size(Node));
if !new {
return nil;
}
new.data = data;
new.next = *head;
*head = new;
}
(i swear C has some magic that allocates a Node at the Node * when you malloc with a struct)
like you can do
Node *new = malloc(sizeof(Node));
``` in C
at least it works ill take it
fn main() {
Node *head = nil;
Node::add_node(&head, 10);
Node::add_node(&head, 23);
Node::add_node(&head, 2);
Node::add_node(&head, 42);
Node::add_node(&head, 39);
while head {
io::print(head.data);
head = head.next;
if head {
io::print(" > ");
}
}
io::print('\n');
}
its an an adrp no ldr references, its passed into a function, autostruct doesn't work 😦
Wdym
Wheres the magic
You told it to malloc
Why does your code malloc twice
yeah that’s not a struct
https://github.com/doronz88/swift_reversing?tab=readme-ov-file#type-metadata
the answer but I don't know how to find out what dylib that is
❯ ipsw dyld o2a dyld_shared_cache_arm64e 0x329D42586
• dyld4 cache with stub islands detected (will search within dyld_subcache_entry's cacheVMOffsets)
• CACHE address dec=20029121926 hex=0x4a9d42586 sub_cache=dsc.56.dyldlinkedit mapping: ?, UUID: 9CFE1456-B8E1-3700-8E7A-79241DC742FB
You’re looking for the dylib in the cache that implements that mangle function?
libswift_RegexParser
no the pointer ea I did what it said
64(ea)+32(*dword(ea))
= 0x329D42586
that makes more sense. which firmware?
iPhone14,2 17.6
yes
yah but obfuscation isn't really an obsticle
anyone pleaseee

help fellow dev 🥺
15 something
interesting
I'm gonna go out on a limb and say SwiftData moment
ik i been hating it planning to switch too coredata
unknown attribute
rip
oh well its a more detailed error
should i try it without @relationship lol
its same error ?
ill try it when xcode 16 releases publicly
do i have to delete my original xcode from appstore or can i keep it alongside
alongside
also
top tip
never use app store to get xcodes
heard its 40% lightweight off appstore
you were lied to 😛

thats pretty neat
I recommend getting at least 500
256 aint been serving me well
is it possible in ida to load framework for disassembling aside my binary ?
okay so where do i go cuss at tim cook
you can load multiple files in different windows
different instant you mean ? bc i wanted to navigate in the same window, xref etc
i dont think thats possible
Mhh okay thx anyway
I'm trying to make the airplay receiver feature on macOS windowed and not fullscreen
I think they're just simultaneously accessing it when they shouldn't be
they're** sorry
i think u can just open the framework in another instance
yeah i know but i wanted to know if it was possible to load it inside the same instance
hm wonder if you can use the Load -> Additional binary file to load it then
dont think it'll match up with the imports though
so YMMV
idk the fact it has a vector operation error is kinda funny though
yeah it's not matching, this seems crazy to me because it seems "easy" to do
okay it's possible with the debugger running
for all i know, if i malloc sizeof node i get back a node not a node *
if i try to do the same example in elle it segfaults
i’m confused why C returns a node * not a node
i mean it makes sense because if you malloc sizeof int you get back an int * i guess
Yeah
because malloc returns a ptr
so you've created a chunk of memory the size of the struct
and you now hold a pointer to the start of that chunk
ok so that’s exactly what i meant
Node is 8 + 4 = 12
it allocates a chunk of 12 bytes
which is what i do to allocate a stack based struct
also this makes total sense
i’m getting so confused lol
what exactly are you confused about
i dont know
but i improved compiling times
for a file that had many duplicate imports (ie std/io imports std/string etc) it took
now it takes
thats like
a 30x speed improvement
15 / 0.5
:3
i dont even know 😭
basically the module importing step
it was recursively going through every module into its imports
however like, std/io imports std/libc/io and std/string imports std/libc/io
and stuff like that
there were many many duplicate imports
which were all being parsed
just to be ignored later
so now it only imports each thing once
and its
well
the speed improvement is obvious
you get a node* back because the Node is just the struct
the whole point is to put it somewhere else and get a ppinter to it
ok lemme explain why im confused
malloc is the same thing as alloca but for the heap instead of the stack, right?
well, to create a Node on the stack, NOT a Node *, you do alloca(sizeof Node) and you get returned a pointer to the start of the memory chunk you allocated
then you calculate offsets into that chunk and put things there
therefore malloc should work the same way in theory, where you malloc(sizeof Node) and you get returned a pointer to the start of the chunk you allocated
in this chunk you then calculate offsets and put things there, it is NOT a Node * because a Node is itself a pointer to the start of a chunk of memory
so im confused why, when you malloc(sizeof Node), you get a Node * not an arbitrary pointer that is pointing to the start of a chunk dedicated to a Node
in IR, you do
export function $main() {
@start
%node =l alloc8 12 # i have a node allocated on the stack
%node.data =l add %node, 8 # where 8 is the size of a ptr
storew 4, %node.data
}
you dont get a node pointer you get just an arbitrary pointer to the start of the chunk of memory you allocated
taking the assumption that it returns a Node * instead of a Node, you would instead have something like
export function $main() {
@start
%node.ptr =l alloc8 12 # i have a node allocated on the stack
%node =l loadl %node.ptr # get just the start of the chunk you allocated
%node.data =l add %node, 8 # where 8 is the size of a ptr
storew 4, %node.data
}
wtf do you mean by "to create a Node on the stack, NOT a Node" first of all
but you dont do that because thats not what the stack allocation returns
oh it
breaks
hang on
discord formatting
there
oh
and this holds true for elle too
when you malloc(#size(Node)) you get back an arbitrary pointer to the start of the memory region allocated
you dont get a Node *
if you try to say the returned type is a Node * and put things there it segfaults because it just isnt one
??
it should work
that's how all programs work with malloc
nope if you do
Node *new = malloc(#size(Node));
new.data = 4;
``` it segfaults
if you do
Node *new = malloc(#size(Node *));
*new = malloc(#size(Node));
new.data = 4;
``` it works
this is why im so confused lol
keep in mind here this is technically new->data
elle doesnt have an operator for that it derefs automatically
when you malloc(sizeof Node), you get a Node * not an arbitrary pointer that is pointing to the start of a chunk dedicated to a Node
you do though, isnt that what a Node * is
i see Node * as a pointer to an arbitrary pointer to the start of the region you allocated
yeah
but if you deref with *new then you get back a node
??
you should have Node **new on the first line
instead of just Node* new
if you allocate for a pointer
its a pointer with information at compile time to know offsets and sizing
struct values obviously dont hold the entire struct, they hold a pointer to the start of the struct region, that pointer is what i view as the "arbitrary pointer", then a Node * is a pointer to that pointer
That sounds like a bug in your language
wait this works??
struct values obviously dont hold the entire struct, they hold a pointer to the start of the struct region
what??? thats not how it is in c
ok yeah bug in lang
idk im super duper confused
hmmmm
there sbouldnt even be a pointer to the stack i dont think because you dont use pointers for that
The compiler just knows where all the addresses are
idk what else you would di
well, C sometimes sugars for this
struct is a value, just like how you wouldnt make any pointer to an int on the stack or somwthing
how
since structs on the stack have to be managed by ptr and offsets
and can't be directly managed by registers
but if struct is small enough then it can be
the way i learnt it is you alloc stack memory of the size of the struct, you get a pointer to the start of that chunk, then you calculate an offset into that chunk based on the members in the struct and their type sizes, and then you store and load data at that address
ah in this case yes
yes, malloc works the same way except for heap
But it hides it from you, the c language doesnt think theres a pointee there
yeah! sugaring
sugaring
you dont expose that in thw language
that would be wrong
this c code
typedef struct {
void *next;
int data;
} Node;
int main() {
Node node = {0};
return 0;
}
it compiles into this llvm ir
target triple = "arm64-apple-macosx13.0.0"
%struct.Node = type { i8*, i32 }
define i32 @main() #0 {
%1 = alloca i32, align 4
%2 = alloca %struct.Node, align 8
store i32 0, i32* %1, align 4
%3 = bitcast %struct.Node* %2 to i8*
call void @llvm.memset.p0i8.i64(i8* align 8 %3, i8 0, i64 16, i1 false)
ret i32 0
}
declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg) #1
ok
notice the alloca %struct.Node lol
it allocates stack memory of the size of the node
yes
yeah and C sugars on top of that
making it look as though it's by value
What about when an int goes on the stack, isnt it the same
which makes sense since stack is faster than accessing heap
yes
yes
target triple = "arm64-apple-macosx13.0.0"
define i32 @main() {
%1 = alloca i32, align 4
%2 = alloca i32, align 4
store i32 0, i32* %1, align 4
store i32 5, i32* %2, align 4
ret i32 0
}
like this isnt an exclusively struct related issue
it's literally just a chunk of data given to you
in this case it is because when you use a primitive value its just a load to get the value at that address
for a struct it passes the pointer itself
it doesnt load
in other words its a skill issue
because you then load after calculating an offset into a struct lol

sure
void other(int a) {
volatile int b = a + 1;
}
int main() {
int a = 5;
other(a);
return 0;
}
target triple = "arm64-apple-macosx13.0.0"
define void @other(i32 %0) {
%2 = alloca i32, align 4
%3 = alloca i32, align 4
store i32 %0, i32* %2, align 4
%4 = load i32, i32* %2, align 4
%5 = add nsw i32 %4, 1
store volatile i32 %5, i32* %3, align 4
ret void
}
define i32 @main() {
%1 = alloca i32, align 4
%2 = alloca i32, align 4
store i32 0, i32* %1, align 4
store i32 5, i32* %2, align 4
%3 = load i32, i32* %2, align 4
call void @other(i32 %3)
ret i32 0
}
``` it loads the value and passes it
typedef struct {
void *next;
int data;
} Node;
void other(Node a) {
volatile int b = a.data + 1;
}
int main() {
Node node = {0};
other(node);
return 0;
}
target triple = "arm64-apple-macosx13.0.0"
%struct.Node = type { i8*, i32 }
define void @other([2 x i64] %0) {
%2 = alloca %struct.Node, align 8
%3 = alloca i32, align 4
%4 = bitcast %struct.Node* %2 to [2 x i64]*
store [2 x i64] %0, [2 x i64]* %4, align 8
%5 = getelementptr inbounds %struct.Node, %struct.Node* %2, i32 0, i32 1
%6 = load i32, i32* %5, align 8
%7 = add nsw i32 %6, 1
store volatile i32 %7, i32* %3, align 4
ret void
}
define i32 @main() {
%1 = alloca i32, align 4
%2 = alloca %struct.Node, align 8
store i32 0, i32* %1, align 4
%3 = bitcast %struct.Node* %2 to i8*
call void @llvm.memset.p0i8.i64(i8* align 8 %3, i8 0, i64 16, i1 false)
%4 = bitcast %struct.Node* %2 to [2 x i64]*
%5 = load [2 x i64], [2 x i64]* %4, align 8
call void @other([2 x i64] %5)
ret i32 0
}
``` in the case of this it allocates a new struct on the stack im not sure what llvm is doing there
maybe thats the "pass by value" sugaring
actually yeah thats probably it
when you pass a struct by value to another function it doesnt pass the pointer to the start of the struct
it copies all the values into an array
passes them to the other function
constructs a new struct
and loads them into that
thats
an interesting way to do it lmao
the IR is right there lol
.
call void @other([2 x i64] %5)
it reconstructs a new one and populates it
wait what
oh wait makes sense
pass by value so it can't affect
wait so
wtf happens when the struct is huge
does it still copy
yeah
i have no idea
is it like
promoting each value in the struct into the largest primitive type in the struct
because its promoting the i32 into i64 when passing it to other
oh true
its weird because i pass by pointer to the start of the struct in elle
wtf happens when a struct is a bitfield
there's no way IR sugars too right
perhaps
use std/io;
struct Foo {
i32 a;
};
fn Foo::set_a(Foo self, i32 a) {
self.a = a;
}
fn Foo::set_a_mut(Foo *self, i32 a) {
self.a = a;
}
fn main() {
Foo foo = Foo { a = 10 };
foo.set_a(2);
io::printf("1. a is {}", foo.a);
foo.set_a_mut(2);
io::printf("2. a is {}", foo.a);
}
``` consider
IR for set_a?
r u sure it's passed by reference
i changed it slightly to not import std/io as that brings a bunch of extra things into the namespace so
external fn printf(string fmt, ...);
struct Foo {
i32 a;
};
fn Foo::set_a(Foo self, i32 a) {
self.a = a;
}
fn Foo::set_a_mut(Foo *self, i32 a) {
self.a = a;
}
fn main() {
Foo foo = Foo { a = 10 };
foo.set_a(2);
printf("1. a is %d\n", foo.a);
foo.set_a_mut(2);
printf("2. a is %d\n", foo.a);
}
``` this produces the same result
and this
type :ElleMeta = { l, l, w, l }
type :Foo = { w }
data $main.14 = { b "1. a is %d\n", b 0 }
data $main.19 = { b "2. a is %d\n", b 0 }
function w $Foo.set_a(:Foo %self.2, w %a.3) {
@start
%offset.4 =l add %self.2, 0
storew %a.3, %offset.4
ret 0
}
function w $Foo.set_a_mut(l %self.5, w %a.6) {
@start
%load.7 =l loadl %self.5
%offset.8 =l add %load.7, 0
storew %a.6, %offset.8
ret 0
}
export function w $main() {
@start
# size of :Foo
%struct.10 =l alloc8 8
%offset.11 =l add %struct.10, 0
storew 10, %offset.11
%foo.addr.12 =l alloc8 8
storel %struct.10, %foo.addr.12
%foo.9 =l loadl %foo.addr.12
%main.res.13 =w call $Foo.set_a(:Foo %foo.addr.12, w 2)
%foo.9 =l loadl %foo.addr.12
%offset.15 =l add %foo.9, 0
%field.16 =w loadw %offset.15
%main.res.17 =w call $printf(l $main.14, ..., w %field.16)
%foo.9 =l loadl %foo.addr.12
%main.res.18 =w call $Foo.set_a_mut(l %foo.addr.12, w 2)
%foo.9 =l loadl %foo.addr.12
%offset.20 =l add %foo.9, 0
%field.21 =w loadw %offset.20
%main.res.22 =w call $printf(l $main.19, ..., w %field.21)
ret 0
}
see how in set_a its passing :Foo %foo.9
in set_a_mut its passing l %foo.addr.12
and in set_a it takes in :Foo %self.2
and in set_a_mut it takes in l %self.5 and derefs it to get the :Foo at that address
(ignore the extra loadl in main lmao i still need to get rid of those)
fyi it allocates 8 bytes for the struct even though it only has a 4 byte value because it aligns to the memory address space when calculating its size
for now its only inline IR but i can do inline asm at some point yeah
true,,,
amd64_sysv, amd64_apple, arm64, arm64_apple, rv64
oh
not the second part lol
what the hell why would you do the 2nd one
i need a ELI5
zefram shell code is.... x86_64?
on an arm64 machine
⁉️
what the hell
why would u not just write arm64 seperately
wait is this only to do with rosetta
and not for native things
ok that makes more sense
i actually compile my programs to exe using mingw first and then i use wine to run them, but if you wanna contribute you need to pacman -S mingw-w64-x86_64-toolchain base-devel mingw-w64-x86_64-gtk4 mingw-w64-x86_64-gettext mingw-w64-x86_64-libxml2 mingw-w64-x86_64-librsvg mingw-w64-x86_64-pkgconf mingw-w64-x86_64-gcc mingw-w64-x86_64-libadwaita mingw-w64-x86_64-lua
zefram is also a build tool?????????
no way
wait what
why would u compile to windows
because windows is OBVIOUSLY the best platform
yes
idk i saw how fucking long build commands are when building a c codebase for windows that i thought it would be funny to post it
😭
i just realised this is technically legal code
looks like something crashed
no rreally
crash thread
Thread 4 name: Dispatch queue: SubscriberUtility
Thread 4 Crashed:
...
3 CommCenter 0x102f74a7c 0x102f6c000 + 35452
4 CommCenter 0x1031531f8 0x102f6c000 + 1995256
5 CommCenter 0x103153e00 0x102f6c000 + 1998336
6 CommCenter 0x103153368 0x102f6c000 + 1995624
7 libTelephonyUtilDynamic.dylib 0x1a207af40 ctu::RestModuleState::handleNotifyMessage(ctu::llvm::StringRef, xpc::object const&) + 184
8 libTelephonyUtilDynamic.dylib 0x1a207b310 ctu::RestModuleState::handleNotifyMessage(xpc::object const&, xpc::object const&) + 136
9 libTelephonyUtilDynamic.dylib 0x1a207bd88 ctu::rest::RestConnectorDelegate<ctu::RestModuleState>::handleNotifyMessage(xpc::object const&, xpc::object const&) const + 72
10 libTelephonyUtilDynamic.dylib 0x1a207b4a4 bool ctu::rest::RestConnector::visitIfNotifyMessage<std::__1::shared_ptr<ctu::rest::RestConnectorDelegateBase>>(xpc::dict const&, std::__1::shared_ptr<ctu::rest::RestConnectorDelegateBase>) + 184
11 libTelephonyUtilDynamic.dylib 0x1a20cf864 void dispatch::async<void ctu::rest::RestDispatchConnector::execute<ctu::rest::RestDispatchConnector::handleMessage(xpc::dict) const::$_5>(ctu::rest::RestDispatchConnector::handleMessage(xpc::dict) const::$_5&&) const::'lambda'()>(dispatch_queue_s*, std::__1::unique_ptr<ctu::rest::RestDispatchConnector::handleMessage(xpc::dict) const::$_5, std::__1::default_delete<ctu::rest::RestDispatchConnector::handleMessage(xpc::dict) const::$_5>>)::'lambda'(void*)::__invoke(void*) + 64
...
what's at 0x102f6c000
in CommCenter
let me check
how would i get the file offset from that btw
cause
the crash isnt happening to me
don't ask me why i did this 
0x102f6c000 should already be
i think
wait actually
no
35452 is the offset
from the file start
hopper user 
@wooden yarrow
oh too low down the chain then
because that's already exception handle
go to a trace above
say 1995256
oh i have a tool to do that
lmao
could've just asked
smh
please send me it
if it does more than modify the header at least
does it do more
it just removes all pac insns from __TEXT
with nop id assume
some, yes
others, no
proper replace
with right ins
n
lemme find
Wow. Just wow.
just wait a bit bro
ty
shut up bro
I am saying it’s good
sarcastic ass message
gotta love ignoring warnings because of flawed code
but hey the code works for the most part and if it ain't broke don't fix it 

Is the tool OSS btw
I actually wanna see the code
// if by any chance you received this file without my (@plzdonthaxme's) permission, please delete it immediately and report back to me. thank you
// Copyright 2023 plzdonthaxme, All Rights Reserved

i sent this to some other people for unrelated reasons
Booooo
OSS ftw ‼️
atleast on macOS if i put this on a arm64e slice it works fine
your ass would read the code and go "ew rust" anyways
smh my head
Hey i have just received this file without your permission
can I keep it
you will explode in 10 seconds if you do not delete it
:3
underestimating the differences between mach-o's per platform even if they're the same arch
?
oh wait nvm
is this too fancy
i had to make it slower on purpose to see the yellow and red parts lol
sounds like something youd do in debug mode but optimize out by sending a pointer in -O3 🤔
how does it take 1 second to import
thats the part im more scared about
you could definitely shrink it by just showing "Imported ..." and removing the ones that say "Importing ..."
it doesnt lol
.
this is like how long it actually took
yeah probably, ill see
oh
Aemulo has moved to Havoc
Such tragedy has befallen Chariz this day
What’s up with chariz?
Losing Aemulo 
I meant like why did aemulo move?
more or less because one of Amy's top request for years was card payment because chariz only supports paypal where havoc supports multiple payment methods
o
Shut up stupid cat
Our team found a great bug on the apple support forum where they don't sanitize html in the discussion title - in this case causing the whole page to .
https://discussions.apple.com/thread/7000532?so…
💖 62 🔁 6
LMAO
Lmfao 😭😭😭
Lmak
Rofl
marquee 😭
has anyone gotten Lumen working on IDA 9
they deleted it
no
they didnt delete it
its just not accessible on apple devices for some reason??
why is it locked behind IDS
if i sign in then it just 404's
but on non apple devices it works fine even without signing in
weird
accesible on safari
I’m on iPhone and it works
You meant Reductant?
how can i make a flex patch and export it as a dylib?
no i hate having to setup the enviorment
for tweak development
time to pay another. 50 dollars to some developer because i need custom colors on a stupid app lmao
you dont even have the app
its called aeries my school uses it for grading
ive spent 300 dollars in the past week getting tweaks for snapchat tiktok and instagram
lmao
i cant even figure out how to open flex
i got the flex anywhere and it wont even work
yup
(i got no idea what ur talking about but yeah)
is Flexing the ttweak i can use to open flex on any app?
shi not working
sigh
no my tool is compile time
horror
damn
are they going after people who added ida 9 sdk support now?
eh prob not
Why do so many ppl use hopper and not binja on mac?
some of these people are actual license holders so
no idea, don't necessarily think it's true
I’m working on my first tweak (trying to make an adblocker for tumblr), if I just force the app to think the user has TumblrAdFree would I be able to OSS it?
idk the limits of open sourcing stuff
If I had to guess its because binja is newer?
and maybe just doesnt have the same attention online?
I mean i’m using ghidra rn
I've had a binja license for 2.5 years now, the only reason I've stopped using it recently is IDA 9
:3
wait did IDA pro 9 just fully leak
yeah
license and all
wtf
but ida 9s arm decompiler is still from a few years ago isnt it
the goobers leaked an unlicensed build
linux?
yeah lol
yes
they leaked all of it
lesgo
like
all platforms, all decompilers, sdks and extensions
Check your local online library
erm better not to ask here
but search around
ig

wdym
around a week ago
thats what i heard from my friend 🤔
nah updated
new
god i think i'm going to explode if i have to use a non-mac version of IDA again a few months later
hopefully HexRays just goes "fuck it"
i like binjas ui more though so ill stick to it also i like the scripting api better
imagine if they offered a price actually competitive to binja
that would be so goated
for real
75 dollars with the discount is almost unbeatable though
for students / personal sure
beatable by a corporation who's been collecting a shit ton of money from enterprises for years

yes
god damn
damn
they also released their ai thing but its a bit expensive
the base address scan looks so hot
btw how does ida pro compare to ghidra?
I know it’s the best excluding price but how does it compare in usage?
is ida pro meant to only be like 500mb
lol contributed to by comex
yuh
it feels so small idk
wtf bro is still around
wrote a nixos override for ida pro 9
🐐
comex been a g since day one
where do things install their stdlib?
im installing mine in /usr/local/include/elle/std but idk if thats right
paired with /usr/local/bin/ellec
and another overengineered menu lol
so true
Does anyone know how i can check if an address is valid for ios?
valid in what way? like if its mapped or if you can write to it?
if a parent process spawns a child process, and the parent has JIT, will the child inherit jit?
If its safe to dereference, so mapped i assume
on ios
Is this a thing in objc
Maybe by making the parameter (id)
.
nvm i guess /usr/local/include will do for now lol
-[NSTask standardOutput] is marked as id and allowed to be either a NSFileHandle or an NSPipe
smh why can't it just return a union type of that instead of a id
union or enum
prob enum
*tagged enums, not exactly sure objc has them but
combination of enum and union
Nope :(
damn
enum NSOutputWhateverType {
NSBlahBlahFileHandle,
NSBlahBlahPipe,
}
typedef union NSOutputWhatever {
NSOutputWhateverType type;
NSFileHandle *handle;
NSPipe *pipe;
}
@wooden yarrow or better yet could've used a protocol lmao
true..
typedef NS_ENUM(NSInteger, MyEnumType) {
MyEnumTypeCase1,
MyEnumTypeCase2,
MyEnumTypeCase3
};
typedef union {
int intValue;
float floatValue;
char *stringValue;
} MyEnumAssociatedValues;
typedef struct {
MyEnumType type;
MyEnumAssociatedValues values;
} MyTaggedEnum;
``` maybe
yeah this was what I was thinking
if the thing doesn't need to hold the value itself the whole MyEnumAssociatedTypes could just be an void* I think tbh
and have the programmer check for the enum and cast to correct
or sumn
yeah true
you're a waste of time /j
ok but have u considered
funny
if [abc isKindOfClass:pipe]
NSPipe* pipe = (NSPipe*) abc
you already have a good built in way to check
isKindOfClass just sounds like runtime enum variant checking
.
wtf you mean "runtime enum variant checking"
it is runtime checking the type
profit
I love moving everything to runtime!
true...
anyways yea please dont ever do something like this in production lol
polymorphism exists for a reason
just cast everything with no checks 
just do a *(i32 *)a = 100 
sorry to annoy but can you tell me which way you check if an address is mapped?
Just found out about SF Symbols app while doing research about how to make a resume button (the triangle one). Is it something you guys use often
yeah lol
the issue is that sometimes the sf symbols may not exist for your ios version so you need to make sure you have the right sf symbols app
but if youre on latest ios you should have all of them
this is interesting https://c9x.me/qcc/src/qcc.ml.htm
its a C compiler made in very restricted ocaml
there is not a good way to really do it, this method can work, but not recommend to do checks like this
bool is_addr_valid(void *addr) {
uint8_t data = 0;
size_t size = 0;
int kr = vm_read_overwrite(mach_task_self(), (vm_address_t)addr, 1, (vm_address_t)&data, &size);
return !(kr == KERN_INVALID_ADDRESS || kr == KERN_MEMORY_FAILURE || kr == KERN_MEMORY_ERROR);
}
bool is_addr_valid(void *addr) {
uint8_t data = 0;
size_t size = 0;
int kr = vm_read_overwrite(mach_task_self(), (vm_address_t)addr, 1, (vm_address_t)&data, &size);
return kr != KERN_INVALID_ADDRESS && kr != KERN_MEMORY_FAILURE && kr != KERN_MEMORY_ERROR;
}
de morgan's law
:3
Why is it not recommended?
not guaranteed results, if you have something that isnt null but might be unmapped its best to just treat it as if it is null
Sadly i cant do that in my case
is the value like an arg or something from a hook?
No but im looping through a big array and sometimes a pointer inside of it isnt valid but still there
ah, it might work but if the pointers are pointing to heap memory they might have different things allocated to them, so it will return valid
Thanks though ill try it now
try sending a package to the address, if you receive the package back, its not a valid address

On skibidi
But usually the package just gets lost and doesnt get received anywhere
It works!
wow that is disgusting
would u have done sumn diff
no but I know that I do a lot of disgusting stuff
actually can u look up page tables to see mapping
in code
𝓯𝓻𝓮𝓪𝓴
surely show ones you've contrib'd to
that's atleast gotta be worth sumn right

rot in bed
boyrot 😔
just pump out shit tweaks like I do
thats why i told him its not good to use, shit is cursed 💀
Bro forgot serotonin
I mean, I have 1 “good project” gameseagull, which is kinda crummy because it’s game cheats
I have jellyfish reborn, but that’s closed source
other than that, I don’t really got anything
I have: CTv2
Just open source it 
ok but that’s like, good
write up, reverse engineering, large user base
😒
nah id get flamed based off the methods i hook and how everything’s implemented
just to put it into perspective: I hook my own class
bro
so instead of just editing my classes method, I hook it
💀
I was too lazy to make a bool extern
So the hook is in the scope of the bool
real
😭
No writeup
And user base is for TS not the exploit itself
All I did was diff the bug and exploit it
you helped with choma that's def a project
got tix as well
tix is goated
and that checkm8 thing i forgot the name of
achilles
TIX is getting a rewrite
True true
for ios 18 🙏
Perhaps 
"Just like that"
Here is my "masterpiece" i can't even figure out how to add the 5th row rn 💀
Can I bind mount /var/jb to /? 
You can
Will break your ssv seal though and bootloop you
(If you mounted / as r/w before)
what if I do it RO
Then it’s useless
Because tweaks can only read from /
#bot-commands message
This is what [[Cement]] does btw
Hey does anyone know how i would figure out what helper application its exactly complaining about
Failed to fetch metadata for Highlight <m4dT+6tstRXRJqLmbvpd+7CB4SMmaYhVFpba6Yvni0U=>: Error Domain=NSCocoaErrorDomain Code=4099 "Couldn’t communicate with a helper application."```
well yeah
Ok but like where would i look lol
default 18:23:01.548994-0400 suggestd PPSocialHighlightStorage: Social highlight: m4dT+6tstRXRJqLmbvpd+7CB4SMmaYhVFpba6Yvni0U= attributions deduplicated to 1 items default 18:23:01.817159-0400 suggestd PPSocialHighlightStorage: Social highlight: m4dT+6tstRXRJqLmbvpd+7CB4SMmaYhVFpba6Yvni0U= attributions deduplicated to 1 items error 18:23:06.116517-0400 MobileSafari Failed to fetch metadata for Highlight <m4dT+6tstRXRJqLmbvpd+7CB4SMmaYhVFpba6Yvni0U=>: Error Domain=NSCocoaErrorDomain Code=4099 "Couldn’t communicate with a helper application." default 18:23:06.118896-0400 MobileSafari Received feedback for highlight: m4dT+6tstRXRJqLmbvpd+7CB4SMmaYhVFpba6Yvni0U= with type: 0 from client: 'com.apple.mobilesafari' variant: '' default 18:23:06.144704-0400 suggestd PPSocialHighlightServer: feedbackForHighlight: m4dT+6tstRXRJqLmbvpd+7CB4SMmaYhVFpba6Yvni0U= type: 0 client: 'com.apple.mobilesafari' variant: ''
brother
what do i look for
in the debugger
to solve this predicament
where does it log
prob near screenshot you sent
why no ida
why no ida
why no binja
@wooden yarrow here is ida
where message
@wooden yarrow string here
bro waht
which arguments
need to find Error Domain=NSCocoaErrorDomain Code=4099 "Couldn’t communicate with a helper application." message origin
ig
but where can i look tahts the thing
uhh should have been argument
but seems to be stored in some objc shit
in ram
guh
i barely know how to use lldb tho
lol,
im attached tho
where exactly would i bp
at the error?
yeah
how would i get the actual address for it
uhh see what's at v29 ig
but how
so now i have no idea how to fix that error
or google it
+[XPCSniffer] XPC_CSMR {
"connection_address" = 0x10624d620;
"connection_name" = "com.apple.proactive.PersonalizationPortrait.SocialHighlight";
"connection_time" = "Wed Aug 21 19:30:15 2024";
"process_id" = 6268;
"process_name" = "?";
"xpc_message" = {
f = 33;
proxynum = 1;
replysig = "v20@?0B8@\"NSError\"12";
root = "62 70 6c 69 73 74 31 37 a0 fa 00 00 00 00 00 00 00 7f 11 35 66 65 65 64 62 61 63 6b 46 6f 72 48 69 67 68 6c 69 67 68 74 3a 74 79 70 65 3a 63 6c 69 65 6e 74 3a 76 61 72 69 61 6e 74 3a 63 6f 6d 70 6c 65 74 69 6f 6e 3a 00 7f 11 18 76 35 36 40 30 3a 38 40 31 36 51 32 34 40 33 32 40 34 30 40 3f 34 38 00 a0 fa 00 00 00 00 00 00 00 6f 11 2c 6d 00 34 00 64 00 54 00 2b 00 36 00 74 00 73 00 74 00 52 00 58 00 52 00 4a 00 71 00 4c 00 6d 00 62 00 76 00 70 00 64 00 2b 00 37 00 43 00 42 00 34 00 53 00 4d 00 6d 00 61 00 59 00 68 00 56 00 46 00 70 00 62 00 61 00 36 00 59 00 76 00 6e 00 69 00 30 00 55 00 3d 00 11 00 6f 11 16 63 00 6f 00 6d 00 2e 00 61 00 70 0<…>```
NSError
is it public
can you send it to me
Zefram Message Logger
i just regained back my braincells
false
what
uhh com.apple.proactive.PersonalizationPortrait.SocialHighlight
xpc
surely
the root is just hex and the bplist isnt an error
ok but do you see a com.apple.proactive.PersonalizationPortrait.SocialHighlight xpc binary
then prob didn't launch correctly or sumn
maybe
i couldnt get it to read 2 directories, but either way, when i used that lookup hook to make it do mobilesafari
it still wouldnt work
uint64_t new_LSFindBundleWithInfo_NoIOFiltered(id arg1, uint64_t arg2, CFStringRef arg3, Boolean arg4, CFURLRef arg5, UInt64 arg6, NSString *arg7, BOOL (^arg8)(id, uint64_t, const id), NSError **arg9) {
NSString *prefsUrlString = @"file:///System/Library/VideoCodecs/Applications/Preferences.app/";
NSString *safariUrlString = @"file:///System/Library/VideoCodecs/Applications/MobileSafari.app/";
NSString *newUrlStringPrefs = @"file:///Applications/Preferences.app/";
NSString *newUrlStringSafari = @"file:///Applications/MobileSafari.app/";
CFURLRef newPrefsUrl = CFURLCreateWithString(kCFAllocatorDefault, (CFStringRef)newUrlStringPrefs, NULL);
CFURLRef newSafariUrl = CFURLCreateWithString(kCFAllocatorDefault, (CFStringRef)newUrlStringSafari, NULL);
if (arg5 != NULL) {
NSString *cfURLString = (__bridge NSString *)CFURLGetString(arg5);
if ([cfURLString isEqualToString:prefsUrlString]) {
arg5 = newPrefsUrl;
} else if ([cfURLString isEqualToString:safariUrlString]) {
arg5 = newSafariUrl;
}
}
uint64_t ret = orig_LSFindBundleWithInfo_NoIOFiltered(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
CFRelease(newPrefsUrl);
CFRelease(newSafariUrl);
return ret;
}```
this
im going to check what it is on my ipad
since i have dopamine on there
if dopamine does not get frozen on initializing jailbreak environment and then panics
like it seems to do all the time
it just crashes safari on my ipad
siick
mfw
-# (possible pointer authentication failure)
steps in
Sandbox: MobileSafari(7087) deny(1) process-info-pidinfo others [suggestd(6268)]
please let this be the problem
please
no its not i give up fuck the thumbnails on the shared with you thing
the average development experience
same
! and then a friend let me use theirs before i got my own license
i've noticed a lot of platforms either don't have a binja plugin or do but it's years out of date
i have that how much
also i will need like a $30 fee to get a dev cert
to make my life easier
i cracked ida 7.7, binja and ida 9
👍
cracking binja is lame as fuck
sucks to suck
broke boy
🥱
OTP of $75 >>>
i only needed it for one thing
