最近学习hijack,搞了个小软件,注册机制在dll中。EXE启动后,调用某功能的时候就会触发这个DLL,一触发这个DLL,(DLL加了UPX壳,脱壳后,DLL原有功能就失效,用OD打内存补丁成功。)就会触发注册。因为软件用到了机器码和外部注册文件。
经过我的分析,他的原理是这样的:先算机器码,存在内存一处(绝对地址=基址(DLL会改变,)+相对地址),由于直接对判断的jz,jnz等强制跳转,也就是爆破,会失去原dll所有功能,考虑patch机器码,当机器码生成完毕后,我手动修改机器码,运行软件,patch成功(对应机器码的DAT文件我有)!!!
1D203FE5 E8 929EFFFF call 1D1FDE7C <--------------计算机器码的地方 //F7跟进
1D203FEA 8B55 9C mov edx, dword ptr [ebp-64] 修改时机<-------------机器码放入EDX以便后面运算。
1D203FED 8D45 F8 lea eax, dword ptr [ebp-8] 修改时机
//F7------------------关键算法,算机器码
1D1FDEB2 FF37 push dword ptr [edi]
1D1FDEB4 8D45 EC lea eax, dword ptr [ebp-14]
1D1FDEB7 33D2 xor edx, edx
1D1FDEB9 8A16 mov dl, byte ptr [esi]
1D1FDEBB C1EA 04 shr edx, 4
1D1FDEBE 83E2 0F and edx, 0F
1D1FDEC1 8A92 58B6201D mov dl, byte ptr [edx+1D20B658]
1D1FDEC7 E8 5468FEFF call 1D1E4720
1D1FDECC FF75 EC push dword ptr [ebp-14]
1D1FDECF 8D45 E8 lea eax, dword ptr [ebp-18]
1D1FDED2 8A16 mov dl, byte ptr [esi]
1D1FDED4 80E2 0F and dl, 0F
1D1FDED7 81E2 FF000000 and edx, 0FF
1D1FDEDD 8A92 58B6201D mov dl, byte ptr [edx+1D20B658]
1D1FDEE3 E8 3868FEFF call 1D1E4720
1D1FDEE8 FF75 E8 push dword ptr [ebp-18]
1D1FDEEB 8BC7 mov eax, edi
1D1FDEED BA 03000000 mov edx, 3
1D1FDEF2 E8 C169FEFF call 1D1E48B8
1D1FDEF7 46 inc esi
1D1FDEF8 FECB dec bl
1D1FDEFA ^ 75 B6 jnz short 1D1FDEB2
1D1FDEFC 33C0 xor eax, eax
1D1FDEFE 5A pop edx
1D1FDEFF 59 pop ecx
1D1FDF00 59 pop ecx
1D1FDF01 64:8910 mov dword ptr fs:[eax], edx
1D1FDF04 68 1EDF1F1D push 1D1FDF1E
1D1FDF09 8D45 E8 lea eax, dword ptr [ebp-18] --这里,修改时机
1D1FDF0C BA 02000000 mov edx, 2
--这里,修改时机
1D1FDF11 E8 4E66FEFF call 1D1E4564 --这里,修改时机
1D1FDF16 C3 retn //返回-----------------1D203FEA
我的原本的意思,就是当机器码生成完毕,就修改机器码,或者当调用这个DLL,代码解压完毕,计算出基址,算出内存修改地址,直接patch,然后设为只读不可写,同样可以达到目的。
小菜我只写过EXE的内存补丁,DLL的,困啊!!! 现在的机制是1d1f0000 再开他就便19700000了或者1970d0000了,困难。。。
哪位大大能帮帮我....
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!