技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 551|回复: 5
收起左侧

【C】wow64 切 w64

[复制链接]

25

主题

81

帖子

1090

积分

用户组: 版主

UID
1821
精华
6
威望
57 点
宅币
834 个
贡献
31 次
宅之契约
0 份
在线时间
196 小时
注册时间
2016-7-12
发表于 2017-3-19 11:46:41 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
本帖最后由 Ayala 于 2017-3-22 10:41 编辑

[C] 纯文本查看 复制代码
#define __STDC__ 1
#include "ntddk.h"
#include "ntimage.h"

/***********************************************************************/
/* shell code start */
/* linker command must append /MERGE:S_CODE=S_DATA /SECTION:S_DATA,RWE */
/***********************************************************************/
void GetRing3Base_m();
/*shellcode Global DATA*/

#pragma data_seg("S_DATA")

__int64    shell_data_sign_S=0;//sign data 
__int64     k_Base=0;
__int64     n_Base=0;
__int64    shell_data_sign_E=0; //sign data

#pragma code_seg("S_CODE")

/*shlleocde entry*/
int shell_start(__int64* pf,char** pfn,__int64 pfmax)        // sign code start
{
        __int64 i;
        GetRing3Base_m();
        for (i=0;i<pfmax;i++)
        {
                GetProcAddress_m(n_Base,pfn[i],&pf[i]);
        }
        
        return i;
}

int strlen_m(char* s)
{
  int i=0;
  for(;s[i++];);
  return i;
}

int strcmp_m(char* s1,char* s2)
{
  int t,ta,tb;
  t|=-1;
  ta=strlen_m(s1);
  tb=strlen_m(s2);
  if (ta==tb)
  {
    t=ta;
    do
    {
      --t;
    }while (t>=0 && s1[t]==s2[t]);
    t++;
  }
  return t; 
}

/*get kernel32 and ntdll base*/
void GetRing3Base_m()
{
 __int64 p; 
   p=*(__int64*)(*(__int64*)(*(__int64 *)(__readgsqword(0x30)+0x60)+0x18)+0x30);
   n_Base=*(__int64*)(p+0x10);
   k_Base=*(__int64*)(*(__int64*)(*(__int64*)p)+0x10);
}
int GetProcAddress_m(__int64 base,char* FuncName,__int64* FuncAddr)
{
  __int64 addr=0;
  __int32* AddressOfNames;
  __int32* AddressOfFunctions;
  __int16* AddressOfNameOrdinals;
  IMAGE_DOS_HEADER*         DOS_HEADER;
  IMAGE_NT_HEADERS64*       NT_HEADER;
  IMAGE_OPTIONAL_HEADER64*  OptionalHeader;
  IMAGE_EXPORT_DIRECTORY*   Export;
  int i,n,t;
  char* Dst;
  char* Src;
  
  if (!base || !FuncName) goto done;
  DOS_HEADER=(IMAGE_DOS_HEADER*)(__int64)base;
  if (DOS_HEADER->e_magic!='ZM') goto done;
  
  NT_HEADER = (IMAGE_NT_HEADERS64*)((__int64)DOS_HEADER +(__int64)DOS_HEADER->e_lfanew);
  
  if (NT_HEADER->Signature!='EP') goto done;
  
  OptionalHeader=&NT_HEADER->OptionalHeader;
  
  if (OptionalHeader->Magic!=0x20B) goto done;//pe 64
  
  Export = (IMAGE_EXPORT_DIRECTORY*)(\
            (__int64)DOS_HEADER + \
            (__int64)(OptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress)\
            );
  t=Export->NumberOfNames;
  AddressOfNameOrdinals =(__int16*)((__int64)DOS_HEADER + (__int64)Export->AddressOfNameOrdinals);
  AddressOfNames        =(__int32*)((__int64)DOS_HEADER + (__int64)Export->AddressOfNames);
  AddressOfFunctions    =(__int32*)((__int64)DOS_HEADER + (__int64)Export->AddressOfFunctions);
  Src=FuncName;
  for (i=0;i<t;i++)
  {
    Dst=(char*)((__int64)DOS_HEADER + AddressOfNames[i]);
    if (Dst[0]==Src[0]&& strcmp_m(Src,Dst)==0)
    {
      n=AddressOfNameOrdinals[i];
      addr=(__int64)DOS_HEADER+AddressOfFunctions[n];
      goto done;
    }
  }
done:
  *FuncAddr=addr;
  return (addr?1:0);
}


#pragma code_seg()
#pragma data_seg()

#include "..\beaengine\headers\BeaEngine.h"

struct FILE* __cdecl fopen();

main() 
{ 
        DISASM diasm={0};
        struct FILE* file=fopen("shellcode.h","wt+");
        __int64 i,j,k;
        
        printf("shellcode start %llx \nend %llx \ndata start %llx \nlength = %d\n",\
                        &shell_start,\
                        &shell_data_sign_S,\
                        &shell_data_sign_E,\
                        (__int64)&shell_data_sign_S-(__int64)&shell_start);
        
        fprintf(file,"unsigned char shellcode[] = {\n");
        for (diasm.Archi=64,k=(__int64)&shell_start;k < (__int64)&shell_data_sign_S;k+=j)
        {
                diasm.EIP=k;
                j=Disasm(&diasm);
                fprintf(file,"\t\t");
                for (i=0;i<j;i++) fprintf(file,"0x%.2X,",*(unsigned char*)(k+i));
                fprintf(file,"% *s\t// %s\n",max(50-j*5,0),"",&diasm.CompleteInstr);
        }
        
        for (j=8,k=(__int64)&shell_data_sign_S;k<(__int64)&shell_data_sign_E;k+=j)
        {
                fprintf(file,"\t\t");
                for (i=0;i<j;i++) fprintf(file,"0x%.2X,",*(unsigned char*)(k+i));
                fprintf(file,"\n");
        }
        fprintf(file,"\t\t0\n};\n");
        
        fprintf(file,"#define wow64GetProcAddress_m &shellcode[0x%lx]\n",(char*)&GetProcAddress_m - (char*)&shell_start);
        fprintf(file,"#define wow64GetRing3Base_m   &shellcode[0x%lx]\n",(char*)&GetRing3Base_m - (char*)&shell_start);
        fprintf(file,"#define wow64kernel32_64 &shellcode[0x%lx]\n",(char*)&k_Base - (char*)&shell_start);
        fprintf(file,"#define wow64ntdll_64    &shellcode[0x%lx]\n",(char*)&n_Base - (char*)&shell_start);
        
        
        fclose(file);

        system("pause");
}

用wrk自带tool编译可以不会打乱变量声明顺序
[PowerShell] 纯文本查看 复制代码
@echo off
:re
cls
echo /*********************************************/
echo /             shellcode                       /
echo /*********************************************/
set path=F:\WinDDK\7600.16385.1
set obj=obj\amd64\BeaEngine.obj

set Compiler=.\tools\amd64\cl.exe
set linker=.\tools\amd64\link.exe

set ddkCompiler=%path%\bin\x86\amd64\cl.exe
set ddklinker=%path%\bin\x86\amd64\link.exe

set name=shellcode

%Compiler% .\src\%name%.c /D"_AMD64_" /I"%path%\inc\ddk" /I"%path%\inc\api" /I"%path%\inc\crt" /Fa"Debug\%name%.asm" /Fo"Debug\%name%.obj" /c /wd"4615" /wd"4616" /D"BEA_ENGINE_STATIC" /Od
 
echo /*********************************************/
echo /            compile end                      /
echo /*********************************************/
 

%linker% .\Debug\%name%.obj %obj% /MERGE:S_CODE=S_DATA /SECTION:S_DATA,RWE /LIBPATH:"%path%\lib\win7\amd64" /LIBPATH:"%path%\lib\Crt\amd64"  /OUT:"Debug\%name%.exe" /SUBSYSTEM:CONSOLE /MACHINE:AMD64 /IGNORE:4078
echo /*********************************************/
echo /            build end                        /
echo /*********************************************/
 
 
pause

goto re


[C] 纯文本查看 复制代码
#include "shellcode.h"
#include "wow64.h"

__int64 _thunk_w64_data_list[]={
        (__int64)wow64ntdll_64,
        (__int64)wow64kernel32_64
}; 

__int64 _thunk_w64_func_list[index_wow64_max]={
        0
};
__int64 _thunk_w64_args_list[index_wow64_max]={
        8*32
};



void __declspec(naked) __fastcall _thunk_wow64_dispatch()
{
        __asm ret
}
void __declspec(naked) __fastcall _thunk_w64_to_wow64()
{
        __asm
        {
                mov esp,ebx 
                inc eax
                mov ebx,[esp]
                add esp,8
                
                sub esp,8
                mov dword ptr [esp+0],offset _thunk_wow64_dispatch
                mov dword ptr [esp+4],23h
                retf
        }
}
void __declspec(naked)  __fastcall _thunk_w64_invoke()
{
        __asm
        {
                
                cmp dword ptr [esp],8*1
                dec eax
                cmovae ecx,[esp+0x10]
                
                cmp dword ptr [esp],8*2
                dec eax
                cmovae edx,[esp+0x18]
                
                cmp dword ptr [esp],8*3
                dec esp
                cmovae eax,[esp+0x20]
                
                cmp dword ptr [esp],8*4
                dec esp
                cmovae ecx,[esp+0x28]
                
                add esp,8
                dec eax
                jmp eax
        }
}

void __declspec(naked) __fastcall _thunk_wow64_to_w64()
{
        __asm
        {
                sub esp,8
                mov [esp],ebx
                mov ebx,esp
                
                /*alloc stack*/
                mov ecx,dword ptr _thunk_w64_args_list[eax*8]
                sub esp,ecx
                and esp,-16
                
                /*strmov args*/
                mov edi,esp
                mov esi,edx
                rep movsb
                
                /*set return address*/
                sub esp,8
                mov dword ptr [esp],offset _thunk_w64_to_wow64
                mov dword ptr [esp+4],0
                
                /*log args*/
                mov ecx,dword ptr _thunk_w64_args_list[eax*8]
                sub esp,8
                mov [esp],ecx

                /*set tag func*/
                mov eax,dword ptr _thunk_w64_func_list[eax*8]
                
                /*jmp tag proc*/
                sub esp,8
                mov dword ptr [esp+0],offset _thunk_w64_invoke
                mov dword ptr [esp+4],33h
                retf
        }
}

void __declspec(naked) wow64initEx(__int64 pf,__int64 pfn,__int64 pfmax)
{
        __asm
        {
                lea edx,[esp+4]
                xor eax,eax
                call _thunk_wow64_to_w64
                ret
        }
}


void wow64init()
{
        _thunk_w64_func_list[0]=(__int64)&shellcode;
        _thunk_w64_args_list[0]=3*8;
        wow64initEx((__int64)&_thunk_w64_func_list,(__int64)&_thunk_w64_pfn_list,(__int64)index_wow64_max);
}



#define w64bywow64(_s_) \
int __declspec(naked) wow64 ## _s_ ## () \
{ \
        __asm lea edx,[esp+4] \
        __asm mov eax,index ## _s_ \
        __asm call _thunk_wow64_to_w64 \
        __asm ret \
}



int main()
{
        int i;
        //__asm int 3
        wow64init();
        //__asm int 3
        for (i=0;i<index_wow64_max;i++)
        {
                printf("0x%llx   %s\n",_thunk_w64_func_list[i],_thunk_w64_pfn_list[i]);
        }
        
        printf("done\n");
        system("pause");
        return 0;
}

beaengine.obj source
https://github.com/BeaEngine/beaengine

shellcode.c

8.71 KB, 下载次数: 0

hello_world.c

4.85 KB, 下载次数: 0

wow64.h

47.47 KB, 下载次数: 0

shellcode.h

19.76 KB, 下载次数: 0

BeaEngine.obj

506.13 KB, 下载次数: 0

本帖被以下淘专辑推荐:

995

主题

2207

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
197
威望
261 点
宅币
16463 个
贡献
32446 次
宅之契约
0 份
在线时间
1565 小时
注册时间
2014-1-26
发表于 2017-3-21 21:48:38 | 显示全部楼层
居然有obj
回复

使用道具 举报

25

主题

81

帖子

1090

积分

用户组: 版主

UID
1821
精华
6
威望
57 点
宅币
834 个
贡献
31 次
宅之契约
0 份
在线时间
196 小时
注册时间
2016-7-12
 楼主| 发表于 2017-3-21 23:36:09 | 显示全部楼层

经典反汇编引擎!

995

主题

2207

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
197
威望
261 点
宅币
16463 个
贡献
32446 次
宅之契约
0 份
在线时间
1565 小时
注册时间
2014-1-26
发表于 2017-3-22 06:14:07 | 显示全部楼层
Ayala 发表于 2017-3-21 23:36
经典反汇编引擎!

嗯我知道这玩意儿。

0

主题

52

帖子

124

积分

用户组: 小·技术宅

UID
1291
精华
0
威望
2 点
宅币
67 个
贡献
1 次
宅之契约
0 份
在线时间
1 小时
注册时间
2015-11-25
发表于 2017-3-22 20:24:52 | 显示全部楼层
回复

使用道具 举报

0

主题

52

帖子

124

积分

用户组: 小·技术宅

UID
1291
精华
0
威望
2 点
宅币
67 个
贡献
1 次
宅之契约
0 份
在线时间
1 小时
注册时间
2015-11-25
发表于 2017-3-22 20:25:25 | 显示全部楼层
回复

使用道具 举报

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2018-9-24 08:01 , Processed in 0.121868 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表