欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]将软件注册机制藏在API中

[原创]将软件注册机制藏在API中

把软件的注册机制隐藏在API里最大的好处就是不容易被破解者发现,因为他们经常会用OD的F8快捷键步过API,很少有人跟进去看把?
  原理比较简单,主要是利用了流行的HOOK技术,至于怎么HOOK完全取决于你,反正要能改变API函数的流程即可。
如果选的HOOK点适当,我觉得这一招还是很阴的....
选来选去,我觉的MessageBoxA比较符合我的要求。
考虑下面的代码:


if(key==2)

{

    MessageBox(XXX,"注册失败!","err",MB_OK);

}else

{

//这个只是假的成功把。

    MessageBox(0,"注册成功!","err",MB_OK)

}


注意观察第一个参数,这个是我们的后面标记。
破解者一般都会跳过失败的分支.....
假如我们HOOK了MessageBoxA这个函数,并留下了进入验证机制的后门....
在  MessageBox(XXX,"注册失败!","err",MB_OK); 中触发后门,触发条件是XXX=后门设置的某个值...
一旦跳过了这一个分支,那么就等于跳过了进入注册机制的路.....呵呵,你懂得...
然后显示注册失败什么的 就可以在验证完后改变MessageBox的参数现实提示。
HOOK操作代码最后放到隐秘一点的地方,比如异常处理函数..
下面是完整的验证DLL代码,写的很简单。

void HookMessageBox();

BOOL APIENTRY DllMain( HMODULE hModule,

                       DWORD  ul_reason_for_call,

                       LPVOID lpReserved

					 )

{

	switch (ul_reason_for_call)

	{

	case DLL_PROCESS_ATTACH:

		HookMessageBox();

	case DLL_THREAD_ATTACH:

	case DLL_THREAD_DETACH:

	case DLL_PROCESS_DETACH:

		break;

	}

	return TRUE;

}

char *err = "注册失败!";

char *regok ="注册成功!";

char * FunAddr = NULL;

void HookMessageBox();

int __stdcall REG(int key)

{

	if (key==0xcccccccc)

	{

		return 1;

	}else

	{

		return 0;

	}

}

__declspec(naked) void MyMessagebox()

{

	_asm

	{

			push ebp

			mov ebp,esp

			cmp [ebp+20],0xAA

			jne next

			push [ebp+8]

			call REG

				push ebx

			mov ebx,0

			mov [ebp+8],ebx

			mov [ebp+20],ebx

			pop ebx

			cmp eax,1

			jne iferr

			mov eax,regok 

			mov [ebp+12],eax

			jmp next

iferr:

		mov eax,err

		mov [ebp+12],eax

next:

		mov eax,FunAddr

			add eax,5

		jmp eax

	}

}

void HookMessageBox()

{

	unsigned char JmpCode[5];

	int addr2;

	DWORD oldProtect;

	FunAddr=(char *)GetProcAddress(GetModuleHandleA("User32.dll"),"MessageBoxA");

	if (!FunAddr)

	{

		MessageBoxA(0,"error!","",MB_OK);

		ExitProcess(-1);

	}

	JmpCode[0]=0xE9;

	addr2 = (int)MyMessagebox-(int)FunAddr-5;

	*((int*)&JmpCode[1])=addr2;

	VirtualProtect(FunAddr,5,PAGE_EXECUTE_READWRITE,&oldProtect);

	memcpy(FunAddr,JmpCode,5);

	VirtualProtect(FunAddr,5,oldProtect,NULL);

}

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功