Blacat 发表于 2019-11-24 13:52

《逆向工程核心原理》书籍中代码实践时发现的奇怪问题

本帖最后由 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函数改为直接赋值之后错误没有了,不过还是不清楚原来是为什么会出现这种错误
第二张图是争取的栈区和内存布局。


附件附上源码

苏紫方璇 发表于 2019-11-24 17:07

从图上看不出来,编译器一般情况下应该不会错,先压栈应该是压入的地址,然后再改动地址指向的内存数据,这样是没问题的

UniqueLegend 发表于 2019-11-24 23:05

把编译优化关掉试试,在菜单-项目-属性里,编译器选项可以设置

bester 发表于 2019-11-25 13:57

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 13:58

本帖最后由 bester 于 2019-11-25 14:00 编辑

另外 writememo的写法 他的写入内存地址跟buffer 应该都是无类型指针WriteProcessMemory(pi.hProcess, (LPVOID)Apiaddr, (LPVOID)&Original_Buffer, 1, &pWrite_Read)。你查看一下是否要转
最需要注意的是buffer 传递是是值的所在地址,而不是传值本身,这个是我自己之前犯过的错误

Blacat 发表于 2019-11-25 20:31

苏紫方璇 发表于 2019-11-24 17:07
从图上看不出来,编译器一般情况下应该不会错,先压栈应该是压入的地址,然后再改动地址指向的内存数据,这 ...

大佬我把这个栈区的情况截一下图,第一个g_cpdi.hProcess参数传递出了问题
我把memcpy函数改为直接赋值之后解决了原来的错误,但是还是不知道为什么之前会出错

下面是正确的栈区和内存布局

Blacat 发表于 2019-11-25 20:34

本帖最后由 Blacat 于 2019-11-26 20:30 编辑

bester 发表于 2019-11-25 13:58
另外 writememo的写法 他的写入内存地址跟buffer 应该都是无类型指针WriteProcessMemory(pi.hProcess, (LPV ...
大佬帮忙看一下帖子更新得内容

Blacat 发表于 2019-11-26 20:31

UniqueLegend 发表于 2019-11-24 23:05
把编译优化关掉试试,在菜单-项目-属性里,编译器选项可以设置

大佬帮忙看一些帖子更新得内容
页: [1]
查看完整版本: 《逆向工程核心原理》书籍中代码实践时发现的奇怪问题