Hook dll에서 함수 내보내기, 원하는 인삼 또는 인삼 내보내기

3430 단어 역방향
최근 한 채팅 소프트웨어 프로토콜 부분에 역행하여 모든 메시지의 복호화 원문, 밀문, 키를 출력해야 합니다.훅을 통해 훅은 함수의 주소를 내보낸 다음 함수에 들어가기 전에 원하는 인삼을 출력하고 함수가 되돌아올 때 원하는 인삼을 출력합니다.dll 주입 방식을 사용했습니다.역방향 공정의 핵심 원리의 내용을 참고하였다.공통성은 다음과 같습니다.
https://download.csdn.net/download/liutianheng654/10754049
자신의 dll에 대해 hook을 하려면 수정해야 할 파일 부분은 다음과 같습니다.
// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"

#include "gDC_ApiHook.h"
#include 
#include 
#include 
#include 

#pragma comment(lib,"ws2_32.lib")      //      
gDC_ApiHook g_objScaleHook;
gDC_ApiHook g_objCoreHook;
FILE *fp = NULL;

char buf[] = {0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05 };
char zero[] = {0x00, 0x00, 0x00,0x00, 0x00, 0x00,0x00, 0x00, 0x00,0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00};    //    ,        ,   。
typedef unsigned int (*AOUT_FILTERSPLAY) (int *in, __m128 *out, unsigned int flag, int param, const __m128i *param2);     //        。         hook       ,       。          ,         stdcall  。

//            ,          。                。
unsigned int gDC_aout_FiltersPlay (int *in, __m128 *out, unsigned int flag, int param, const __m128i *param2)
{
	AOUT_FILTERSPLAY oldFileterPlay = NULL;
	oldFileterPlay = (AOUT_FILTERSPLAY)(g_objCoreHook.GetCallAddress());
	CString str;
	if(flag == 5)
	{
		int len = *in;

		
		int length = ntohl(len);
		fwrite(buf,1,16,fp);
		str.Format("%d",length);
		MessageBox(NULL, str,"len", MB_OK);
		int temp = length%16+2;
		str.Format("%d",temp);
		MessageBox(NULL, str,"yu", MB_OK);
		fwrite(in,1,length,fp);
		fwrite(zero,1,temp,fp);
		fwrite(param2,1,16,fp);
	}
	//          
    //          ,         
	unsigned int p = oldFileterPlay(in, out, flag, param, param2);
	if(flag == 5)
	{
		fwrite(buf,1,16,fp);
		fwrite(out,1,64,fp);
		fwrite(buf,1,16,fp);
		fflush(fp);
	}
	return p;
}

void hook()
{
	fp = fopen("C:\\Users\\liuti\\Downloads\\out\\test", "wb");
    //    ,                   。          ,           。
	/*HMODULE hMod = GetModuleHandle("libvlccore.dll");
	if (NULL == hMod)
	{
		MessageBox(NULL, "no Core module", "tip", MB_OK);
		return ;
	}

	int addr = (int)GetProcAddress(hMod, "aout_FiltersPlay");
	g_objCoreHook.HookApi((char*)addr, (char*)gDC_aout_FiltersPlay);*/
	HMODULE hMod = GetModuleHandle("WeChatWin.dll");//dll  
	if (NULL == hMod)
	{
		MessageBox(NULL, "no Scale module", "tip", MB_OK);
		return ;
	}

	int addr = ((int)hMod) + 0x215A0;//    
	g_objCoreHook.HookApi((char*)addr, (char*)gDC_aout_FiltersPlay);
	//g_objScaleHook.HookApi((char*)addr, (char*)gDC_DoWork);
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		hook();
		break;
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
		break;
	case DLL_PROCESS_DETACH:
		fclose(fp);
		break;
	}
	return TRUE;
}


모두 두 개의exe로 나뉘는데, 하나는 훅의 dll이고, 바로 위의 긴 코드가 생성된 것이다.
하나는 dll 주입 함수입니다. 위에서 작성한 훅을 dll로 exe에 주입하는 데 사용됩니다. 사용 방식은 다음과 같습니다.
InjectDll.exe 276748 C:\Users\liuti\Downloads\ApiHook\ApiHook\Release\ApiHook.dll

이 중 276748은 주입된 exe의 현재 Pid입니다.

좋은 웹페이지 즐겨찾기