VERte][
13.02.2010, 20:08
Имеется такой кусок кода:
void B()
{}
void A(int E_addr)
{}
int main()
{
A(((int)B)^12345);
return 0;
}
вопрос: как сделать чтоб выражение ((int)B)^12345 вычислялось на стадии компиляции? у меня что в M$, что в gcc компилируется только в виде:
mov eax, offset B
xor eax, 12345d
с чего я взял, что вообще так можно:
http://www.insidepro.com/kk/199/199r.shtml смотрим "Маскировка указателей", Крис утверждает, что у него все ок, достаточно лишь установить флаг компиляции /Ox (-O2).
У меня, как я уже сказал, не на мс, не на гцц компилерах не работает (перебрал хуеву тучу возможных комбинаций флагов и там и там)
Кто сталкивался с такой штукой отпишитесь. И да, сделать надо чисто методами C, т.е. взять hiew и там вписать нужное значение, забив лишнее nop'ами не прокатит (хотя это и решение, но задание было дано так)
Весь код, кому интересно:
#include <stdio.h>
#include <stdlib.h>
#define PASS 12345
void B()
{
printf("%s \n", "Hello world");
exit(0);
}
void _cdecl A(int E_addr)
{
int pass;
scanf("%d", &pass);
pass^=E_addr;
*(((int*)&E_addr)-1)=pass;
}
int main()
{
#ifdef _ATT
asm("int $0x3");
#endif
#ifdef _INTEL
_asm{int 0x3};
#endif
A(((int)B)^PASS);
return 0;
}
В планах реализовать защиту таким способом, что адрес перехода на full version функции программы будет замаскирован на некотором пароле (даже скорее всего на хэше пароля), в результате чего только правильный ввод пароля даст доступ к полной версии. В связи с этим естественно, что в программе выражение ((int)B)^PASS должно быть вычисленно на стадии компиляции.
void B()
{}
void A(int E_addr)
{}
int main()
{
A(((int)B)^12345);
return 0;
}
вопрос: как сделать чтоб выражение ((int)B)^12345 вычислялось на стадии компиляции? у меня что в M$, что в gcc компилируется только в виде:
mov eax, offset B
xor eax, 12345d
с чего я взял, что вообще так можно:
http://www.insidepro.com/kk/199/199r.shtml смотрим "Маскировка указателей", Крис утверждает, что у него все ок, достаточно лишь установить флаг компиляции /Ox (-O2).
У меня, как я уже сказал, не на мс, не на гцц компилерах не работает (перебрал хуеву тучу возможных комбинаций флагов и там и там)
Кто сталкивался с такой штукой отпишитесь. И да, сделать надо чисто методами C, т.е. взять hiew и там вписать нужное значение, забив лишнее nop'ами не прокатит (хотя это и решение, но задание было дано так)
Весь код, кому интересно:
#include <stdio.h>
#include <stdlib.h>
#define PASS 12345
void B()
{
printf("%s \n", "Hello world");
exit(0);
}
void _cdecl A(int E_addr)
{
int pass;
scanf("%d", &pass);
pass^=E_addr;
*(((int*)&E_addr)-1)=pass;
}
int main()
{
#ifdef _ATT
asm("int $0x3");
#endif
#ifdef _INTEL
_asm{int 0x3};
#endif
A(((int)B)^PASS);
return 0;
}
В планах реализовать защиту таким способом, что адрес перехода на full version функции программы будет замаскирован на некотором пароле (даже скорее всего на хэше пароля), в результате чего только правильный ввод пароля даст доступ к полной версии. В связи с этим естественно, что в программе выражение ((int)B)^PASS должно быть вычисленно на стадии компиляции.