Advertisement
Guest User

rundll.c

a guest
Nov 16th, 2015
683
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.83 KB | None | 0 0
  1.  
  2. #include <errno.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <sys/types.h>
  6. #include <windows.h>
  7.  
  8. typedef struct {
  9.     void *data;
  10.     size_t pos, sz;
  11. } args;
  12.  
  13. args *a_new(size_t sz);
  14. void a_destroy(args *a);
  15. void a_push(args *a, void *arg);
  16. void a_print(args *a);
  17. int __fastcall a_exec(args *a, FARPROC fun);
  18.  
  19. args *a_new(size_t sz) {
  20.     args *a;
  21.     if (!(a = malloc(sizeof(args)))) {
  22.         perror("malloc");
  23.         exit(errno);
  24.     }
  25.     a->pos = 0;
  26.     a->sz = (sz+3) & ~3; // align to 4 bytes
  27.     if (!(a->data = calloc(a->sz, 1))) {
  28.         free(a);
  29.         perror("calloc");
  30.         exit(errno);
  31.     }
  32.     return a;
  33. }
  34.  
  35. void a_destroy(args *a) {
  36.     memset(a->data, -1, a->sz);
  37.     free(a->data);
  38.     memset(a, -1, sizeof(args));
  39.     free(a);
  40. }
  41.  
  42. void a_push(args *a, void *arg) {
  43.     if (a->pos == a->sz) {
  44.         a->sz *= 2;
  45.         void *old = a->data;
  46.         if (!(a->data = realloc(a->data, a->sz))) {
  47.             a_destroy(old);
  48.             perror("realloc");
  49.             exit(errno);
  50.         }
  51.         memset(a->data + a->sz/2, 0, a->sz/2);
  52.     }
  53.     memcpy(a->data + a->pos, arg, 4);
  54.     a->pos += 4;
  55. }
  56.  
  57. void a_print(args *a) {
  58.     puts("################################");
  59.     for (int i = 0; i < a->pos; i+=4) {
  60.         int val = *(int*)(a->data + i);
  61.         printf("%.2d %.8x\n", i, val);
  62.     }
  63.     puts("################################");
  64.     for (int i = a->pos; i < a->sz; i+=4) {
  65.         int val = *(int*)(a->data + i);
  66.         printf("%.2d %.8x\n", i, val);
  67.     }
  68. }
  69.  
  70. int __fastcall a_exec(args *a, FARPROC fun) {
  71.     int res;
  72.     __asm__ __volatile__ (
  73.         "movl %1, %%esi      # source = a->data        \n\t"
  74.         "subl %2, %%esp      # make space on stack     \n\t"
  75.         "movl %%esp, %%edi   # dest = stack            \n\t"
  76.         "shrl $2, %2         # dword == 4 bytes        \n\t"
  77.         "rep movsd           # copy args onto stack    \n\t"
  78.         "call *%3            # call fun (stdcall)      \n\t"
  79.         "movl %%eax, %0      # preserve result         \n\t"
  80.         : "=r" (res)
  81.         :  "r" (a->data),
  82.            "c" (a->pos),
  83.            "r" (fun)
  84.         : "%esi", "%edi", "%eax"
  85.     );
  86.     return res;
  87. }
  88.  
  89.  
  90. int main(int c, char *v[static 3]) {
  91.     void   *dll = LoadLibrary(v[1]);            if (!dll) return -1;
  92.     FARPROC fun = GetProcAddress(dll, v[2]);    if (!fun) return -2;
  93.     args *a = a_new(64);
  94.    
  95.     for (int i=3; i<c; i++) {
  96.         if (*v[i] == '.') {
  97.             v[i]++;
  98.             a_push(a, &v[i]);
  99.         }
  100.         else {
  101.             char *ep;
  102.             errno = 0;
  103.             long n = strtol(v[i], &ep, 0);      if (errno | *ep) return -3;
  104.             a_push(a, &n);
  105.         }
  106.     }
  107.    
  108.     if (**v < 'a') a_print(a);
  109.    
  110.     int ret = a_exec(a, fun);
  111.     a_destroy(a);
  112.    
  113.     return ret;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement