自定义wegame入口
工具
调试工具: x64dbg
二进制编辑器:010 Editor
PE工具: Stud_PE
dump工具: Scylla
基本思路
修改wegame的入口点,优先执行自定义的dll导出的函数,验证通过后再跳转回原始的wegame入口点执行下去,如果验证不通过将直接exit掉
操作流程
使用Stud_PE添加"YourFatherServer.dll"导出的"_entry@0"函数
在wegame.exe的.text段中找一段足够长的空白区域来存放添加的新代码,这段代码这里可以把它叫做shellcode
用010 Editor配合正则来从wegame.exe中搜索,找到空白区域在.text的相对偏移记录下来。要加入的shellcode大概有170多字节,所以最好找一块180字节的空白区域。空白指令可以用int3、nop或者0x00来定位,正则如下:
1
(?<!\xcc)(\xcc){180}或(?<!\x00)(\x00){180}
要注意的是空白区域得是.text段的,找到后把这块区域的起始文件偏移减去.text段的起始文件偏移,得到这块空白区域在.text段的相对偏移。进入调试模式后,把.text段的起始虚拟地址加上这个偏移量就可以得到空白区域在内存的虚拟地址了。如果没有找到这么大的空白区域可以用Stud_PE加入一个新的.text段,把shellcode放到这里
使用x32dbg挂起wegame.exe,运行到wegame.exe的OEP处,并把OEP记录下来
查看进程的内存布局获取进程的基址,把这个地址跟第二步记录的空白区域偏移地址相加,得到空白区域的虚拟地址,把这个地址叫做fill_point
跳转到fill_point,把shellcode复制到这里,这段shellcode分成两部分,一部分是数据另一部分是代码,数据放着两个字符串,一个是"YourFatherServer.dll",另一个是"_entry@0",这在shellcode获取entry地址的时候要用。把代码部分的开始部分的地址记录下来,叫做shellcode_entry
回到OEP,往下找到第一个call指令,并把它的跳转地址记录下来,叫做origin_routine。然后把跳转地址修改为shellcode_entry
再跳到shellcode_enetry,并把最后一条jmp指令的跳转地址修改为origin_routine
打开Scylla,填入之前记录的OEP,点击
重新查找导入表,再点击 获取导入表,最后点击 转存出去
shellcode依赖kernelbase.dll的函数的入口RVA
GetModuleHandleA:0x11CCE0
GetProcAddress: 0x1171C0
exit: 0x16E0D0
shellcode栈帧分布
1 | dword ptr [ebp - 4] # 进程基地址 |
shellcode需要根据实际情况调整的地方
shellcode最后的jmp的跳转地址要在调试时根据实际情况调整
shellcode
1 | # |
shellcode的机器指令十六进制流
直接用这串来在调试的时候拷贝进去
1 | 596F75724661746865725365727665722E646C6C005F656E7472794030000000558BEC83EC18575651508D7DE8B906000000B8CCCCCCCCF3AB64A1300000008B4808894DFC8B400C8B701CAD8B40088945F8B8E0CC11000345F88945F4B8C07111000345F88945F0E800000000588BC883E96D894DEC8BC883E958894DE88B45EC50FF55F48BC88B45E85051FF55F083F800750AB8D0E016000345F86A00FFD058595E5F83C4185DE97440FFFF |