-
-
Riijj系列之cm9分析+注册机
-
发表于:
2013-1-26 21:03
9739
-
Riijj系列之cm9(花指令)分析
工具:IDA6.1
系统:WinXP sp3
CM :下载 riijjcm09.rar
首先向大家道歉,代码注释排版一直整理不好,还是很乱,请原谅,知道的兄弟也请告知谢谢~
前几天不知怎的对riijj的cm对上眼了,于是"兽性大发"一口气将cm9-cm14,分析了一遍,发现其中还是有不少"猫腻"的,反正对于我来讲通过分析这几个cm,自身的调试能力有了不少的提升,其中乐趣不敢独享,贴出来同大家分享,希望能够帮助到对这几个cm有疑惑的朋友。
先简单介绍下这几个cm
Cm09是个轻量级的跳转花指令。
Cm11中一系列的反调试处理及万恶的浮点数五元方程组算法。
cm12中算法及弹窗部分实现在驱动中,并且驱动部分加了花指令,即使用IDA查看流程也找不出什么蛛丝马迹,必须动态调试,对于没有没有调试过驱动的同学们,是个不错的练习。当然操刀工具就是传说中的WinDBG了。
Cm13中主程序A创建调试进程B,并且通过调试事件写入进程B一条代码,执行后清除,再写入下一条,执行,清除依次循环,期间通过int3异常事件通知主程序A进行写入操作。这个算法也是在进程B中的,不通过调试也看不到有用的信息。而进程B已经被进程A调试了,如何找到调试B的方法是关键。
Cm14中类似cm11的反调试及反系统调试工具,有两个算法部分,关键看你怎么定位到真正的那一个。
这几个有个共同特点就是,你拿OD调试是很难得,比如花指令跳来跳去你怎么分析,调试驱动就更不行了。所以我后来很少用OD调试,主要用IDA或者WinDBG调试,
上调应用,下调驱动,能屈能伸,其乐融融。
好了不废话了,今天先分析下cm9
如果你不信,可以先拿OD载入看下如图

入口处一目了然,代码中夹杂着数据,很明显的花指令,并且一执行便是跳转,你怎么来有感情的阅读此cm,并且联系上下文分析呢?
所以还是用IDA吧。
直接将该cm9图标拖到IDA图标上即可,弹出选择文件默认为PE格式文件,点击确定,稍等片刻分析结束后停在程序入口处如图

第一次使用IDA先选择调试器,否则无法调试程序。在菜单Debugger下Switch debugger弹出框选择Local Win32 debugger,确定即可。
之后无许多虑,先看下有没有比较猫腻的函数,点击上面一栏Imports导入函数页查看
调用的函数,为方便查看可以通过点击Name标题来自动按函数顺序排序,依次向下查看发现有GetDlgItemTextA函数,

鼠标双击函数跳转到导入表的地址行,在函数名上右键选择Jump to xref Operand,发现有两处调用如图

双击第一个call跳转到代码中引用该函数的地方(显示可以是图形模式也可以是代码模式,可以通过空格键切换,也可以用右键选择Text View/Graph View切换)按F2键下断会变红色,否则调试器可能没有选对。

然后按Esc返回GetDlgItemTextA函数处继续选择第二个call下断方法同上。
可以试验下断点是否正确,按F9运行程序,弹出cm对话框,点击注册按钮,程序会断在断点处,并且断点变为粉红色。
好了这时仔细看下代码发现多是如下形式
push eax
push offset loc_414F64
Retn
Local_414F64:
Call edi
push offset loc_41752F
Retn
push 32h
push eax
push 3E8h
push ecx
call edi ; GetDlgItemTextA ;GetDlgItemTextA取Name框内容
mov esi, eax ;存储Name长度Len_Name
lea edx, [esp+0Ch+arg_84]
mov eax, dword_4326B0
push 32h
push edx
push 3E9h
push eax
call edi ; GetDlgItemTextA ;GetDlgItemTextA取Serial框内容
test esi, esi
mov ebx, 17B85h
jz loc_412D34 ;Len_name=0则退出
cmp eax, 14h
jb loc_412D34 ;Len_Serial<20则退出
xor ecx, ecx
loc_410CC9: ;int i=0,j=0x17B85,k,m;
mov eax, ecx ;{
xor edx, edx
div esi ;i%Len_Name
mov eax, ebx
mov ebx, 1C9h
imul eax, 1E8Fh ;k=0x17B85*0x1E8f(带符号乘)
movsx edi, [esp+edx+0Ch+arg_1C] ;m=Name[i%Len_Name]
xor edx, edx
div ebx
add edi, edx ;m=m+k%0x1C9
inc ecx ;i++
mov ebx, edi
cmp ecx, 32h
mov byte ptr [esp+ecx+0Ch+anonymous_0+3],bl ;保存结果到Mem1[i-1]=m&0xFF
;}
jb loc_410CC9 ;while(i<0x32)
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课