diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dae5936 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +_codeql_detected_source_root diff --git a/ShellCode_Main/ShellCode_Main.c b/ShellCode_Main/ShellCode_Main.c index 4c11608..06f2039 100644 --- a/ShellCode_Main/ShellCode_Main.c +++ b/ShellCode_Main/ShellCode_Main.c @@ -1,4 +1,4 @@ -// ShellCode_Main.cpp : ¶¨Òå¿ØÖÆÌ¨Ó¦ÓóÌÐòµÄÈë¿Úµã¡£ +// ShellCode_Main.cpp : �������̨Ӧ�ó������ڵ㡣 // #include "shellcode_base.h" @@ -20,16 +20,16 @@ typedef unsigned int (__cdecl * _unpack)(const void *source, unsigned int srclen #pragma pack(push) #pragma pack(1) typedef struct main_config { - uint8_t invokeMode; // 0 = µ÷ÓÃdllmain lpReserved[param], 1 = ·µ»Øµ¼³öº¯ÊýµØÖ· - uint32_t depackCodeOffset; // ½âѹËõ´úÂëÆ«ÒÆ Æ«ÒÆÁ¿»ùÓÚmain_config¿ªÊ¼ - uint32_t unpackSize; // δѹËõʱµÄ´óС - uint32_t packedSize; // ѹËõºóµÄ´óС - uint32_t dllDataOffset; // dllÊý¾ÝÆ«ÒÆ Æ«ÒÆÁ¿»ùÓÚmain_config¿ªÊ¼ - char param[100]; // dllmain²ÎÊý»òµ¼³öº¯ÊýÃû³Æ + uint8_t invokeMode; // 0 = ����dllmain lpReserved[param], 1 = ���ص���������ַ + uint32_t depackCodeOffset; // ��ѹ������ƫ�� ƫ��������main_config��ʼ + uint32_t unpackSize; // δѹ��ʱ�Ĵ�С + uint32_t packedSize; // ѹ����Ĵ�С + uint32_t dllDataOffset; // dll����ƫ�� ƫ��������main_config��ʼ + char param[100]; // dllmain�����òµ¼³ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ } main_config_t, *main_config_p; #pragma pack(pop) -// ·ÀÖ¹VS×Ô´øµÄºêÌæ»» +// ��ֹVS�Դ��ĺ��滻 #ifdef RtlZeroMemory # undef RtlZeroMemory #endif // RtlZeroMemory @@ -173,15 +173,19 @@ int memory_loadlibrary(func_p func, void *dll_buf, void *dll_param, char *export if (dataDict->VirtualAddress != 0) { PIMAGE_TLS_DIRECTORY tls = cast_offset(PIMAGE_TLS_DIRECTORY, base, dataDict->VirtualAddress); PIMAGE_TLS_CALLBACK *callback = (PIMAGE_TLS_CALLBACK *)tls->AddressOfCallBacks; - while (callback != 0) { - (*callback)(base, DLL_PROCESS_ATTACH, 0); - callback++; + if (callback != 0) { + while (*callback != 0) { + (*callback)(base, DLL_PROCESS_ATTACH, 0); + callback++; + } } } // call entry - pfnDllMain dllmain = cast_offset(pfnDllMain, base, nth->OptionalHeader.AddressOfEntryPoint); - if (dllmain != 0) { - dllmain(base, DLL_PROCESS_ATTACH, dll_param); + if (nth->OptionalHeader.AddressOfEntryPoint != 0) { + pfnDllMain dllmain = cast_offset(pfnDllMain, base, nth->OptionalHeader.AddressOfEntryPoint); + if (dllmain != 0) { + dllmain(base, DLL_PROCESS_ATTACH, dll_param); + } } // get export function address if (export_name == 0 || function == 0) return 1; @@ -193,7 +197,7 @@ int memory_loadlibrary(func_p func, void *dll_buf, void *dll_param, char *export uint32_t *fn = cast_offset(uint32_t *, base, exportDict->AddressOfNames); uint32_t *fa = cast_offset(uint32_t *, base, exportDict->AddressOfFunctions); uint16_t *ord = cast_offset(uint16_t *, base, exportDict->AddressOfNameOrdinals); - for (uint32_t i = 0; i < exportDict->NumberOfFunctions; i++) { + for (uint32_t i = 0; i < exportDict->NumberOfNames; i++) { char *name = cast_offset(char *, base, fn[i]); if (func->lstrcmpiA(name, export_name) == 0) { *function = cast_offset(void *, base, fa[ord[i]]); @@ -213,7 +217,7 @@ void *main_main() { void *dllData = (void *)((uint8_t *)config + config->dllDataOffset); void *function = 0; int needFree = 0; - // ½âѹ + // ��ѹ if (config->depackCodeOffset != 0) { _unpack unpack = (_unpack)((uint8_t *)config + config->depackCodeOffset); void *unpackedData = func.VirtualAlloc(0, config->unpackSize, MEM_COMMIT, PAGE_READWRITE); diff --git a/ShellCode_Main/shellcode_base.c b/ShellCode_Main/shellcode_base.c index 0d8e663..af90651 100644 --- a/ShellCode_Main/shellcode_base.c +++ b/ShellCode_Main/shellcode_base.c @@ -156,16 +156,19 @@ HMODULE get_kernel32_base() { #else peb = (_PPEB)__readfsdword(0x30); #endif - LIST_ENTRY *entry = peb->pLdr->InMemoryOrderModuleList.Flink; - while (entry) { + LIST_ENTRY *head = &peb->pLdr->InMemoryOrderModuleList; + LIST_ENTRY *entry = head->Flink; + while (entry && entry != head) { PLDR_DATA_TABLE_ENTRY e = (PLDR_DATA_TABLE_ENTRY)entry; - if (calc_hashW2(e->BaseDllName.pBuffer, e->BaseDllName.Length / 2) == Kernel32Lib_Hash) { - return (HMODULE)e->DllBase; + if (e->BaseDllName.pBuffer != 0 && e->BaseDllName.Length > 0) { + if (calc_hashW2(e->BaseDllName.pBuffer, e->BaseDllName.Length / 2) == Kernel32Lib_Hash) { + return (HMODULE)e->DllBase; + } } entry = entry->Flink; -} + } return 0; -}; +} // BKDRHash uint32_t calc_hash(char *str) { diff --git a/ShellCode_Ntdll/shellcode_base.c b/ShellCode_Ntdll/shellcode_base.c index 0d8e663..af90651 100644 --- a/ShellCode_Ntdll/shellcode_base.c +++ b/ShellCode_Ntdll/shellcode_base.c @@ -156,16 +156,19 @@ HMODULE get_kernel32_base() { #else peb = (_PPEB)__readfsdword(0x30); #endif - LIST_ENTRY *entry = peb->pLdr->InMemoryOrderModuleList.Flink; - while (entry) { + LIST_ENTRY *head = &peb->pLdr->InMemoryOrderModuleList; + LIST_ENTRY *entry = head->Flink; + while (entry && entry != head) { PLDR_DATA_TABLE_ENTRY e = (PLDR_DATA_TABLE_ENTRY)entry; - if (calc_hashW2(e->BaseDllName.pBuffer, e->BaseDllName.Length / 2) == Kernel32Lib_Hash) { - return (HMODULE)e->DllBase; + if (e->BaseDllName.pBuffer != 0 && e->BaseDllName.Length > 0) { + if (calc_hashW2(e->BaseDllName.pBuffer, e->BaseDllName.Length / 2) == Kernel32Lib_Hash) { + return (HMODULE)e->DllBase; + } } entry = entry->Flink; -} + } return 0; -}; +} // BKDRHash uint32_t calc_hash(char *str) {