首页
社区
课程
招聘
[旧帖] [求助]这段代码理解不了...帮帮忙 0.00雪花
发表于: 2007-8-8 19:57 3865

[旧帖] [求助]这段代码理解不了...帮帮忙 0.00雪花

2007-8-8 19:57
3865
void  __stdcall DynLoader()
{
_asm
{
//----------------------------------
        DWORD_TYPE(DYN_LOADER_START_MAGIC)
//----------------------------------
Main_0:
        PUSHAD        // Save the registers context in stack
        CALL Main_1
Main_1:       
        POP EBP
        SUB EBP,OFFSET Main_1 // Get Base EBP
        MOV EAX,DWORD PTR [EBP+_RO_dwImageBase]
        ADD EAX,DWORD PTR [EBP+_RO_dwOrgEntryPoint]

        MOV DWORD PTR [ESP+10h],EAX        // pStack.Ebx <- EAX
        LEA EAX,[EBP+_except_handler1_OEP_Jump]
        MOV DWORD PTR [ESP+1Ch],EAX        // pStack.Eax <- EAX
        POPAD        // Restore the first registers context from stack
                ...
//----------------------------------
        DWORD_TYPE(DYN_LOADER_START_DATA1)
//----------------------------------
_RO_dwImageBase:                                DWORD_TYPE(0xCCCCCCCC)
_RO_dwOrgEntryPoint:                        DWORD_TYPE(0xCCCCCCCC)
//----------------------------------
        DWORD_TYPE(DYN_LOADER_END_MAGIC)
//----------------------------------
}
}

DWORD_TYPE这些只是给二进制代码做标记, 从DWORD_TYPE(DYN_LOADER_START_MAGIC)到DWORD_TYPE(DYN_LOADER_END_MAGIC)之间的二进制将被复制到目标exe中, 目标exe的OEP写在_RO_dwOrgEntryPoint, 通过取这个地址里的内容来完成跳回OEP, 我看不明白的是CALL Main_1, 这个在目标exe能正常执行么?复制过去后地址都变了, 如果可以,那么又何必要算来算去的去取OEP, 直接取_RO_dwOrgEntryPoint不就行了? 难道call 里的标号取的是个相对地址, 与二进制本身的位置无关, 而mov里的标号取的是绝对的地址, 所以不能直接用,要算出实际在目标exe中的地址来..

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
2
自定位。从DOS时代病毒的常用手段。shellcode也常用这种方式
2007-8-9 09:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我不明白call Main_1, 这个与二进制的位置无关么, 不论复制到哪都可以跳到Main_1?
2007-8-9 12:50
0
雪    币: 2401
活跃值: (1402)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
你上面這一段, 不是真實的 EXE 文件, 而是要附加到另一個 EXE 上去用的片斷.
也就是加殻的部份.

程序被系統載入時, Main 及其它 Label 的位址, 我們無法事先知道.
所以要用這對 Call + Pop 來取得執行時當時的實際位址.
然後用底下的程式碼去修正或定位.

希望這樣子您就清楚了.

加油!
2007-8-9 13:14
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢指点!

既然无法知道, 怎么还能去call它? 是不是可以这样理解, call label时, 不是jmp到offset label
而是运行时计算的, 而mov label, 是直接用的offset label, 所以需要我们自己重定位...

因为我觉得这里有个矛盾, 直接call main, 又去计算实际的oep, 对label的使用上, 出现了两种不同的处理方式, 一个直接用, 一个却是考虑了目标exe跟当前exe指令位置的差异
2007-8-9 18:01
0
游客
登录 | 注册 方可回帖
返回
//