技术开发 频道

编程实现Windows应用程序自产生代码

  【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);
}  
//
0
相关文章