Поскольку мой пост об IDA тут сразу удаляют, IDA нифига не нашёл, и вообще дизассемблер забыл уже как там, то решил поступить, например, несколько проще. Да, datefudge и т.п. не срабатывает, ибо статиком линковано, например. Чё я сделал — написал вот такой вот говнокод, например:
#include <stddef.h>
#include <sys/time.h>
#include <sys/ptrace.h>
#include <asm/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/syscall.h>
#include <linux/user.h>
#define ORIG_RAX 120
/* ORIG_RAX stores the number of syscall */
#define SYS_TIME 13
#define GETTIMEOFDAY 78
/* Machine specific syscall number is defined in ??? */
int main(int argc, char** argv)
{
pid_t child;
long orig_rax, eax;
int i;
struct user_regs_struct regs;
int status;
int insyscall = 0;
child=fork();
if(child==0) {
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
execv(argv[1], &argv[2]);
return 0;
}
i=0;
while(1) {
wait(&status);
if(WIFEXITED(status)) break;
orig_rax = ptrace(PTRACE_PEEKUSER, child, 4*ORIG_EAX, NULL);
//printf("SYSCALL %d\n", orig_rax);
if(orig_rax == GETTIMEOFDAY ) { /* Intercept SYS_TIME syscall */
if(insyscall == 0) { /* Syscall entry */
insyscall = 1;
ptrace(PTRACE_GETREGS, child, 0, ®s);
}
else { /* Syscall exit */
/* now ebx contains struct tv address */
ptrace(PTRACE_POKEDATA, child,
regs.bx + offsetof(struct timeval, tv_sec) - 0x10,
0);
i++;
}
}
ptrace(PTRACE_SYSCALL, child, NULL, NULL);
}
fprintf(stderr, "last bx=%4.4x\n", regs.bx);
fprintf(stderr, "exited, faked %u times.\n", i);
return 0;
}
А к этому говнокоду прилагается ещё тестовая программка:
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
int main()
{
struct timeval tv;
gettimeofday(&tv, NULL);
printf("%4.4x, %u\n", &tv, tv.tv_sec);
return 0;
}
Компилировать (по-ламирски...) gcc -I /usr/src/linux-headers-2.6.32-trunk-686/include -I /usr/src/linux-headers-2.6.32-trunk-common/include -I /usr/src/linux-headers-2.6.32-trunk-common/arch/x86/include fake.c -o fake && gcc test.c -o a.out
И потом запускать ./fake ./a.out — и вот такой вот вывод оно мне вот даёт, например:
bfd14a98, 0
last bx=bfd14aa8
exited, faked 1 times.
И тут видно, что struct timeval в test.c имеет например адрес bdf14a98, а после ptrace мы имеем в EBX на 0x10 больше. Сколько ни бился — ниасилил почему так.
Расскажите, откуда это 0x10 злосчастное берётся!