收集目标信息 :
1.png
1.1.png
3.png
1.2.png
2.png
软件名称:同花顺
主程序名称:hexin.exe
目标模块:公式指标
文件格式:HXF
提示信息:失败提示“公式密码错误,请重新输入” 成功提示“”
壳信息:压缩壳
反调试:有
选择工具:
OllyDbg(吾爱)
IDA7.6(吾爱)
PEID(吾爱)
16进制计算器
正文:
附加载入程序,让程序跑起来解码,跳转到401000搜索提示信息字符串
4.png
5.png
没有搜索到字符串,转为函数做进入点。有弹窗提示断MessgaeBox,F8返回程序代码段,并在段首和MessgaeBox设下断点(防止程序不经过段首)。
6.png
7.png
8.png
成功断在段首并且堆栈发现错误信息,直接执行到段尾并返回到调用代码段,继续段首和Call下断。(直接执行到段尾是因为堆栈已经压入错误提示信息,说明调用代码已经识别出密码错误)。
10.png
11.png
成功断在段首并提示错误信息,继续执行到段尾并返回调用代码段,发现堆栈提示了一串字符“13579888”,记录下来,继续返回调用代码段并在段首和Call下断(会连续返回几次调用代码,直接换上发现字符串信息的图)
12.png
13.png
发现堆栈提示Textchanged事件信息。
14.png
继续执行发现可疑字符串“1IDJAKDPAIDBAJDBAJD” “198236‘ ”399170“ 记录下来继续执行。
15.png
16.png
继续执行弹出密码错误信息窗口,发现上方test对比和je条件跳转。重新执行test指令开始的代码并更改标志位测试其他结果,分析出跳向密码成功和密码失败。
17.png
19.png
在Test指令上方还有对比和跳转指令,重新执行整个代码段,详细分析流程。
[Asm] 纯文本查看 复制代码
00989D9C 8378 F4 00 cmp dword ptr ds:[eax-0xC],0x0 ; 核心判断00989DA0 C785 B8FDFFFF 0>mov dword ptr ss:[ebp-0x248],0x100989DAA 74 04 je short hexin.00989DB0 ; 关键跳转00989DAC 32DB xor bl,bl00989DAE EB 02 jmp short hexin.00989DB200989DB0 B3 01 mov bl,0x100989DB2 C745 FC 0600000>mov dword ptr ss:[ebp-0x4],0x600989DB9 F685 B8FDFFFF 0>test byte ptr ss:[ebp-0x248],0x100989DC0 74 12 je short hexin.00989DD400989DC2 83A5 B8FDFFFF F>and dword ptr ss:[ebp-0x248],-0x200989DC9 8D8D C0FDFFFF lea ecx,dword ptr ss:[ebp-0x240]00989DCF E8 8C88A7FF call hexin.0040266000989DD4 84DB test bl,bl00989DD6 74 5A je short hexin.00989E3200989DD8 8B4D D5 mov ecx,dword ptr ss:[ebp-0x2B]00989DDB 6A 00 push 0x000989DDD 6A 40 push 0x4000989DDF 51 push ecx00989DE0 E8 F65E8300 call hexin.011BFCDB ; 弹出错误消息
密码错误
失败.jpg
密码成功
成功.jpg
初步确定这就是要定位的目标代码段,重新载入程序逆向往上分析,每一个上方Call都断点F7进入分析,断点Call出来后重新载入程序。(重新载入是为了清除内存残留数据)
一路往上分析到00989D57 E8 0489A7FF call hexin.00402660 这里会处理输入的假码存放和转存。
20.png
继续向上分析,00989D10 E8 12D98200 call hexin.011B7627 这里会弹出密码输入窗口。
21.png
这里Push EAX出现了真码的信息,上方有一个Call,F7进入。
22.png
进去一路分析到接近段尾,发现真码存放地址。
23.png
真码地址上方发现循环运算和转存的行为。分析发现真码就是由此计算出,但来源数值很可疑,继续往上分析发现还有一处循环计算和转存,也就是说是两次解密操作。
24.png
25.png
此处直接获得了两次解密的算法,基本确定这是一个解码的Call,但还要追踪一个问题,那便是”1IDJAKDPAIDBAJDBAJD“,继续逆向分析。
进入上一个Call发现”1IDJAKDPAIDBAJDBAJD“出现于00AF16BA 8B41 60 mov eax,dword ptr ds:[ecx+0x60]处。
55.png
26.png
分析发现这个地址是存放真码的地址,重点追踪ECX。返回调用代码一眼就看到了MOV ECX,EDI,追踪ECX变成EDI。
27.png
继续分析发现EDI来源于堆栈中,追踪由EDI变为EBP。
EBP.png
EBP来源于ESP.....00989B91 8BEC mov ebp,esp
28.png
MOV EBP,ESP
MOV EDI,DWORD PTR SS:{EBP+0x8}
MOV ECX,EDI
ECX+0x60=1IDJAKDPAIDBAJDBAJD的地址
08应该是一个对象,60则是这个对象的成员。
这个位置已经到达了段首,那么基本可以确定并不是在打开目标模块的时候才读取文件加密信息,而是程序在启动时便加载了文件夹里所有的HXF加密信息。源假码在启动时便压入了堆栈。
HXF文件解密的一个流程:
;软件启动获得加密文件源假码信息并把地址Push
0098BC9E E8 EDDEFFFF call hexin.00989B90 ; 解密模块
00989C96 E8 35327C00 call hexin.0114CED0 ; 两次解密源假码得到真码
00989D10 E8 12D98200 call hexin.011B7627 ; 弹出密码输入窗口
00989D66 8378 F4 00 cmp dword ptr ds:[eax-0xC],0x0 ; 判断输入密码位数是否小于0
没截图 ;转存真假码对比结果,00 or 01
00989D9C 8378 F4 00 cmp dword ptr ds:[eax-0xC],0x0 ;cmp 对比结果,0x00
00989DAA /74 04 je short hexin.00989DB0 ; 跳转
00989DE0 E8 F65E8300 call hexin.011BFCDB ; 密码错误窗口Call