Masquer les appels d’API externes C ++

J’ai un code en C ++ qui appelle des fonctions de la bibliothèque externe. La fonction que j’ai appelée est CreateProcess comme ci-dessous.

CreateProcess(NULL,pProcessName,NULL,NULL,false,CREATE_SUSPENDED, NULL,NULL,&suStartUpInformation,&piProcessInformation) 

Maintenant, lorsque je comstack le code et le dissemble, l’assembly affiche le texte brut sous la forme CreateProcess (args1, args2, …) . Existe-t-il un moyen de masquer ou de chiffrer l’appel de fonction à l’API afin que, si quelqu’un le dissocie, il ne saura jamais quelles fonctions sont appelées.

Merci!

Toute fonction imscope par nom aura toujours le nom incorporé dans le binary (dans le descripteur d’importation thunk pour être exact), les informations détaillées sur les parameters sont obtenues à partir des pdbs, comme l’a mentionné Steve (toutefois, l’parsing de débogueurs comme ollydbg permet de déduire des arguments). le nom du symbole étant disponible). Le seul moyen d’éviter ce GetModuleHandle consiste à chiffrer IAT (à l’aide d’éditeurs, de virtualiseurs, de systèmes de protection binarys, etc., comme énigme) ou à utiliser une version personnalisée de GetModuleHandle (essentiellement un outil de GetProcAddress PEB) et de GetProcAddress (un outil de GetProcAddress PE). cette fois), puis en stockant tous les appels d’API dont vous avez besoin sous forme de chaînes chiffrées au moment de l’exécution, vous pouvez appeler tout ce dont vous avez besoin sans que le texte en clair ne vous le signale (la sécurité le fait, même s’il utilise directement GetProcAddress , avec quelques obscurcissements binarys).

Mettre à jour:

pour les chaînes ‘obfusquées’ au moment de la compilation, vous pouvez utiliser quelque chose comme ceci (très simple, mais il devrait être portable, si vous utilisez C ++ 0x, c’est beaucoup plus facile):

 #define c(x) char((x) - 1) //really simple, complexity is up to the coder #define un(x) char((x) + 1) typedef int (WINAPI* MSGBOX)(HWND, LPCSTR, LPCSTR, UINT); const int ORD_MASK = 0x10101010; const char szMessageBoxA[] = {c('M'),c('e'),c('s'),c('s'),c('a'),c('g'),c('e'),c('B'),c('o'),c('x'),c('A')}; FARPROC GetProcAddressEncrypted(HMODULE hModule, const char* szName, BOOL bOrd = FALSE) { if(bOrd) return GetProcAddress(hModule,reinterpret_cast(reinterpret_cast(szName) ^ ORD_MASK)); //this requires that ordinals be stored as ordinal ^ ORD_MASK char szFunc[128] = {'\0'}; for(int i = 0; *szName; i++) szFunc[i] = uc(*szName++); return GetProcAddress(hModule,szName); } MSGBOX pfMsgBox = static_cast(GetProcAddressEncrypted(GetHandleEncrypted(szUser32),szMessageBox)); 

Vous pouvez éventuellement utiliser EncodePointer de EncodePointer pour masquer les valeurs dans les pointeurs de fonction globaux (n’oubliez pas d’utiliser DecodePointer lorsque vous les appelez).

note: le code n’a pas été testé, il vient juste de me tomber dessus

Vous pouvez utiliser des liens dynamics. Sous Windows, utilisez LoadLibrary, LoadLibraryEx, GetProcAddress. Maintenant, dans votre code, incluez une forme sous une forme obscure de nom au lieu des noms réels de lib / symbol et unofuscate au moment de l’exécution.

Vous pouvez utiliser la répartition dynamic (pointeurs de fonction) pour que la fonction appelée ne puisse pas être déduite facilement du code.

Vous pouvez déléguer le travail d’appel de cette fonction à un autre thread (en utilisant un mécanisme IPC).

Mais c’est assez inutile, en utilisant un débogueur, il sera très simple de trouver que cette fonction a été appelée. Et il sera très simple de détecter qu’un processus a été créé.

D’accord! voici la solution. Disons que je veux appeler “MessageBoxA” à partir de “user32.dll”. Alors voici comment je vais le faire en utilisant LoadLibraryA & GetProcAddress .

 //Ok here you can see. //I am passing DLL name(user32.dll) and DLL function(MessageBoxA) as Ssortingng //So I can also perform Encrypt & Decrypt operation on Ssortingngs and obfuscate it. //Like i can encrypt the ssortingng "user32.dll" and at runtime decrypt it and pass it as //an argument to "LoadLibraryA" and same for the Function name "MessageBoxA". //The code is comstackd in DevC++ 4.9.9.2. #include  #include  using namespace std; void HelloWorld() { char* szMessage = "Hello World!"; char* szCaption = "Hello!"; HMODULE hModule = LoadLibraryA( "user32.dll" ); FARPROC fFuncProc = GetProcAddress( hModule, "MessageBoxA" ); ( ( int ( WINAPI *)( HWND, LPCSTR, LPCSTR, UINT ) ) fFuncProc )( 0, szMessage, szCaption, 0 ); } int main() { HelloWorld(); }