首页
社区
课程
招聘
[原创]Reversing.Kr-Twists1
发表于: 2019-3-3 11:12 3512

[原创]Reversing.Kr-Twists1

2019-3-3 11:12
3512

这个题花指令和小型的SMC很多,且有一堆反调试,检验过程很分散,虽然没啥加密,但必须要耐心地调试才能成功获得序列号。这里详细说明一下本题用的反调试和遍历动态库模块方法。

IDA打开该程序,发现有壳,且查壳工具侦测不出,多半是自定义壳。壳的解密过程挺简单,有3处反调试,如下

 

这里检验的标志的是Heap->Flags,这里为2表示非调试状态

 

这里检验的标志是Heap->ForceFlags,为0表示非调试状态

 

这里检验的是堆中特殊的HeapMagic标记,有FE EE FE EE,AB AB AB AB,BA AD F0 0D这样的东西多次出现就说明处于调试状态。

这三处反调试都是与堆相关的,是系统在初始化堆时使用NtGlobalFlag留下的印记。

patch掉反调试后单步跟踪即可到达入口点,然后手工脱一下壳,得到脱掉壳的正常程序。

主函数部分流程很简单,而且最后的关键判断就在下方不远处,可以看到Wrong和Correct的字符串。

 

​第一个调用的函数全是nop,就没用。进入第二个函数,经过分析和修修改改,第二个函数源码如下

 

这里使用了PEB中的Ldr(peb+0xc)这个字段,它的类型是PEB_LDR_DATA,定义如下:

可以看到(Ldr+0x1c)处是InInitializationOrderModuleList字段,它的类型是LIST_ENTRY,定义如下:


显然,这是一个双向链表,但仅从LIST_ENTRY结构来看,这个链表是没有值的,这样就毫无意义了。而在msdn中说到,结构中的每个指针,都指向了一个LDR_DATA_TABLE_ENTRY的结构,定义如下:

这样一个十分诡异的事情就发生了,Flink或Blink指针虽然是LIST_ENTRY结构指针,但本质上都指向了一个LDR_DATA_TABLE_ENTRY结构。具体不太好叙述,得画个图


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//