|
|
硬件断点怎么单步执行.
可以了,看了下资料发现是二进制位控制的,原来以为是数值 |
|
|
[分享]关于老文章和各种坑
你是个感性的人,感性的人大多是善良的,所以我愿意听你说. |
|
|
[求助]关于程序的自我保护(修改内存属性页面+异常)
会不会直接读你的文件哦,这样你就白弄了,或者把你的程序载到他自己的内存里读你也没办法啊.所以还是要驱动才行,要不然你把功能代码拆分注入到所有的进程里去,自身开几条线程来感知他们,功能不复杂的话只是读写或者调用些游戏的函数还是没有什么问题的,我看别人成熟产品的做法是自身开有监视线程的,游戏的通信和效验都记录下来,要不然一条云指令你就又得慢慢更新,最糟糕的是你还不清楚是检测了哪里,不是每个客户端检测的地方都一样的,一个游戏可以检测几十上百个地方,一个客户端最多出现二三十处就了不起了.所以你需要一个比较完善的检测方案,发现新的检测立即就记录或者推送出去.对于检测我自己也是一头雾水,不过别人都是这么做的,你也可以试试 |
|
|
[求助]请问怎么多加载一份系统模块,如kernel32,user32等
谢谢你的回答,让我心里倍感温暖,我的本意是想自己加载ntdll并调用里面的函数,而不通过系统加载的ntdll 这样可以轻度的减少一些对函数的hook,我知道哪怕自己加载ntdll在R3上就算要hook也是可以的,但是能减少一些是一些,能好一点点是一点点,所以我想自己加载ntdll调用,这样别人hook系统加载的ntdll就没有效果了,我还想禁止线程的创建和不停的安装调试钩子来防止别人注入代码,因为按照我自己的理解注入代码和模块都要创建线程,不然怎么启动呢. 我知道很多人能够办到,但是自己能力太差遇到了麻烦,搜索了很多资料后觉得是写一个PE加载器能够办到驱动和dll的自加载.原理还是比较简单,我了解就是通过加载目标dll或者直接读盘符上的文件,复制到内存中,然后修改输出表和重定位,论坛有几篇帖子有介绍,但是都差不多,大致的代码基本如下面: HMEMORYMODULE MyLoadLibrary(const void *data) { PMEMORYMODULE result; PIMAGE_DOS_HEADER dos_header; PIMAGE_NT_HEADERS old_header; unsigned char *code, *headers; SIZE_T locationDelta; DllEntryProc DllEntry; BOOL successfull; dos_header = (PIMAGE_DOS_HEADER)data; if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) { return NULL; } old_header = (PIMAGE_NT_HEADERS)&((const unsigned char *)(data))[dos_header->e_lfanew]; if (old_header->Signature != IMAGE_NT_SIGNATURE) { return NULL; } code = (unsigned char *)VirtualAlloc((LPVOID)(old_header->OptionalHeader.ImageBase), old_header->OptionalHeader.SizeOfImage, MEM_RESERVE, PAGE_READWRITE); if (code == NULL) { code = (unsigned char *)VirtualAlloc(NULL, old_header->OptionalHeader.SizeOfImage, MEM_RESERVE, PAGE_READWRITE); if (code == NULL) { return NULL; } } result = (PMEMORYMODULE)HeapAlloc(GetProcessHeap(), 0, sizeof(MEMORYMODULE)); result->codeBase = code; result->numModules = 0; result->modules = NULL; result->initialized = 0; VirtualAlloc(code, old_header->OptionalHeader.SizeOfImage, MEM_COMMIT, PAGE_READWRITE); headers = (unsigned char *)VirtualAlloc(code, old_header->OptionalHeader.SizeOfHeaders, MEM_COMMIT, PAGE_READWRITE); memcpy(headers, dos_header, dos_header->e_lfanew + old_header->OptionalHeader.SizeOfHeaders); result->headers = (PIMAGE_NT_HEADERS)&((const unsigned char *)(headers))[dos_header->e_lfanew]; result->headers->OptionalHeader.ImageBase = (POINTER_TYPE)code; CopySections(data, old_header, result); locationDelta = (SIZE_T)(code - old_header->OptionalHeader.ImageBase); if (locationDelta != 0) { PerformBaseRelocation(result, locationDelta); } if (!BuildImportTable(result)) { goto error; } FinalizeSections(result); if (result->headers->OptionalHeader.AddressOfEntryPoint != 0) { DllEntry = (DllEntryProc) (code + result->headers->OptionalHeader.AddressOfEntryPoint); if (DllEntry == 0) { goto error; } successfull = (*DllEntry)((HINSTANCE)code, DLL_PROCESS_ATTACH, 0); if (!successfull) { goto error; } result->initialized = 1; } return (HMEMORYMODULE)result; error: MyFreeLibrary(result); return NULL; } 我用PE加载的方式加载自己写的dll是可以成功的,哪怕是加载user32这样的模块调用MessageBoxA这样的函数也是可以成功的, 但是我调用我认为稍微复杂一些的函数,例如EnumDesktopWindows的时候,却不能进到我设的回调函数里面,很是奇怪.我个人资质比较差,看到汇编代码那样比较带联想性的代码,我总是不能把它转成C++代码,基本能看懂,但是不知道意思是什么,好像英语里面能看懂26个字母,但是字母组成的单词句子我就不知道什么意思了,所以那么久我也基本只能看懂c++代码 |
|
|
[求助]请问怎么多加载一份系统模块,如kernel32,user32等
你好,非常感谢你的回答,可能我的问题不清楚,给大家添麻烦了. 我的问题本意是,想加载一些系统DLL,比如说我加载一份ntdll模块,通过自己加载的模块调用函数,而不通过系统加载的模块.这样可能会安全一点,最后我做了些尝试,把ntdll复制到内存中来,修改了重定位和导出函数表,但是调用自己加载模块里的函数时往往不能成功,不过一些简单点的函数还是能成功的,例如:MessageBoxA这个,其它函数就不能成功了. 我这人是比较没创造力的人,所以想请大家告诉我还差什么, |
|
|
[求助]请问怎么多加载一份系统模块,如kernel32,user32等
没有人指点我,我也不知道怎么弄,自己瞎看瞎弄, 试了直接读User32然后复制到内存中,改了重定位和输出表,调用MessagboxA就出个框,连"确定"和"取消"都显示不出来,全是白板按钮. 又试了在内存中把原来的User32复制到新的内存调用MessagboxA,看起来一切正常,和普通调用没区别了,但是调用其他复杂点的函数都不能成功,尝试调用了EnumDesktopWindows,连回调函数都进不去. 整个论坛都搜索完了,挺多自己加载PE的,但是都是用MessagboxA做例子,换个其他函数的话论坛上说的方法全部歇菜(我指的是PELOAD的方法), 都说是老技术了,那么多人在用了,怎么就没人舍得说一下呢 |
操作理由
RANk
{{ user_info.golds == '' ? 0 : user_info.golds }}
雪币
{{ experience }}
课程经验
{{ score }}
学习收益
{{study_duration_fmt}}
学习时长
基本信息
荣誉称号:
{{ honorary_title }}
勋章
兑换勋章
证书
证书查询 >
能力值