免杀技巧之API动态调用技术

admin 2022年3月8日09:50:52评论173 views字数 2199阅读7分19秒阅读模式

什么是动态加载?

简单的来说就是自己找到LoadLibary以及GetProcAddress函数来自行加载函数以及dll。通常在shellcode编写中使用。

前置知识了解

在RING3下FS寄存器指向TEB也就是线程结构体,大致结构如下:

在TEB+0x30处就是PEB也就是进程结构体,大致如下:

PEB+0xC的位置就是PEBLDR_DATA结构体,里面包含了dll加载链,结构体如下:

其中的 InInitializationOrderModuleList这个链表第二个必定是kernel32.dll。

思路:

  1. 在 InInitializationOrderModuleList找到kerbel32.dll基址

  1. __asm{


  2. mov eax, fs: [0x30] ; 获取PEB

  3. mov eax, [eax + 0xc]; 获取_PEB_LDR_DATA

  4. mov eax, [eax + 0x1c]; 获取LDR

  5. mov eax, [eax]; 获取kernel32模块

  6. mov eax, [eax + 0x8];kernel32模块


  7. }

  1. 通过解析Kernel32模块获取名称表、地址表、序号表

  1. mov KernelBase, eax;

  2. mov edx, [eax + 0x3c]

  3. add edx, eax

  4. mov edx, [edx + 0x78]

  5. add edx, eax //导出表

  6. mov ebx, [edx + 0x1c]

  7. add ebx, eax

  8. mov AddressTab, ebx //地址表

  9. mov ebx, [edx + 0x20]

  10. add ebx, eax

  11. mov NameTab, ebx //名称表

  12. mov ebx, [edx + 0x24]

  13. add ebx, eax

  14. mov IdTab, ebx //序号表

  15. xor ebx,ebx

  1. 获取对比函数名称HASH值:

  1. next_function_loop:

  2. inc edi

  3. mov esi,NameTab

  4. mov esi,[edi * 0x4 + esi]

  5. add esi, KernelBase

  6. cdq


  7. hash_loop: //加密函数名

  8. movsx eax,[esi]

  9. cmp al,ah

  10. jz compare_hash

  11. ror edx,7

  12. add edx,eax

  13. inc esi

  14. jmp hash_loop

  1. 通过序号返回目标函数地址:

  1. compare_hash :

  2. cmp edx, hash

  3. jnz next_function_loop

  4. xor ecx,ecx

  5. mov esi, IdTab

  6. mov cx,[edi * 2 + esi]

  7. mov edx, AddressTab

  8. mov esi,[edx+edi*4]

  9. mov eax, KernelBase

  10. lea eax,[esi+ eax]

  11. mov FuncAddr,eax

完整函数如下:

  1. DWORD GetFuncAddr(DWORD hash)

  2. {

  3. DWORD IdTab;

  4. DWORD AddressTab;

  5. DWORD NameTab;

  6. DWORD KernelBase;

  7. DWORD FuncAddr = 0;

  8. __asm {

  9. pushad

  10. mov eax, fs: [0x30] ; 获取PEB

  11. mov eax, [eax + 0xc]; 获取_PEB_LDR_DATA

  12. mov eax, [eax + 0x1c]; 获取LDR

  13. mov eax, [eax]; 指向第二个元素

  14. mov eax, [eax + 0x8]; kernel32模块基址

  15. mov KernelBase, eax;

  16. mov edx, [eax + 0x3c]

  17. add edx, eax

  18. mov edx, [edx + 0x78]

  19. add edx, eax //导出表

  20. mov ebx, [edx + 0x1c]

  21. add ebx, eax

  22. mov AddressTab, ebx //地址表

  23. mov ebx, [edx + 0x20]

  24. add ebx, eax

  25. mov NameTab, ebx //名称表

  26. mov ebx, [edx + 0x24]

  27. add ebx, eax

  28. mov IdTab, ebx //序号表

  29. xor ebx, ebx

  30. xor edi, edi

  31. next_function_loop:

  32. inc edi

  33. mov esi,NameTab

  34. mov esi,[edi * 0x4 + esi]

  35. add esi, KernelBase

  36. cdq


  37. hash_loop: //加密函数名

  38. movsx eax,[esi]

  39. cmp al,ah

  40. jz compare_hash

  41. ror edx,7

  42. add edx,eax

  43. inc esi

  44. jmp hash_loop


  45. compare_hash :

  46. cmp edx, hash

  47. jnz next_function_loop

  48. xor ecx,ecx

  49. mov esi, IdTab

  50. mov cx,[edi * 2 + esi]

  51. mov edx, AddressTab

  52. mov esi,[edx+edi*4]

  53. mov eax, KernelBase

  54. lea eax,[esi+ eax]

  55. mov FuncAddr,eax



  56. }

  57. return FuncAddr;

  58. }

弹窗:

  1. MYGetProcAddress my = (MYGetProcAddress)GetFuncAddr(GetHash("GetProcAddress"));

  2. MyLoadLibrary myload = (MyLoadLibrary)GetFuncAddr(GetHash("LoadLibraryExA"));

  3. HANDLE handle = myload("User32.dll", NULL, NULL);

  4. MyMessageBox msg = (MyMessageBox)my(handle, "MessageBoxA");

  5. msg(NULL, "123", "123", MB_OK);

  6. return 0;

为防止恶意利用 部分代码存在BUG,自行修改即可

微信群:

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年3月8日09:50:52
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   免杀技巧之API动态调用技术http://cn-sec.com/archives/820732.html

发表评论

匿名网友 填写信息