首页
社区
课程
招聘
关于多线程程序的问题,求大神解答!
发表于: 2016-8-9 13:38 6179

关于多线程程序的问题,求大神解答!

2016-8-9 13:38
6179
这个程序并不会收费程序,我只是想要修改掉它的某些检测。
这个程序会调用另外一个子程序,而这个被调用的子程序就是我想要修改的程序,它有多个线程。
我进入了我想要修改的线程的代码地址,但是却发现这个线程的地址即不再主程序代码段中,也不再dll(只有一个dll)的代码段中,即使直接修改了,右键之后找不到“复制到可执行文件中”。
我原本以为线程的线程地址不会再原来的代码段中,而是系统自动分配了另外的地址,结果当我自己写了一个多线程的程序之后却发现,就是在主程序的代码段中,然后我就懵了。
查了好久天,有胡乱弄了好几天还是不明白怎么回事,希望大神能予以解答,谢谢!

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 5461
活跃值: (1410)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
程序应该是被加壳了吧,加壳的程序一般都是这样的。。
2016-8-9 14:09
0
雪    币: 629
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
可是PEiD显示: 什么都没找到  [Overlay] *, 这样不是指没有壳吗?
2016-8-9 16:38
0
雪    币: 629
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
主程序的代码域和dll的代码域都是可以修改的,只是这个线程里的代码改不了
2016-8-9 16:44
0
雪    币: 2842
活跃值: (972)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
这块内存可能是动态申请的(被加壳了?)
1.静态修改代码除非找到这块内存数据的文件原始位置进行修改,
但是可能涉及到解密算法的问题,方案基本不太可行.
2.另一种方式就是动态补丁的方式,程序执行到某个时机,直接修改线程所在的汇编指令即可
2016-8-9 16:49
0
雪    币: 629
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
对于您所说的第1点: 您是指程序在运行的过程中,动态申请了一段内存,然后程序将代码复制到这块内存中。是这个意思吗?不知道我的理解是否有正确?
2016-8-9 16:57
0
雪    币: 2842
活跃值: (972)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
是的
2016-8-9 17:08
0
雪    币: 629
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
如果是这样,那么该如何编写CreateThread或者_beginthread调用的函数地址?传动态申请的内存地址的起始地给这两个函数吗?
2016-8-9 17:15
0
雪    币: 629
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
非常感谢!
2016-8-9 18:54
0
雪    币: 13
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
64位系统堆栈段区域默认是不能执行代码的,除非修改段寄存器,
2016-8-9 21:07
0
雪    币: 629
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
请问该具体如何修改呢?我的问题是否有其他的可能?
2016-8-9 21:19
0
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
线程的线程起始地址是用户定义的, 你这个应该是子程序有壳或者主程序加载子程序的时候有意隐藏这个模块
2016-8-9 21:43
0
雪    币: 629
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
子程序我也用PEID查过了,其它的dll文件也是,都显示没有壳。请问它是如何隐藏这一模块的(有什么办法可以查看出来?),难道“xhbuming"所说的方法真的不行吗?
2016-8-9 21:49
0
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
PEiD的结果仅供参考.
尝试提取内存中子程序线程地址上的特征码, 在物理文件中去搜索, 如果找到, 改之, 没有自校验的话就算完成了.
隐藏模块就是自己从内存中加载
2016-8-9 21:55
0
雪    币: 629
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
您是指: 由父程序将dll载入内存中,然后子程序再从内存中找到该函数吗?但是该如何寻找到多许的函数地址?像PE头分析工具那样分析父程序的输入表,从中找到所需的函数地址吗?
2016-8-9 22:36
0
雪    币: 629
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
我在64位的window8.1中尝试了一下代码:, 发现是可以的, 代码如下:

#include <iostream>
#include <stdio.h>

using namespace std;

int main()
{
        char *a = new char[4];
        a[0] = 106;               
        a[1] = 1;                        //6A 01 push 1
        a[2] = 88;                        //58        pop  eax
        a[3] = 195;                        //C3        ret
        __asm{
                call a;
        }
        return 0;
}

请问是我哪里理解错了吗?希望能够予以解答
2016-8-9 23:20
0
雪    币: 629
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
非常感谢, 可惜给不了分了!
2016-8-10 22:42
0
游客
登录 | 注册 方可回帖
返回
//