- UID
- 26439
注册时间2007-1-1
阅读权限40
最后登录1970-1-1
独步武林
该用户从未签到
|
楼主 |
发表于 2009-8-22 01:51:21
|
显示全部楼层
004A1DA5 |. /0F8C A8010000 JL 004A1F53
004A1DAB |> |83C6 08 /ADD ESI,8
004A1DAE |. |03D0 |ADD EDX,EAX
004A1DB0 |. |81E2 FF000000 |AND EDX,0FF
004A1DB6 |. |41 |INC ECX
004A1DB7 |. |8B5C95 00 |MOV EBX,DWORD PTR SS:[EBP+EDX*4]
004A1DBB |. |895C8D FC |MOV DWORD PTR SS:[EBP+ECX*4-4],EBX
004A1DBF |. |03D8 |ADD EBX,EAX
004A1DC1 |. |81E1 FF000000 |AND ECX,0FF
004A1DC7 |. |81E3 FF000000 |AND EBX,0FF
004A1DCD |. |894495 00 |MOV DWORD PTR SS:[EBP+EDX*4],EAX
004A1DD1 |. |90 |NOP
004A1DD2 |. |8B5C9D 00 |MOV EBX,DWORD PTR SS:[EBP+EBX*4]
004A1DD6 |. |8B448D 00 |MOV EAX,DWORD PTR SS:[EBP+ECX*4]
004A1DDA |. |881C24 |MOV BYTE PTR SS:[ESP],BL
004A1DDD |. |03D0 |ADD EDX,EAX
004A1DDF |. |81E2 FF000000 |AND EDX,0FF
004A1DE5 |. |41 |INC ECX
004A1DE6 |. |8B5C95 00 |MOV EBX,DWORD PTR SS:[EBP+EDX*4]
004A1DEA |. |895C8D FC |MOV DWORD PTR SS:[EBP+ECX*4-4],EBX
004A1DEE |. |03D8 |ADD EBX,EAX
004A1DF0 |. |81E1 FF000000 |AND ECX,0FF
004A1DF6 |. |81E3 FF000000 |AND EBX,0FF
004A1DFC |. |894495 00 |MOV DWORD PTR SS:[EBP+EDX*4],EAX
004A1E00 |. |90 |NOP
004A1E01 |. |8B5C9D 00 |MOV EBX,DWORD PTR SS:[EBP+EBX*4]
004A1E05 |. |8B448D 00 |MOV EAX,DWORD PTR SS:[EBP+ECX*4]
004A1E09 |. |885C24 01 |MOV BYTE PTR SS:[ESP+1],BL
004A1E0D |. |03D0 |ADD EDX,EAX
004A1E0F |. |81E2 FF000000 |AND EDX,0FF
004A1E15 |. |41 |INC ECX
004A1E16 |. |8B5C95 00 |MOV EBX,DWORD PTR SS:[EBP+EDX*4]
004A1E1A |. |895C8D FC |MOV DWORD PTR SS:[EBP+ECX*4-4],EBX
004A1E1E |. |03D8 |ADD EBX,EAX
004A1E20 |. |81E1 FF000000 |AND ECX,0FF
004A1E26 |. |81E3 FF000000 |AND EBX,0FF
004A1E2C |. |894495 00 |MOV DWORD PTR SS:[EBP+EDX*4],EAX
004A1E30 |. |90 |NOP
004A1E31 |. |8B5C9D 00 |MOV EBX,DWORD PTR SS:[EBP+EBX*4]
004A1E35 |. |8B448D 00 |MOV EAX,DWORD PTR SS:[EBP+ECX*4]
004A1E39 |. |885C24 02 |MOV BYTE PTR SS:[ESP+2],BL
004A1E3D |. |03D0 |ADD EDX,EAX
004A1E3F |. |81E2 FF000000 |AND EDX,0FF
004A1E45 |. |41 |INC ECX
004A1E46 |. |8B5C95 00 |MOV EBX,DWORD PTR SS:[EBP+EDX*4]
004A1E4A |. |895C8D FC |MOV DWORD PTR SS:[EBP+ECX*4-4],EBX
004A1E4E |. |03D8 |ADD EBX,EAX
004A1E50 |. |81E1 FF000000 |AND ECX,0FF
004A1E56 |. |81E3 FF000000 |AND EBX,0FF
004A1E5C |. |894495 00 |MOV DWORD PTR SS:[EBP+EDX*4],EAX
004A1E60 |. |90 |NOP
004A1E61 |. |8B5C9D 00 |MOV EBX,DWORD PTR SS:[EBP+EBX*4]
004A1E65 |. |8B448D 00 |MOV EAX,DWORD PTR SS:[EBP+ECX*4]
004A1E69 |. |885C24 03 |MOV BYTE PTR SS:[ESP+3],BL
004A1E6D |. |03D0 |ADD EDX,EAX
004A1E6F |. |81E2 FF000000 |AND EDX,0FF
004A1E75 |. |41 |INC ECX
004A1E76 |. |8B5C95 00 |MOV EBX,DWORD PTR SS:[EBP+EDX*4]
004A1E7A |. |895C8D FC |MOV DWORD PTR SS:[EBP+ECX*4-4],EBX
004A1E7E |. |03D8 |ADD EBX,EAX
004A1E80 |. |81E1 FF000000 |AND ECX,0FF
004A1E86 |. |81E3 FF000000 |AND EBX,0FF
004A1E8C |. |894495 00 |MOV DWORD PTR SS:[EBP+EDX*4],EAX
004A1E90 |. |90 |NOP
004A1E91 |. |8B5C9D 00 |MOV EBX,DWORD PTR SS:[EBP+EBX*4]
004A1E95 |. |8B448D 00 |MOV EAX,DWORD PTR SS:[EBP+ECX*4]
004A1E99 |. |885C24 04 |MOV BYTE PTR SS:[ESP+4],BL
004A1E9D |. |03D0 |ADD EDX,EAX
004A1E9F |. |81E2 FF000000 |AND EDX,0FF
004A1EA5 |. |41 |INC ECX
004A1EA6 |. |8B5C95 00 |MOV EBX,DWORD PTR SS:[EBP+EDX*4]
004A1EAA |. |895C8D FC |MOV DWORD PTR SS:[EBP+ECX*4-4],EBX
004A1EAE |. |03D8 |ADD EBX,EAX
004A1EB0 |. |81E1 FF000000 |AND ECX,0FF
004A1EB6 |. |81E3 FF000000 |AND EBX,0FF
004A1EBC |. |894495 00 |MOV DWORD PTR SS:[EBP+EDX*4],EAX
004A1EC0 |. |90 |NOP
004A1EC1 |. |8B5C9D 00 |MOV EBX,DWORD PTR SS:[EBP+EBX*4]
004A1EC5 |. |8B448D 00 |MOV EAX,DWORD PTR SS:[EBP+ECX*4]
004A1EC9 |. |885C24 05 |MOV BYTE PTR SS:[ESP+5],BL
004A1ECD |. |03D0 |ADD EDX,EAX
004A1ECF |. |81E2 FF000000 |AND EDX,0FF
004A1ED5 |. |41 |INC ECX
004A1ED6 |. |8B5C95 00 |MOV EBX,DWORD PTR SS:[EBP+EDX*4]
004A1EDA |. |895C8D FC |MOV DWORD PTR SS:[EBP+ECX*4-4],EBX
004A1EDE |. |03D8 |ADD EBX,EAX
004A1EE0 |. |81E1 FF000000 |AND ECX,0FF
004A1EE6 |. |81E3 FF000000 |AND EBX,0FF
004A1EEC |. |894495 00 |MOV DWORD PTR SS:[EBP+EDX*4],EAX
004A1EF0 |. |90 |NOP
004A1EF1 |. |8B5C9D 00 |MOV EBX,DWORD PTR SS:[EBP+EBX*4]
004A1EF5 |. |8B448D 00 |MOV EAX,DWORD PTR SS:[EBP+ECX*4]
004A1EF9 |. |885C24 06 |MOV BYTE PTR SS:[ESP+6],BL
004A1EFD |. |03D0 |ADD EDX,EAX
004A1EFF |. |81E2 FF000000 |AND EDX,0FF
004A1F05 |. |41 |INC ECX
004A1F06 |. |8B5C95 00 |MOV EBX,DWORD PTR SS:[EBP+EDX*4]
004A1F0A |. |895C8D FC |MOV DWORD PTR SS:[EBP+ECX*4-4],EBX
004A1F0E |. |03D8 |ADD EBX,EAX
004A1F10 |. |81E1 FF000000 |AND ECX,0FF
004A1F16 |. |81E3 FF000000 |AND EBX,0FF
004A1F1C |. |894495 00 |MOV DWORD PTR SS:[EBP+EDX*4],EAX
004A1F20 |. |90 |NOP
004A1F21 |. |8B5C9D 00 |MOV EBX,DWORD PTR SS:[EBP+EBX*4]
004A1F25 |. |83C7 08 |ADD EDI,8
004A1F28 |. |885C24 07 |MOV BYTE PTR SS:[ESP+7],BL
004A1F2C |. |8B0424 |MOV EAX,DWORD PTR SS:[ESP]
004A1F2F |. |8B5E F8 |MOV EBX,DWORD PTR DS:[ESI-8]
004A1F32 |. |33C3 |XOR EAX,EBX
004A1F34 |. |8B5E FC |MOV EBX,DWORD PTR DS:[ESI-4]
004A1F37 |. |8947 F8 |MOV DWORD PTR DS:[EDI-8],EAX
004A1F3A |. |8B4424 04 |MOV EAX,DWORD PTR SS:[ESP+4]
004A1F3E |. |33C3 |XOR EAX,EBX
004A1F40 |. |8B5C24 08 |MOV EBX,DWORD PTR SS:[ESP+8]
004A1F44 |. |8947 FC |MOV DWORD PTR DS:[EDI-4],EAX
004A1F47 |. |8B448D 00 |MOV EAX,DWORD PTR SS:[EBP+ECX*4]
004A1F4B |. |3BF3 |CMP ESI,EBX
004A1F4D |.^|0F8E 58FEFFFF \JLE 004A1DAB
这里就是关键解码部分的算法了。
用到了两个表。其中有一个非常巨大,复制下来将近12.5MB。
我就不复制了,有兴趣的朋友自己看看吧~
我做点简单的分析。
要先说明的是,这里不只中断一次,你选择的时机要正确,是要在我们的loader一样的主程序运行了创建了dj.bat这个进程后再断下的才是关键。bp CreateProcessA
当我们F8走到004A1DAB |> |83C6 08 /ADD ESI,8 的时候,我们需要注意我们的寄存器:
EAX 00000006 //这是最初的值
ECX 00000001 //这里作为计数器不断递增1.下面的运算会用到他
EDX 00000000 //这里与eax不停的做相加的运算得到关键的数值.
EBX 02C57818 //这里-2就是是那张非常巨大的表的结束
ESP 026FFAA0 //这个ESP地址作为关键的堆栈地址而存在
EBP 01EA17D0 //这里则是第二张表的起始地址,我们姑且称这个表为表B
ESI 029B0020 //而这里则是那个巨大的表开始的地方.可以想象一下有多大了吧~我们姑且称这个表为表A
EDI 02C60020 //程序申请的存放解码后的数据的内存地址.这里也可以找到所有的源程序代码,不过应该需要重定位吧.俺也不太清楚= =.
EIP 004A1DAB DJ1.004A1DAB
或许有朋友看了上面这么一堆注释会头晕.没关系我们来结合代码分析一下,我们的目的就是简单知道他的运算过程.
可能在你的机器里这些寄存器的地址可能会不同.无所谓,都是壳临时申请的内存地址罢了.
我们仔细观察一下代码,有没有发现代码很大一部分都是这样一个形式的重复?
ADD EDX,EAX
AND EDX,0FF
INC ECX
MOV EBX,DWORD PTR SS:[EBP+EDX*4]
MOV DWORD PTR SS:[EBP+ECX*4-4],EBX
ADD EBX,EAX
AND ECX,0FF
AND EBX,0FF
MOV DWORD PTR SS:[EBP+EDX*4],EAX
NOP
MOV EBX,DWORD PTR SS:[EBP+EBX*4]
MOV EAX,DWORD PTR SS:[EBP+ECX*4]
MOV BYTE PTR SS:[ESP],BL
唯一改变的只有最后一句,esp不停的在加1,一直加到7就不加了.
我们先来基础的一句句分析代码吧.
ADD EDX,EAX //edx=edx+eax
AND EDX,0FF //edx=edx+0ffh 其实作用就是只保留edx里的DL的数值
INC ECX //edx递增1
MOV EBX,DWORD PTR SS:[EBP+EDX*4] //ebx == dword [01EA17D0+edx*4]
MOV DWORD PTR SS:[EBP+ECX*4-4],EBX //再把ebx放入 [01EA17D0+ecx*4-4]
ADD EBX,EAX //ebx=ebx+eax
AND ECX,0FF //ecx只保留cl里的数值
AND EBX,0FF //ebx只保留Bl里的数值
MOV DWORD PTR SS:[EBP+EDX*4],EAX //eax的数值放入[01EA17D0+edx*4]
NOP
MOV EBX,DWORD PTR SS:[EBP+EBX*4] //把[01EA17D0+ebx*4]放入ebx
MOV EAX,DWORD PTR SS:[EBP+ECX*4] //把[01EA17D0+ecx*4]放入eax
MOV BYTE PTR SS:[ESP],BL //接下来就是把BL的数值放入关键堆栈地址. AL里的数值参与接下去的运算.
他就是这样运算.等到esp+7也赋值完毕后.表B的功能就算到此为止了.循环一次能计算出八个字节.
并且顺手把要存放解码后代码的地址加了8位.004A1F25 |. 83C7 08 |ADD EDI,8
还记得我们的表A么?接下来该他出场了.
记得我们这个循环第一句命令么?ADD ESI,8.此时的ESI为02AB0028.
我们来看剩下的代码:
MOV EAX,DWORD PTR SS:[ESP] //表B计算出的前四位到eax
MOV EBX,DWORD PTR DS:[ESI-8] //ESI-8的数值到ebx.结合之前的命令可理解为表A的数据以8个字节为一组,现在取每一组的前四个字节.
XOR EAX,EBX //eax=eax与ebx异或.此时算解码完四个字节.
MOV EBX,DWORD PTR DS:[ESI-4] //表A每一组数据后四个字节到ebx.
MOV DWORD PTR DS:[EDI-8],EAX //把解码后的字节放入内存
MOV EAX,DWORD PTR SS:[ESP+4] //取表B计算出的后四个字节到eax
XOR EAX,EBX //eax=eax与ebx异或.算是把后四个字节也解码了,一次大循环能解码八个字节.
MOV EBX,DWORD PTR SS:[ESP+8] //NOT IMPORTANT
MOV DWORD PTR DS:[EDI-4],EAX //把解码后的四个字节放到内存里
MOV EAX,DWORD PTR SS:[EBP+ECX*4] //恢复eax的值,继续下面的运算
CMP ESI,EBX //比较一下是否运算完
JLE 004A1DAB //运算完就不跳.
[ 本帖最后由 wuhanqi 于 2009-8-22 02:06 编辑 ] |
|