首页
社区
课程
招聘
未解决 [悬赏][求助]绕不过去的重启,要疯了 20.00雪花
发表于: 2017-12-19 22:38 3084

未解决 [悬赏][求助]绕不过去的重启,要疯了 20.00雪花

2017-12-19 22:38
3084
绕不过去的重启,已经重启N遍了,疯了快,求大佬指导下
目前分析的结果如下,无奈本人道行太浅,还没找出是什么条件原因



这是断点处,就是这个方法里面的某个方法执行了重启操作


这里有个判断条件,但没有貌似没有满足条件,直接跳到下面去了


我直接给填充了一下强制执行里面的方法


这个方法就是主要的原因入点了


跟随进去,看到的是这一堆的,但奇怪的是,这个方法里整个都走一遍也没问题,有时候就有问题
跳出方法后再走两步就直接重启了

以上是OD
=====================
下面这个是用了另一个软件,YZDBG,有点不太一样


这里是断点处


这里是重启的入口点


跟随进去,这里就能看到一个:sysenter-快速系统调用
这就是重启的地儿了

---------------------------------------------
但如果我把sysenter给填充了的话,后面就是再走几步直接弹出个提示框,提示系统崩溃了,确定后就文件都删除直接都关了
跪求大佬给看看是什么原因啊,到底是因为什么条件限制的


一定切忌不要直接运行,然后,然后直接就重启了


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 4722
活跃值: (2719)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
重启的方法放在dll里面。od载入,搜索字符串shutdown,可以看到System_ReBoot: OK!\n,跟进就是相关的代码

2017-12-20 00:18
0
雪    币: 106
活跃值: (739)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
注意最后3张图标题,你已经跟进到NTDLL里面了。。。
2017-12-20 08:47
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
fangliangz 重启的方法放在dll里面。od载入,搜索字符串shutdown,可以看到System_ReBoot: OK!\n,跟进就是相关的代码
那大佬能帮我看看是什么条件限制的吗?
2017-12-20 09:17
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
rlyt 注意最后3张图标题,你已经跟进到NTDLL里面了。。。
可是我没分析出来是什么条件原因限制了求指导
2017-12-20 10:49
0
雪    币: 5676
活跃值: (1303)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
6
 

随便逆了一下,没逆的太详细
首先你第一张图那个是WinMain,然后会调用dll导出的hngdx9Create
这玩意其实是个单例模式的类似getInstance()这样的函数,很明显

// singleton pattern
void *__stdcall hngdx9Create(int a1)
{
  void *result; // eax
  void *v2; // eax

  if ( a1 != 528 )
    return 0;
  result = dword_10116B54;
  if ( !dword_10116B54 )//是null,说明第一次调用,就new出来并且给那个全局变量
  {
    v2 = operator new(0xB60u);
    if ( v2 )//一般new返回的不会是null
    {
      result = (void *)NGDX9_Impl_constructor((int)v2);
      ++counter;
      dword_10116B54 = result;
      return result;
    }
    result = 0;
    dword_10116B54 = 0;
  }
  //不是null,就直接返回那个全局变量
  ++counter;
  return result;
}

然后constructor里面可以看到虚表

.rdata:100FF11C ??_7NGDX9_Impl@@6B@ dd offset sub_10005540
.rdata:100FF11C                                         ; DATA XREF: NGDX9_Impl_constructor+C↑o
.rdata:100FF120                 dd offset sub_10005590
.rdata:100FF124                 dd offset sub_100059A0
.rdata:100FF128                 dd offset sub_10005B10
.rdata:100FF12C                 dd offset shutdown
.rdata:100FF130                 dd offset sub_100066C0
.rdata:100FF134                 dd offset sub_100066D0
.rdata:100FF138                 dd offset shell_shutdown
.rdata:100FF13C                 dd offset sub_10006750
...

实际上,100FF12C就是楼上提到的关机函数,那么这个函数在哪被调用了呢?

else
  {
    (*(void (__stdcall **)(DWORD *))(*dword_520C48 + 16))(dword_520C48);
  }
.text:00425173                 mov     eax, dword_520C48
.text:00425178                 mov     ecx, [eax]
.text:0042517A                 mov     edx, [ecx+10h]
.text:0042517D                 push    eax
.text:0042517E                 call    edx

这里,WinMain F5之后第100行,调用了偏移是0x10的虚函数
然后这个else来自

.text:00425003                 mov     eax, dword_520C48
.text:00425008                 mov     ecx, [eax]
.text:0042500A                 mov     edx, [ecx+4]
.text:0042500D                 push    eax
.text:0042500E                 call    edx
.text:00425010                 test    al, al
.text:00425012                 jz      loc_425173

对虚表+4偏移的函数调用,必须要为true,不然关机。。
所以具体判断函数是sub_10005590这个函数。。
这个函数里面好像是一些D3D的初始化之类的东西,挺长的,本渣没研究过DX。。。所以看不懂了。。。
再具体一点的话

.text:100058E9                 mov     ecx, esi
.text:100058EB                 call    sub_100023A0
.text:100058F0                 test    al, al
.text:100058F2                 jnz     short loc_10005915
;是这里,jnz没有跳,所以调用了某个虚函数,然后sub_10005590就返回了0

话说这是个啥玩意。。。初始化失败就关机的吗。。。。

2017-12-20 11:00
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
holing 随便逆了一下,没逆的太详细 首先你第一张图那个是WinMain,然后会调用dll导出的hngdx9Create 这玩意其实是个单例模式的类似getInstance()这样的函数,很明显 ```c ...
大佬就是牛X,这分析的,先按照您分析的看一遍,虽然小渣看着有点晕,这是个单机游戏,肯定是因为哪些条件没有满足,但也不报错的,所以头疼了,不懂再请教您,成分感谢
2017-12-20 13:00
0
雪    币: 5676
活跃值: (1303)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
8
KKEENN 大佬就是牛X,这分析的,先按照您分析的看一遍,虽然小渣看着有点晕,这是个单机游戏[em_2],肯定是因为哪些条件没有满足,但也不报错的,所以头疼了,不懂再请教您,成分感谢
sub_100023A0是出问题的函数,具体你可以看看这个函数,它需要返回非0
2017-12-20 16:12
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
holing sub_100023A0是出问题的函数,具体你可以看看这个函数,它需要返回非0
大佬,小渣怎么没找着sub_100023A0这个函数呢莫非我们用的不是一个东西
2017-12-20 16:43
0
雪    币: 1176
活跃值: (1264)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
10
他用的是ida静态分析  你od基址加上0x23a0就是了 
2017-12-20 17:05
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
Tennn 他用的是ida静态分析 你od基址加上0x23a0就是了
好的,谢谢大佬
2017-12-20 17:22
0
游客
登录 | 注册 方可回帖
返回
//