aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan Cespedes <cespedes@thehackers.org>1997-06-25 00:02:58 +0200
committerJuan Cespedes <cespedes@thehackers.org>1997-06-25 00:02:58 +0200
commit24c8253c7bdb2f069f0320f1a6109402720f6d44 (patch)
tree275a5f2c85f4bacef6161b6350534cb3b07db1ca
parentd3ac65fdee629adf2a429cd9987022f0bd141dfa (diff)
downloadltrace-24c8253c7bdb2f069f0320f1a6109402720f6d44.tar.gz
Version 0.0.1997.06.25
I think I've found the optimal format for config files: C prototypes! For example: void * malloc(unsigned int size);
-rw-r--r--README6
-rw-r--r--functions.c6
-rw-r--r--functions.h135
-rw-r--r--functions.obin3460 -> 3460 bytes
-rwxr-xr-xltracebin9770 -> 9770 bytes
-rw-r--r--ltrace.c4
-rw-r--r--ltrace.obin4924 -> 4924 bytes
7 files changed, 148 insertions, 3 deletions
diff --git a/README b/README
index 27ac67c..57a1f7e 100644
--- a/README
+++ b/README
@@ -3,3 +3,9 @@ Funcionamiento:
* 2nd approach: using soft breakpoints (INT 3, CC) in process using
ptrace, just like gdb/strace
+
+Tue Jun 24 22:42:59 CEST 1997 Juan Cespedes <cespedes@etsit.upm.es>
+
+ * I think I've found the optimal format for config files:
+ C prototypes! For example:
+ void * malloc(unsigned int size);
diff --git a/functions.c b/functions.c
index 2b9c835..7f974c3 100644
--- a/functions.c
+++ b/functions.c
@@ -47,7 +47,7 @@ struct functions functions_list[] = {
{NULL, _T_UNKNOWN, 5, {_T_UNKNOWN, _T_UNKNOWN, _T_UNKNOWN, _T_UNKNOWN, _T_UNKNOWN}},
};
-char * process_string(unsigned char * str)
+static char * process_string(unsigned char * str)
{
static char tmp[256];
@@ -70,7 +70,7 @@ char * process_string(unsigned char * str)
return tmp;
}
-char * print_string(int addr)
+static char * print_string(int addr)
{
static char tmp[256];
int a;
@@ -88,7 +88,7 @@ char * print_string(int addr)
return process_string(tmp);
}
-char * print_param(int type, int esp)
+static char * print_param(int type, int esp)
{
static char tmp[256];
int a;
diff --git a/functions.h b/functions.h
new file mode 100644
index 0000000..991b181
--- /dev/null
+++ b/functions.h
@@ -0,0 +1,135 @@
+#include <stdio.h>
+#include <string.h>
+#include <sys/ptrace.h>
+
+extern int pid;
+
+struct functions {
+ const char * function_name;
+ int return_type;
+ int num_params;
+ int params_type[10];
+};
+
+/*
+ * Lista de types:
+ */
+
+#define _T_UNKNOWN -1
+#define _T_VOID 0
+#define _T_INT 1
+#define _T_UINT 2
+#define _T_OCTAL 3
+#define _T_CHAR 4
+#define _T_STRING 5
+#define _T_ADDR 6
+#define _T_FILE 7
+#define _T_HEX 8
+#define _T_FORMAT 9 /* printf-like format */
+
+struct functions functions_list[] = {
+ {"atexit", _T_INT, 1, {_T_ADDR}},
+ {"close", _T_INT, 1, {_T_INT}},
+ {"exit", _T_INT, 1, {_T_INT}},
+ {"fclose", _T_INT, 1, {_T_FILE}},
+ {"fprintf", _T_INT, 2, {_T_FILE, _T_FORMAT}},
+ {"free", _T_INT, 1, {_T_ADDR}},
+ {"gethostname", _T_INT, 2, {_T_STRING, _T_INT}},
+ {"getopt_long", _T_INT, 5, {_T_INT, _T_ADDR, _T_STRING, _T_ADDR, _T_ADDR}},
+ {"malloc", _T_ADDR, 1, {_T_UINT}},
+ {"memset", _T_ADDR, 3, {_T_ADDR, _T_CHAR, _T_UINT}},
+ {"mkdir", _T_INT, 2, {_T_STRING, _T_OCTAL}},
+ {"printf", _T_INT, 1, {_T_FORMAT}},
+ {"rindex", _T_STRING, 2, {_T_STRING, _T_CHAR}},
+ {"strcmp", _T_INT, 2, {_T_STRING, _T_STRING}},
+ {"strncmp", _T_INT, 3, {_T_STRING, _T_STRING, _T_INT}},
+ {"time", _T_UINT, 1, {_T_ADDR}},
+ {NULL, _T_UNKNOWN, 5, {_T_UNKNOWN, _T_UNKNOWN, _T_UNKNOWN, _T_UNKNOWN, _T_UNKNOWN}},
+};
+
+static char * process_string(unsigned char * str)
+{
+ static char tmp[256];
+
+ tmp[0] = '\0';
+ while(*str) {
+ switch(*str) {
+ case '\r': strcat(tmp,"\\r"); break;
+ case '\n': strcat(tmp,"\\n"); break;
+ case '\t': strcat(tmp,"\\t"); break;
+ case '\\': strcat(tmp,"\\"); break;
+ default:
+ if ((*str<32) || (*str>126)) {
+ sprintf(tmp,"%s\\%03o", tmp, *str);
+ } else {
+ sprintf(tmp, "%s%c", tmp, *str);
+ }
+ }
+ str++;
+ }
+ return tmp;
+}
+
+static char * print_string(int addr)
+{
+ static char tmp[256];
+ int a;
+ int i=0;
+
+ tmp[0] = '\0';
+ while(1) {
+ a = ptrace(PTRACE_PEEKTEXT, pid, addr+i, 0);
+ *(int *)&tmp[i] = a;
+ if (!tmp[i] || !tmp[i+1] || !tmp[i+2] || !tmp[i+3] || i>100) {
+ break;
+ }
+ i += 4;
+ }
+ return process_string(tmp);
+}
+
+static char * print_param(int type, int esp)
+{
+ static char tmp[256];
+ int a;
+
+ a = ptrace(PTRACE_PEEKTEXT, pid, esp, 0);
+
+ switch(type) {
+ case _T_STRING:
+ case _T_FORMAT:
+ sprintf(tmp,"\"%s\"",print_string(a));
+ break;
+ default:
+ if (a<1000000 && a>-1000000) {
+ sprintf(tmp, "%d", a);
+ } else {
+ sprintf(tmp, "0x%08x", a);
+ }
+ }
+ return tmp;
+}
+
+void print_function(const char *name, int esp)
+{
+ struct functions * tmp;
+ char message[1024];
+ int i;
+
+ tmp = &functions_list[0];
+
+ while(tmp->function_name) {
+ if (!strcmp(name, tmp->function_name)) {
+ break;
+ }
+ tmp++;
+ }
+ sprintf(message, "%s(", name);
+ if (tmp->no_params>0) {
+ sprintf(message, "%s%s", message, print_param(tmp->params_type[0], esp+4));
+ }
+ for(i=1; i<tmp->no_params; i++) {
+ sprintf(message, "%s,%s", message, print_param(tmp->params_type[i], esp+4*(i+1)));
+ }
+ fprintf(stderr, "%s) = ???\n", message);
+}
diff --git a/functions.o b/functions.o
index 01d332b..a339c66 100644
--- a/functions.o
+++ b/functions.o
Binary files differ
diff --git a/ltrace b/ltrace
index 6a03d42..082066e 100755
--- a/ltrace
+++ b/ltrace
Binary files differ
diff --git a/ltrace.c b/ltrace.c
index 5bfe3c8..432b5eb 100644
--- a/ltrace.c
+++ b/ltrace.c
@@ -13,6 +13,8 @@
#include <string.h>
#include <signal.h>
+void print_function(const char *, int);
+
int pid;
static int debug = 0;
@@ -21,6 +23,8 @@ struct library_symbol {
char * name;
unsigned long addr;
unsigned char value;
+ unsigned long return_addr;
+ unsigned char return_value;
struct library_symbol * next;
};
diff --git a/ltrace.o b/ltrace.o
index 03db195..bab8618 100644
--- a/ltrace.o
+++ b/ltrace.o
Binary files differ