《逆向工程核心原理》书籍中代码实践时发现的奇怪问题
本帖最后由 Blacat 于 2019-11-25 20:53 编辑最近小白在学习《逆向工程核心原理》,在实践其中得代码时,出现了很奇怪得函数传参问题,不知道问题是否白痴,自己实在搞不清楚,还是鼓起勇气提问吧。具体问题先附上图片:
g_cpdi是CREATE_PROCESS_DEBUG_INFO结构体得全局变量
第一张是源码,第二张图是反汇编后得对应的代码,问题主要在memcpy函数和ReadProcessMemory函数传参的问题,
可以看到ReadProcessMemory函数的参数push到栈之后,才执行了对g_cpdi和g_[fWriteFile全局变量的赋值,导致了
ReadProcessMemory参数出现问题。
问题解决不了很难受,哪位大佬知道这是为什么,感激不尽。
感觉可能跟头文件有关系,把我的头文件也附上。
2019/11/25更新
看到大佬们的解答,我在附上两张详细一点的图
这个赋值应该也是有问题, 应该是copy整个结构体内存空间,结果只赋值了ecx一个值
然后应该是用80地址的hProcess的值,结果赋值在push之后,然后赋值也不完全。
在把memcpy函数改为直接赋值之后错误没有了,不过还是不清楚原来是为什么会出现这种错误
第二张图是争取的栈区和内存布局。
附件附上源码 从图上看不出来,编译器一般情况下应该不会错,先压栈应该是压入的地址,然后再改动地址指向的内存数据,这样是没问题的 把编译优化关掉试试,在菜单-项目-属性里,编译器选项可以设置 DEBUG_EVENT de;
if (WaitForDebugEvent(&de, INFINITE))
{
if (de.dwDebugEventCode == EXCEPTION_DEBUG_EVENT)//1 异常事件
{
if (de.u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT) //是否为异常断点
{
if (de.u.Exception.ExceptionRecord.ExceptionAddress == Apiaddr)//异常断点是位置是否为api地址
{
ExceptionEvent(); 执行异常事件
以上是判断,那么我写入int 3断点的写法是这样
在创建进程调试事件的时候,会接收到CREATE_PROCESS_DEBUG_EVENT事件,这个时候就可以写入int 3, 直接用writememory函数在api首地址写int 3即可即可,以上全局不需要指针,没有任何错误,这是我觉得比较大众的写法 本帖最后由 bester 于 2019-11-25 14:00 编辑
另外 writememo的写法 他的写入内存地址跟buffer 应该都是无类型指针WriteProcessMemory(pi.hProcess, (LPVOID)Apiaddr, (LPVOID)&Original_Buffer, 1, &pWrite_Read)。你查看一下是否要转
最需要注意的是buffer 传递是是值的所在地址,而不是传值本身,这个是我自己之前犯过的错误 苏紫方璇 发表于 2019-11-24 17:07
从图上看不出来,编译器一般情况下应该不会错,先压栈应该是压入的地址,然后再改动地址指向的内存数据,这 ...
大佬我把这个栈区的情况截一下图,第一个g_cpdi.hProcess参数传递出了问题
我把memcpy函数改为直接赋值之后解决了原来的错误,但是还是不知道为什么之前会出错
下面是正确的栈区和内存布局
本帖最后由 Blacat 于 2019-11-26 20:30 编辑
bester 发表于 2019-11-25 13:58
另外 writememo的写法 他的写入内存地址跟buffer 应该都是无类型指针WriteProcessMemory(pi.hProcess, (LPV ...
大佬帮忙看一下帖子更新得内容 UniqueLegend 发表于 2019-11-24 23:05
把编译优化关掉试试,在菜单-项目-属性里,编译器选项可以设置
大佬帮忙看一些帖子更新得内容
页:
[1]