吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1630|回复: 5
收起左侧

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

[复制链接]
Blacat 发表于 2019-11-24 13:52
本帖最后由 Blacat 于 2019-11-25 20:53 编辑

最近小白在学习《逆向工程核心原理》,在实践其中得代码时,出现了很奇怪得函数传参问题,不知道问题是否白痴,自己实在搞不清楚,还是鼓起勇气提问吧。具体问题先附上图片:
1574573075(1).jpg
g_cpdi是CREATE_PROCESS_DEBUG_INFO结构体得全局变量
1574573055(1).jpg
第一张是源码,第二张图是反汇编后得对应的代码,问题主要在memcpy函数和ReadProcessMemory函数传参的问题,
可以看到ReadProcessMemory函数的参数push到栈之后,才执行了对g_cpdi和g_[fWriteFile全局变量的赋值,导致了
ReadProcessMemory参数出现问题。
问题解决不了很难受,哪位大佬知道这是为什么,感激不尽。
感觉可能跟头文件有关系,把我的头文件也附上。
1574574654(1).jpg


2019/11/25更新
看到大佬们的解答,我在附上两张详细一点的图
这个赋值应该也是有问题, 应该是copy整个结构体内存空间,结果只赋值了ecx一个值
然后应该是用80地址的hProcess的值,结果赋值在push之后,然后赋值也不完全。
screenshot_20191125_200707.png
在把memcpy函数改为直接赋值之后错误没有了,不过还是不清楚原来是为什么会出现这种错误
第二张图是争取的栈区和内存布局。
screenshot_20191125_201215.png
screenshot_20191125_202557.png
附件附上源码
screenshot_20191125_200707.png

1.docx

18.14 KB, 下载次数: 1, 下载积分: 吾爱币 -1 CB

源码

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

苏紫方璇 发表于 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
把编译优化关掉试试,在菜单-项目-属性里,编译器选项可以设置

大佬帮忙看一些帖子更新得内容
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 21:07

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表