【IT168 专稿】自产生代码技术对阻碍反汇编程序来说,起到了重要的作用。你应该通过它这种“糟糕”的编程风格技术来保护你的应用程序。首先,这个kernel32.dll组件对外暴露了一个WriteProcessMemory函数。从它的的名称就知道它的作用了,用于修改一个进程的内存。其次,几乎所有的操作系统,包括Windows和Linux都允许修改的代码放置到堆上。我喜欢第二种方式,因为当我试着在VC++开发环境中为Windows应用程序创建自产生代码时能获得更多的自由和受到更少的限制。下图展示了应用程序异常终止所产生的一个异常。
我试着解决这些问题,下面是解决该问题所获得的一些个人感受:
1.仅使用局部变量,不要使用全局变量、静态变量、和常量字符串变量。
2 如果遇到函数中的代码需要调用另一个函数,应该传递该函数的指针过去。
关于自产生代码的一个问题:它到底有什么特点?
答案就是它能够隐藏一些关键功能,诸如产生键值的程序或者检查序列号等工作。
使用代码
步骤1: 加密My_function代码到一个头文件中
下面的代码是我想要在堆上执行的函数。当然你可以对它进行修改,并添加你组件的代码进行测试以获得你自己的体验。如果你喜欢,你可以共享到这里来或者单独写一篇文章并发表到代码工程(Code Project)站点上来。
//
void __stdcall my_function( int x,
int y,
char* str_a,
char* str_b,
void* (__cdecl *_memcpy )( void *dest, const void *src, size_t count ),
int (__cdecl *_sprintf )( char *buffer, const char *format, ... ),
void* (__cdecl *_malloc )( size_t size ),
void (__cdecl *_free )( void *memblock ),
size_t (__cdecl *_strlen )( const char *string ),
int (__stdcall* _MessageBox)(HWND hWnd, LPCTSTR lpText,
LPCTSTR lpCaption, UINT uType)
)
{
char* pTemp;
int str_a_len=_strlen(str_a);
int str_b_len=_strlen(str_b);
pTemp=(char*)_malloc(str_a_len+str_b_len+20);
if(x>y)
{
//_sprintf(pTemp,"%s%s",str_a,str_b);
//error:constant string variable
_memcpy(pTemp,str_a,str_a_len);
_memcpy(pTemp+str_a_len,str_b,str_b_len);
pTemp[str_a_len+str_b_len]=0;
//_MessageBox(NULL,pTemp,"",MB_OK);
//error:constant string variable
_MessageBox(NULL,pTemp,str_a,MB_OK);
}
else
{
//_sprintf(pTemp,"%s%s",str_b,str_a);
//error:constant string variable
_memcpy(pTemp,str_b,str_b_len);
_memcpy(pTemp+str_b_len,str_a,str_a_len);
pTemp[str_a_len+str_b_len]=0;
//MessageBox(NULL,pTemp,"title",MB_OK);
//error:constant string variable
_MessageBox(NULL,pTemp,str_b,MB_OK);
}
for(int i=0;i<10;i++)
{
int j=1;
j^=i;
}
_free(pTemp);
}
//
void __stdcall my_function( int x,
int y,
char* str_a,
char* str_b,
void* (__cdecl *_memcpy )( void *dest, const void *src, size_t count ),
int (__cdecl *_sprintf )( char *buffer, const char *format, ... ),
void* (__cdecl *_malloc )( size_t size ),
void (__cdecl *_free )( void *memblock ),
size_t (__cdecl *_strlen )( const char *string ),
int (__stdcall* _MessageBox)(HWND hWnd, LPCTSTR lpText,
LPCTSTR lpCaption, UINT uType)
)
{
char* pTemp;
int str_a_len=_strlen(str_a);
int str_b_len=_strlen(str_b);
pTemp=(char*)_malloc(str_a_len+str_b_len+20);
if(x>y)
{
//_sprintf(pTemp,"%s%s",str_a,str_b);
//error:constant string variable
_memcpy(pTemp,str_a,str_a_len);
_memcpy(pTemp+str_a_len,str_b,str_b_len);
pTemp[str_a_len+str_b_len]=0;
//_MessageBox(NULL,pTemp,"",MB_OK);
//error:constant string variable
_MessageBox(NULL,pTemp,str_a,MB_OK);
}
else
{
//_sprintf(pTemp,"%s%s",str_b,str_a);
//error:constant string variable
_memcpy(pTemp,str_b,str_b_len);
_memcpy(pTemp+str_b_len,str_a,str_a_len);
pTemp[str_a_len+str_b_len]=0;
//MessageBox(NULL,pTemp,"title",MB_OK);
//error:constant string variable
_MessageBox(NULL,pTemp,str_b,MB_OK);
}
for(int i=0;i<10;i++)
{
int j=1;
j^=i;
}
_free(pTemp);
}
//