Results 1 to 2 of 2

Thread: call_function_raw(), BinaryBuffer functions, dlopen/dlsym/dlclose

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Assadministrator kung foo man's Avatar
    Join Date
    Jun 2012
    Location
    trailerpark
    Posts
    2,011
    Thanks
    2,102
    Thanked 1,084 Times in 753 Posts
    Ok, a "nicer" call_function, done with CoDScript only:

    PHP Code:
    call_function(function, signatureabcdefghijkl) {
        
    args = [];
        
    args[args.size] = a;
        
    args[args.size] = b;
        
    args[args.size] = c;
        
    args[args.size] = d;
        
    args[args.size] = e;
        
    args[args.size] = f;
        
    args[args.size] = g;
        
    args[args.size] = h;
        
    args[args.size] = i;
        
    args[args.size] = j;
        
    args[args.size] = k;
        
    args[args.size] = l;
        
        
    buf memory_malloc(128);
        
    bb binarybuffer_new(buf);
        
        
    signatureClean ""// without the . (varargs-marker)
        
    for (ii=0ii<signature.sizeii++)
            if (
    signature[ii] != ".")
                
    signatureClean += signature[ii];
        
        
    signature_pos 0;
        for (
    ii=0ii<args.sizeii++) {
            
    //printf("ii=% type=%\n", ii, getType(args[ii]));

            
    needGuessType ii >= signatureClean.size;
            
    //printf("ii=%, sigClean.size=% needGuessType=%\n", ii, signatureClean.size, needGuessType);
            
    if ( ! needGuessType) {
                
    // don't guess type when it's given in signature
                
    binarybuffer_write(bbsignatureClean[ii], args[ii]);
                continue;
            }
            
            
    type "";
            switch (
    getType(args[ii])) {
                case 
    "INT":    type "i"; break;
                case 
    "STRING"type "s"; break;
                case 
    "FLOAT":  type "f"; break;
            }
            
    signature += type// only add missing types to signature
            
    binarybuffer_write(bbtypeargs[ii]); // add data with our guessed type
        
    }

        
    //printf("Function: % Signature: %\n", function, signature);
        
    ret call_function_raw(function, signaturebuf);
        
        
    memory_free(buf);
        
    binarybuffer_free(bb);
        
        return 
    ret;

    Call like:

    PHP Code:
        call_function(libc_printf"s.""hi!!! int=%d float=%f string=%s\n"1230.345"yo"); 
    Output (with debug messages):

    Code:
    ii=0 type=STRING
    ii=1 type=INT
    ii=2 type=FLOAT
    ii=3 type=STRING
    ii=4 type=UNDEFINED
    ii=5 type=UNDEFINED
    ii=6 type=UNDEFINED
    ii=7 type=UNDEFINED
    ii=8 type=UNDEFINED
    ii=9 type=UNDEFINED
    ii=10 type=UNDEFINED
    ii=11 type=UNDEFINED
    Function: -146088352 Signature: s.ifs
    hi!!! int=123 float=0.345000 string=yo
    Now we only need to declare the "needed" signature "s.", for printf(char *msg, ...), because we can figure out the rest dynamically, based on getType(args[ii]).

    Limitation:

    We can't use %c (1 byte char) or %g (8 bytes double) without explicit signature, because these types don't exist in CoDScript itself, so there is no way to tell binarybuffer_write() about the type-information only with getType().

    For that case, you need to make the signature explicit:

    PHP Code:
    call_function(libc_printf"s.ifsdc""hi!!! int=%d float=%f string=%s double=%g char=%c\n"1230.345"yo"0.123"#"); 
    Output:
    Code:
    hi!!! int=123 float=0.345000 string=yo double=0.123 char=#
    Return values:

    Just added this in new commit: https://github.com/kungfooman/libcod...dff68c1ba77ba7
    Binaries are updated: http://killtube.org/downloads/libcod/2015.01.17/

    PHP Code:
        ret call_function(libc_printf"s.""asd\n");
        
    printf("printed chars: %\n"ret); 
    Output:
    Code:
    asd
    printed chars: 4
    Basically that's just eax as int though atm. Some converting based on signature would be nice, like "s.)i" for "return an int".
    Last edited by kung foo man; 17th January 2015 at 18:34. Reason: Add limitation info and update call_function to support explicit signature for doubles/chars
    timescale 0.01

  2. The Following 2 Users Say Thank You to kung foo man For This Useful Post:

    php (17th January 2015),voron00 (18th January 2015)

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •