首页
社区
课程
招聘
[转帖]转几篇好文章
发表于: 2007-3-20 14:44 4236

[转帖]转几篇好文章

2007-3-20 14:44
4236
以下文章全部转至:农夫的小博客
http://hi.baidu.com/walker05


自己的CPEFile类,自己的PE分析器

情人节这天真是让俺难忘,CPEFile类完成了不少了,获取几个重要的header参数都没有错,做了个截图,明天开始实现结表和节的数据分析.

目前已完成的CPEFile类接口:

DWORD GetEntryPoint(void);
DWORD GetImageBase(void);

DWORD GetBaseOfCode(void);
DWORD GetBaseOfData(void);
DWORD GetSizeOfImage(void);
DWORD GetSizeOfHeaders(void);
DWORD GetSectionAlignment(void);
DWORD GetFileAlignment(void);
WORD GetSubSystem(void);
WORD GetMechineType(void);
WORD GetNumberOfSections(void);
DWORD GetTimeDateStamp(void);
DWORD GetPointerToSymbolTable(void);
DWORD GetNumberOfSymbols(void);
WORD GetSizeOfOptionalHeader(void);
WORD GetCharacteristics(void);

void SetEntryPoint(DWORD dwEntryPoint);
void SetImageBase(DWORD dwImageBase);

void SetBaseOfCode(DWORD dwBaseOfCode);
void SetBaseOfData(DWORD dwBaseOfData);
void SetSizeOfImage(DWORD dwSizeOfImage);
void SetSizeOfHeaders(DWORD dwSizeOfHeaders);
void SetSectionAlignment(DWORD dwSectionAlignment);
void SetFileAlignment(DWORD dwFileAlignment);
void SetSubSystem(WORD dwSubSystem);
void SetMechineType(WORD wMechineType);
void SetNumberOfSections(WORD wNumberOfSections);

void SetTimeDateStamp(DWORD dwTimeDateStamp);
void SetPointerOfSymbolTable(DWORD dwPointerOfSymbolTable);
void SetNumberOfSymbols(DWORD dwNumberOfSymbols);
void SetSizeOfOptionalHeader(WORD wSizeOfOptionalHeader);
void SetCharacteristics(WORD wCharacteristics);

PE文件结构的内容实在太多了......

截了个图,用自己的类写的一个简易的PE分析器和PEEditor对比了一下,数据完全一致,高兴,^_^:


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
2
如何在不结束进程的情况下卸载该进程中的dll模块

还记得俺的威金专杀,当初为了省事,对那个注入的dll都是先TerminateProcess,然后DeleteFile,把那个该死的dll搞定,然后再WinExec把资源管理器进程跑起来。简单倒是挺简单,就是有点太粗鲁了,前几天又查了一下资料,采用远端进程注入的方式解决了这个问题。

//不多解释了吧,提高权限用的,需要获取SE_DEBUG_NAME权限

BOOL EnablePrivilege(HANDLE hToken, LPCSTR szPrivName)
{

TOKEN_PRIVILEGES tkp;

LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改进程权限
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限

return( (GetLastError()==ERROR_SUCCESS) );
}

BOOL UnloadDll(DWORD dwPid, CString strDllName)
{
//获取宿主进程的句柄,注意那几个参数,不然会出错
HANDLE hProcess = OpenProcess(PROCESS_CREATE_THREAD |   \
                            PROCESS_VM_OPERATION  |   \
          PROCESS_VM_WRITE,
          FALSE, dwPid);
if(hProcess == NULL){
  ::MessageBox(NULL, "无法获取进程句柄", "错误", MB_OK | MB_ICONERROR);
  return FALSE;
}

DWORD   dwSize = 0;
DWORD   dwWritten = 0;
DWORD   dwHandle = 0;
         
dwSize = strDllName.GetLength() + 1;//dll的全路径名的长度,待会分配内存要用到的

//向宿主进程分配内存,返回一个指针
LPVOID lpBuf = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);

//如果在宿主进程空间写失败就直接报错闪人
if( !WriteProcessMemory(hProcess, lpBuf, (LPVOID)strDllName.GetBuffer(dwSize), dwSize, &dwWritten)){   
  VirtualFreeEx(hProcess, lpBuf, dwSize, MEM_DECOMMIT);
  CloseHandle(hProcess);
  MessageBox(NULL, "在目标进程中写入失败", "错误", MB_OK | MB_ICONERROR);
  return FALSE;
}

//获取GetModuleHandleA函数地址
LPVOID pFun = GetProcAddress(GetModuleHandle("Kernel32"), "GetModuleHandleA");

//在宿主进程中创建一个远程线程,线程函数为上面导出的GetModuleHandleA,参数为lpBuf指针,还
//记得我们获取的dll全路径不
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFun,
                                        lpBuf, 0, NULL);
  //如果创建线程失败,直接报错闪人
if(hThread == NULL){
  CloseHandle(hProcess);
  ::MessageBox(NULL, "在目标进程创建远程线程失败", "错误", MB_OK | MB_ICONERROR);
        return FALSE;
}

//   等待GetModuleHandle运行完毕   
WaitForSingleObject(hThread, INFINITE);
//   获得GetModuleHandle的返回值   
GetExitCodeThread(hThread, &dwHandle);

//   释放目标进程中申请的空间   
VirtualFreeEx(hProcess, lpBuf, dwSize, MEM_DECOMMIT);
CloseHandle(hThread);

//   使目标进程调用FreeLibraryAndExit,卸载DLL,实际也可以用FreeLibrary,但是我发现前者好一点
pFun = GetProcAddress(GetModuleHandle("Kernel32"), "FreeLibraryAndExitThread");
hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFun,
                           (LPVOID)dwHandle, 0, NULL);   
//   等待FreeLibraryAndExitThread执行完毕   
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
CloseHandle(hProcess);

return TRUE;  //操作成功
2007-3-20 14:46
0
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
3
CPEFile续

又增加了三个接口,不过有两个接口要复杂很多了,

/*nIndex,节序号,从0起,*pImageSectionHeader,IMAGE_SECTION_HEADER类型的指针,用于存放查询数据,这个不麻烦,后面两个才郁闷*/

BOOL QuerySectionInf(int nIndex, IMAGE_SECTION_HEADER *pImageSectionHeader)

BOOL DeleteSection(int nIndex)   //索引从0起

BOOL InsertSection(int nIndex)    //索引从0起

最初设想的BOOL DeleteSection(int nIndex)只是想做成修改结表的那种,但是后来想想反正以后的软件要用到的,不如一次做到位.光修改节表但是不抹节数据,用以前KV300的话说,这个应该叫病毒僵尸吧.我发现目前的国产三大杀软对付worm.win32.delf.bg的时候也都是用的这种方式,会残留一堆垃圾.俺向来主张杀毒要彻底,要杀的像没有感染过一样.昨天调试了一下,还有个边值BUG,处理最后一个节数据的时候会出错.

BOOL InsertSection(int nIndex)最初设想的也简单,直接往最后一个加,这样的话int nIndex参数都可以不要,PEEDITOR还是这种方式,不过......意义......要是能按索引插入的话,意义不是很大,除非想做......病毒......这样还要修改一大堆的PE参数......才能让病毒......有意义.

继续K代码,早点把那个边值K掉.

PS:过年真是麻烦,到处走亲戚,希望最后这个类的完成不要遥遥无期.
2007-3-20 14:46
0
游客
登录 | 注册 方可回帖
返回
//