C++源代码免杀之函数的动态调用 |
近期也在学着 批改Gh0st远控的源代码,源代码免杀起来还是容易、 容易、有效和 容易点 。针关于输入输出表盯的 比较紧的杀毒软件,最有效的还是进行函数动态调用 。也便是说找到函数的原定义,包含值类型和参数等等,再在调用该函数的地方再一次定义这个函数,其实也只不过改下函数名而已,下面举个例子: CreateRemoteThread 作用是 缔造远线程, 假如杀毒软件现在就杀在这个函数上,我们就这样 解决,首先在代码中右键点击CreateRemoteThread函数-->转到定义,找到函数的原型: 函数原型如下: WINBASEAPI __out HANDLE WINAPI CreateRemoteThread( __in HANDLE hProcess, __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, __in SIZE_T dwStackSize, __in LPTHREAD_START_ROUTINE lpStartAddress, __in_opt LPVOID lpParameter, __in DWORD dwCreationFlags, __out_opt LPDWORD lpThreadId ); 改后的函数模型如下: typedef HANDLE (WINAPI *CreateRemoteThreadxx) ( __in HANDLE hProcess, __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, __in SIZE_T dwStackSize, __in LPTHREAD_START_ROUTINE lpStartAddress, __in_opt LPVOID lpParameter, __in DWORD dwCreationFlags, __out_opt LPDWORD lpThreadId ); CreateRemoteThreadxx yyCreateRemoteThread= (CreateRemoteThreadxx)GetProcAddress(LoadLibrary("kernel32.dll"),"CreateRemoteThread"); 补充:有些函数原型最终面分别带得有A和W的,假如你的编译环境是ANSI环境就 取舍带A的那 部分,假如你的环境是Unicode环境,那就 取舍带W的那 部分 。例如:GetUserName的原型有两种定义:GetUserNameA和GetUserNameW,视实际状况 取舍相应的函数原型进行 批改就好 。 批改后调用的函数名就由CreateRemoteThread变为了yyCreateRemoteThread,红色 部分为自定义 部分, 随便你改称什么,然而要 留神前后 统一 。蓝色的 部分再 可以用字符串衔接法进行 拆散后衔接,这样 解决之后,杀毒软件就找不到CreateRemoteThread这个函数了 。到此,文件的这处也就免杀了 。丝毫小手记,分享给大家,见笑了 。 后记:看了众多教程,都是说怎么改,没说为何要这么改,也没说还 可以怎么改,更没说改的限度是什么 。一看教程里先在函数后面加个L,再在定义后的新的函数前面加个p,接着众多看了教程的人都改成那两个,做教程的人还在教程里恐吓人说“别的都不要动,这两个地方改成这样就 可以了”,有时候有些 事件并不难,并不可怕,难和可怕大多来自于别人的 骇人听闻和对未知事物的 害怕 。最终 盼望大家都 可以放开手脚,干番大事业!搞了个垃圾站赚点外块, 盼望大家能 支撑下 。 |