注册机偷懒写法2、之直接调用源程序的函数

注册机偷懒写法1、之直接扣代码

注册机偷懒写法2、之直接调用源程序的函数

注册机偷懒写法3、内联Hook让程序自己弹出注册码

注册机偷懒写法4、调试模式下获取

  

 如果程序的算法太复杂,我们搞不定,或者分析时间太长, 我们可以尝试将程序加载到注册机程序的内存空间直接通过地址直接调用管算法call, 前提call中没有一些需要提前初始的变量,把需要加载的exe的重定位去掉这样就不需要修复需要加载的exe的重定位了。

#include
#include
/*
	如果程序的算法太复杂,我们搞不定,或者分析时间太长,
	我们可以尝试将程序加载到注册机程序的内存空间直接通过地址直接调用管算法call,
	前提call中没有一些需要提前初始的变量
	把需要加载的exe的重定位去掉这样就不需要修复需要加载的exe的重定位了
*/

// 释放文件内容
void freeFileData(_In_  char* pFileData) {
	delete[] pFileData;
}

//获取DOS头
IMAGE_DOS_HEADER* getDosHeader(_In_  char* pFileData) {
	return (IMAGE_DOS_HEADER*)pFileData;
}

// 获取NT头
IMAGE_NT_HEADERS* getNtHeader(_In_  char* pFileData) {
	return (IMAGE_NT_HEADERS*)(getDosHeader(pFileData)->e_lfanew + (SIZE_T)pFileData);
}

//获取文件头
IMAGE_FILE_HEADER* getFileHeader(_In_  char* pFileData) {
	return &getNtHeader(pFileData)->FileHeader;
}

