image.png
WaitForSingleObject 利用函数让下一步出现阻塞状态 进入上一个函数所调用的属性StartAddress
image.png
对其汇编定位 jnz jz 给 nop
先把call 90 nop 走一下啊 40176E后到40177A的nop
image.png
对下面数据也进行转汇编格式这所出现的 反复调用对齐 call 进行nop 40179C到4017A8 这边利用双字节一个一个90
image.png
反编译 看样子是完整的
分析wccmp 一个进程比较
image.png
继续往下 sub_401500 中的函数 sub_401170 base64 的加密
image.png
开始没有思绪了这个东西好像不是很重要 我回到主main 看看 下面 rdata 表在入口处有没有钩把
image.png
更近TLS看看 三个选项
case 0 sub_401600()后就 break 了
case 1 一个IsDebuggerPresent()反调试函数 不允许调试他
case 2 TlsCallback_0 的汇编代码 不允许替换成 0x90 也就是 不允许自己函数被nop 会对其dword_4A7000 进行修改
case 3 对其函数修改 不过调用的是之前分析到的base64
也就是你调试他就开始做了检测在入口处真正常
image.png

1
2
3
4
#define DLL_PROCESS_ATTACH 1
#define DLL_THREAD_ATTACH 2
#define DLL_THREAD_DETACH 3
#define DLL_PROCESS_ATTACH 0

1 -2 -3 -0 的顺序
开始整理思绪 入口出现TLS 也是就是说 检测到的调试是 case1 让你一直循环进程 mian函数开始创建进程 WaitForSingleObject 利用 StartAddress 属性进入堵塞 一直等待释放后结束进程 在这期间通过 case2 检测 关键点是否被nop 有 nop开始对dword_4A7000 修改 下面就应该是会去退出时进入base64 完全退出 call会被修改 这些无伤大雅 猜测后续解开始一串base64 因为退出call 程序被修改 最后拿base64
拿case 2 dword_4A7000[1] *= 2
image.png

开始动调
第一个就是挠过循环 jz 改jnz 进入旁边的判断
image.png
image.png
断点调试 一次循环进行一次加密
image.png
case0加密数据 长度补0
image.png
case2
image.png
case3
image.png
往下走完 case3 的循环 call 更改 401170被改为了4013B0
image.png
往下 P xxtea
image.png
image.png
这边出现的 不知为啥 74 应该是 75emmmm
先跑个脚本试试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <stdio.h>
#include <stdint.h>
#define DELTA 0x9e3779b9
#define MX (((z>>5^y<<3) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))

void btea(uint32_t *v, int n, uint32_t const key[4])
{
uint32_t y, z, sum;
unsigned p, rounds, e;
if (n > 1) /* Coding Part */
{
rounds = 6 + 52/n;
sum = 0;
z = v[n-1];
do
{
sum += DELTA;
e = (sum >> 2) & 3;
for (p=0; p<n-1; p++)
{
y = v[p+1];
z = v[p] += MX;
}
y = v[0];
z = v[n-1] += MX;
}
while (--rounds);
}
else if (n < -1) /* Decoding Part */
{
n = -n;
rounds = 6 + 52/n;
sum = rounds*DELTA;
y = v[0];
do
{
e = (sum >> 2) & 3;
for (p=n-1; p>0; p--)
{
z = v[p-1];
y = v[p] -= MX;
}
z = v[n-1];
y = v[0] -= MX;
sum -= DELTA;
}
while (--rounds);
}
}


int main()
{
uint32_t v[]= {0x3400A0D0, 0xB23CFFEB, 0xCDE69111, 0x032D0771, 0xFA1D9E6C, 0x9D15360A, 0x933EBF03, 0x9F12DDA6,
0x8C58DDA1, 0x46BEE3E0, 0x04476F65, 0x3C44CEF9};
uint32_t const k[4]= {0x75,0x404,0xBF,0X2652};
int n= -12;
btea(v, n, k);
for(int i=0;i<12;i++)
for(int j=0;j<4;j++){
printf("%c",(v[i]>>(8*j))&0xff);
}
return 0;
}

得到数据 48Pt4WXo+yhqh0GzFAbRg0XqgFhq4UOl+UwqL8wUHy6rEFSQ
image.png
Qu7e3T0yEknVghYa6vf1oOsF94H+LxIqbtKpzw8U5CJN2XlZRPM/SdAWDGcjBimr
image.png