- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在启动一个类似项目的保护器/打包器/绑定(bind)器。
目标是当你有一个完整的应用程序目录时
您只需在其上使用 packer.exe,所有这些文件都将打包、加密并存储在生成的 exe 中。
生成的 exe 然后会创建一个透明的虚拟文件系统,如果找不到文件,它会回退到“真实”文件系统。
我已经可以处理(不是很准确)从内存中加载 dll 等,但是我对 hmm Hook 有问题..
现在,作为概念验证,我将调试器(用 C++ 编写)附加到 target.exe
有点像
======= Started [target.exe] =======
> Placing breakpoint on EP : 0x401130
Process started
Loaded module : [target.exe]
Loaded module : [ntdll.dll]
Loaded module : [kernel32.dll]
[...]
Break point at [0x401130]
> Restored EP byte.
Loaded module : [bass.dll]
Break point at [0x760fcc4e]
Found set bp : kernel32!CreateFileW
[!] CreateFileW Callback Function :
FileName : C:\Users\user\Desktop\cppve\loader\bin\Debug\target.exe
Access : 0x80000000
Return Addr: 0x741b91e6
> Re-setting bp at [0x760fcc4e]
Break point at [0x760fcc4e]
Found set bp : kernel32!CreateFileW
[!] CreateFileW Callback Function :
FileName : .\beyond_v.mod
Access : 0x80000000
Return Addr: 0x760fcfa0
我在调试器中处理断点,例如 CreateFileW ReadFile 等我在向目标提供可用数据时遇到问题。
我应该创建一个假句柄然后捕获并处理它吗?还是这种方法有太多问题会出错?
这里是 CreateFileW 的示例回调函数
void callback_createfilew(CONTEXT* ct){
//stub
cout<<"[!] CreateFileW Callback Function :"<<endl;
void* returnaddr=MemReadDwordPtr(hProcess,(void*)ct->Esp);
string fn=MemReadCString(hProcess,MemReadDwordPtr(hProcess,(void*)ct->Esp+4),true);
void* access=MemReadDwordPtr(hProcess,(void*)ct->Esp+8);
void* sharemode=MemReadDwordPtr(hProcess,(void*)ct->Esp+12);
void* dwCreationDisposition=MemReadDwordPtr(hProcess,(void*)ct->Esp+20);
void* dwFlagsAndAttributes=MemReadDwordPtr(hProcess,(void*)ct->Esp+24);
cout<<" FileName : "<<fn<<endl;
cout<<" Access : "<<(void*)access<<endl;
cout<<" Return Addr: "<<(void*)returnaddr<<endl;
if(fn.compare(".\\beyond_v.mod")==0){
// this is wrong, we need to call it from the target process...
HANDLE ret=CreateFileA(".\\_beyond_v.mod",(DWORD)access,(DWORD)sharemode,NULL,(DWORD)dwCreationDisposition,(DWORD)dwFlagsAndAttributes,NULL);
ct->Esp+=0x20;
ct->Eax=(DWORD)ret;
ct->Eip=(DWORD)returnaddr;
}
我应该在这个过程中创建一个代码库并推送 shellcodes[编辑:抱歉,我用了很多这样的词来描述不同的东西,但我想你会明白我说的:)]执行我的伪造代码?
或者可能注入(inject)一个 dll 来处理 int3 并通过加载程序设置的异常处理程序将控制权传递给它?然而,这可能会很棘手...... dll 必须在虚拟文件系统中!所以我必须在进行任何其他初始化之前手动加载它。
我想在最终版本中完全放弃调试器。它只会引起问题并严重损害项目的保护者部分。
最佳答案
如果您希望您的“打包程序”在预编译的二进制文件上透明地运行,并希望所有内容都在生成的单个二进制文件中,则打包程序需要将 Hook 代码添加到二进制文件中,也许让它作为第一件事执行,并且只执行一次然后将控制传递给二进制文件的原始入口点。这并非微不足道,但确实可行。
但是你这里还有另一个问题。该 Hook 代码将包含解密代码,可能还包含 key ,优秀的程序员可以使用调试器和其他一些工具破解所有这些内容。
至于假句柄,我会看看是否有可能多次打开一个文件并获得不同的句柄。如果是,只需打开任何现有文件以共享模式读取,记住句柄并将其用于内存文件。需要另一个 handle 吗?再次打开文件得到一个。这将保证不会与其他真实句柄发生碰撞。
关于c++ - 虚拟文件系统设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9827841/
概述 限流,其基础含义为对流量进行限制,其既包括在速率上的限制,又包括在资源上的限制,这里主要讨论的是对速率进行限制。 本文分为三部分,第一部分中我们将讨论在做限流前必须要弄清的问题: 为什么要去做限
我在一个项目中与两位顾问合作。问题是我们已经到了一个地步,他们都无法达成协议(protocol),而且每个人都提供了不同的方法。 问题是我们有一家商店有四个部门,我们想找到在同一个数据库中与所有部门合
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 2 年前。 Improve this qu
从系统设计/可扩展性的角度来看,在处理需要大量写入数据库中特定表的系统时,有哪些行业标准策略。 为简单起见,假设该表是产品的库存表,有一个“产品名称”列和一个“计数”列,并且每次将新产品购买到系统中时
我需要构建一个 /search API,允许某人发送 POST,并检索稍后可以通过单独的 /results API 查询的 ID。 我查看了 Spring 方法: DeferredResult @As
我是一名优秀的程序员,十分优秀!