//获取扩展头
IMAGE_OPTIONAL_HEADER* getOptionHeader(_In_  char* pFileData) {
	return &getNtHeader(pFileData)->OptionalHeader;
}
//获取需要调用的函数或数据新地址,源程序的加载基址与需要调用的函数或数据相对虚拟地址
int GetNewAddress(HMODULE hsrc, int sRva)
{
	return (int)hsrc + sRva;
}
//修复IAT
void fiat(char * hsrc)
{
	IMAGE_THUNK_DATA* pIat = 0, *pInt = 0;
	IMAGE_IMPORT_DESCRIPTOR* pImp = (IMAGE_IMPORT_DESCRIPTOR*)(getOptionHeader(hsrc)->DataDirectory[1].VirtualAddress + hsrc);
	while (pImp->FirstThunk != 0)
	{
		char* dllName = pImp->Name + hsrc;
		HMODULE hDll = LoadLibraryA(dllName);
		// 3. 根据导入表记录的dll名, 加载这个DLL
		// 4. 遍历导入名称表, 得到从这个dll中导入的所有的函数名/序号
		// 5. 使用GetProcAddress获取这个函数的地址
		// 6. 将地址填写到IAT中.
		pIat = (IMAGE_THUNK_DATA*)(pImp->FirstThunk + hsrc);
		if (pImp->OriginalFirstThunk == NULL)
			pInt = (IMAGE_THUNK_DATA*)(pImp->FirstThunk + hsrc);
		else
			pInt = (IMAGE_THUNK_DATA*)(pImp->OriginalFirstThunk + hsrc);
		while (pInt->u1.Function != 0)
		{
			DWORD address = 0;
			if (IMAGE_SNAP_BY_ORDINAL(pInt->u1.Ordinal))
			{
				// 序号导入
				address = (DWORD)
					GetProcAddress(hDll,
					(char*)IMAGE_ORDINAL(pInt->u1.Ordinal));
			}
			else {
				IMAGE_IMPORT_BY_NAME* pName = (IMAGE_IMPORT_BY_NAME*)
					(pInt->u1.Function + hsrc);
				address = (DWORD)GetProcAddress(hDll, pName->Name);

			}
			// 将得到的地址填写到IAT中.
			DWORD old;
			VirtualProtect(&pIat->u1.Function, 4, PAGE_READWRITE, &old);
			pIat->u1.Function = address;
			VirtualProtect(&pIat->u1.Function, 4, old, &old);
			++pInt;
			++pIat;
		}
		++pImp;
	}
}
int main()
{

	char name[20] = { 0 };
	scanf_s("%s", name, sizeof(name));
	int len = strlen(name);
	if (len < 6)
	{
		printf("Der Name muss min. 6 Zeichen lang sein\n");
	}
	else
	{

		HMODULE hsrc = LoadLibraryA("Dope2112.1.exe");
		fiat((char *)hsrc);
		char str1[20] = { 0 };
		char str2[20] = { 0 };
		char str3[40] = { 0 };

		int fun_0x405374 = GetNewAddress(hsrc, 0x5374);
		int fun_0x403424 = GetNewAddress(hsrc, 0x3424);
		int data_0x421dd8 = GetNewAddress(hsrc, 0x21dd8);
		__asm
		{
			xor eax, eax
			dope2112_1_421bf4 :
			xor edx, edx
				mov dl, al
				lea ecx, [name]
				movzx edx, byte ptr ds : [ecx + edx - 1]
				add edx, 0xffffff9f
				cmp edx, 0x19
				ja dope2112_1_421ce3
				jmp dword ptr ds : [edx * 4 + 421c13h]
				//莫名数据开始
				jnp dope2112_1_421c31
				inc edx
				add byte ptr ds : [edi + 0x1c], bh
				inc edx
				add byte ptr ds : [ebx - 0x78ffbde4], al
				sbb al, 0x42
				add byte ptr ds : [ebx - 0x70ffbde4], cl
				dope2112_1_421c31 :
			sbb al, 0x42
				add byte ptr ds : [ebx - 0x68ffbde4], dl
				sbb al, 0x42
				add byte ptr ds : [ebx - 0x60ffbde4], bl
				sbb al, 0x42
				add byte ptr ds : [ebx - 0x58ffbde4], ah
				sbb al, 0x42
				add byte ptr ds : [ebx - 0x50ffbde4], ch
				sbb al, 0x42
				add byte ptr ds : [ebx - 0x48ffbde4], dh
				sbb al, 0x42
				add byte ptr ds : [ebx - 40ffbde4h], bh
				sbb al, 0x42
				add bl, al
				sbb al, 0x42
				add bh, al
				sbb al, 0x42
				add bl, cl
				sbb al, 0x42
				add bh, cl
				sbb al, 0x42
				add bl, dl
				sbb al, 0x42
				add bh, dl
				sbb al, 0x42
				add bl, bl
				sbb al, 0x42
				add bh, bl
				sbb al, 0x42
				add byte ptr ds : [edx - 0x4d9914e8], dh
				and eax, 0x42b262eb
				//莫名数据结束
				jmp dope2112_1_421ce5
				mov dl, 0xc
				jmp dope2112_1_421ce5
				mov dl, 0xd
				jmp dope2112_1_421ce5
				mov dl, 0x6
				jmp dope2112_1_421ce5
				mov dl, 0x36
				jmp dope2112_1_421ce5
				mov dl, 0x2b
				jmp dope2112_1_421ce5
				mov dl, 0x17
				jmp dope2112_1_421ce5
				mov dl, 0x2f
				jmp dope2112_1_421ce5
				mov dl, 0x13
				jmp dope2112_1_421ce5
				mov dl, 0x82
				jmp dope2112_1_421ce5
				mov dl, 0x9b
				jmp dope2112_1_421ce5
				mov dl, 0x92
				jmp dope2112_1_421ce5
				mov dl, 0x3
				jmp dope2112_1_421ce5
				mov dl, 0x63
				jmp dope2112_1_421ce5
				mov dl, 0x21
				jmp dope2112_1_421ce5
				mov dl, 0x42
				jmp dope2112_1_421ce5
				mov dl, 0x5c
				jmp dope2112_1_421ce5
				mov dl, 0x29
				jmp dope2112_1_421ce5
				mov dl, 0xc7
				jmp dope2112_1_421ce5
				mov dl, 0x66
				jmp dope2112_1_421ce5
				mov dl, 0x58
				jmp dope2112_1_421ce5
				mov dl, 0xa
				jmp dope2112_1_421ce5
				mov dl, 0x28
				jmp dope2112_1_421ce5
				mov dl, 0x50
				jmp dope2112_1_421ce5
				dope2112_1_421ce3 :
			mov dl, 5dh
				dope2112_1_421ce5 :
			add bl, dl
				inc eax
				cmp al, 0x6
				jne dope2112_1_421bf4
				lea edx, [str1]
				xor eax, eax
				mov al, byte ptr ss : [len]
				imul eax, eax, 0x4A7E
				call fun_0x405374 //调用原函数 call 0x405374
				lea edx, [str2]
				xor eax, eax
				mov al, bl
				call fun_0x405374 //调用原函数 call 0x405374
				push dword ptr ss : [str1]
				push data_0x421dd8
				push dword ptr ss : [str2]
				lea eax, dword ptr ss : [str3]
				mov edx, 3
				call fun_0x403424 //调用原函数 call 0x403424
		}
		printf("%s", str3);
		CloseHandle(hsrc);
	}


	return 0;
}

源码

https://download.csdn.net/download/u012332009/11122063

这个实验我没有做成功,分析了下调用的方法中似乎有未初始化的全局变量。

源程序的分析请看

[反汇编练习] 160个CrackMe之044
(出处: 吾爱破解论坛)

你可能感兴趣的:(注册机偷懒写法2、之直接调用源程序的函数)