发表于 2018-5-18 13:11

申请会员ID:小马来了

1、申请ID:Denny
2、个人邮箱:3049879809@qq.com
3、原创技术文章:

ARM汇编笔记

.text:0000850C ; ---------------------------------------------------------------------------
.text:0000850C
.text:0000850C loc_850C                              ; DATA XREF: .got:0000AFA8o
.text:0000850C STMFD   SP!, {R4-R8,LR}
.text:00008510 LDR   R3, =(aHelloworld - 0x8524)   ; helloworld字符串的相对地址
.text:00008514 LDR   LR, =(unk_9B38 - 0x854C)      ; 一组特殊数据的相对地址
.text:00008518 SUB   SP, SP, #0x48
.text:0000851C ADD   R3, PC, R3                      ; 相对地址+当前指令地址=绝对地址,现                   在可以通过r3访问到字符串了
.text:00008520 MOV   R6, R1
.text:00008524 ADD   R5, SP, #0x2C
.text:00008528 LDMIA   R3, {R0-R2}                     ; 读取r3寄存器中的数据到r0,r1,r2中
.text:0000852C MOV   R3, R2,LSR#16                   ; 将r2的中值逻辑右移16位,再赋值给r3
.text:00008530 STR   R0,                   ; 将寄存器中的值存入到内存中
.text:00008534 STR   R1,                      ; R5=SP+0X2C,R5+4刚好在上一个指令SP+0X2C之后
.text:00008538 STRH    R2,                   ; 将R2的低位字节存入内存中,H表示无符号半字
.text:0000853C STRB    R3,                   ; 将R3的值按无符号字节放入内存,B代表无符号字节
.text:00008540 ADD   R12, SP, #4                     ; 栈空间向上移动4,地址存入R12,便于后面存放数据
.text:00008544 ADD   LR, PC, LR                      ; 特殊数据的相对地址+当前地址=特殊数据的绝对地址,现在可以访问其中的数据 了
.text:00008548 LDMIA   LR!, {R0-R3}                  ; 读取前四个数据的值到R0-R3四个寄存器中
.text:0000854C STMIA   R12!, {R0-R3}                   ; 将读取到的数值放入内存,以便空出寄存器,继续读取数据
.text:00008550 LDMIA   LR!, {R0-R3}                  ; 继续读取数据
.text:00008554 LDR   R4, =(off_AFAC - 0x8564)
.text:00008558 STMIA   R12!, {R0-R3}                   ; 读入数据到内存的同时,R12寄存器加上4*寄存器个数的偏移
.text:0000855C LDR   R4,
.text:00008560 LDR   R0,                         ; 读取特殊字符串中的倒数第二个数
.text:00008564 LDR   R1,                      ; 读取特殊字符串中的最后一个数据
.text:00008568 LDR   LR,                         ; 读取R4所以地址中的值到LR寄存器
.text:0000856C LDR   R2, =0x2AAAAAAB               ; 赋值一个常量
.text:00008570 ADD   R3, SP, #4
.text:00008574 STR   LR,
.text:00008578 STR   R0,                      ; 存储倒数第二个数据到内存
.text:0000857C STR   R1,                   ; 存储最后一个数据到内存
.text:00008580 ADD   R0, SP, #0x2B                   ; 获取字符串的首地址,并存入到R0寄存器中
.text:00008584 MOV   LR, R3                        ; 获取特殊数据串的首地址,并放入LR寄存器中
.text:00008588
.text:00008588 loc_8588                              ; CODE XREF: .text:000085ACj
.text:00008588 LDR   R1,                         ; 取R3所指地址中的数据,放入R0寄存器中,如第一个数为0xB
.text:0000858C LDRB    R12, !                   ; 取字符串中的一个字符,放入到R12寄存器中
.text:00008590 EOR   R1, R1, #7                      ; 将特殊数据串中取得的数据与7进行异或运算。
.text:00008594 SMULL   R8, R7, R2, R1                  ; 除法变乘法,相当于R1/6,R7存放结果
.text:00008598 SUB   R1, R7, R1,ASR#31               ; 算法优化,原文是+22,再-24,这里处理为直接-2,表达式等价于R1=R7-R1>>31
.text:0000859C SUB   R1, R1, #2                      ; 减2
.text:000085A0 EOR   R1, R1, R12                     ; R1与字符串中的一个字符进行异或运算
.text:000085A4 STR   R1, ,#4                     ; 将得到的数值存入R3所在的地址,完成后R3的值加4
.text:000085A8 CMP   R3, R5                        ; 比较R3与R5的值,R3是特殊数据字串的起始位置,R5是结束位置,如果两者相等,证明数据取完了
.text:000085AC BNE   loc_8588                        ; 取R3所指地址中的数据,放入R0寄存器中,如第一个数为0xB
.text:000085B0 MOV   R3, SP                        ; 计算出的数据的超始位置-4赋值给R3
.text:000085B4 ADD   R2, SP, #0x37                   ; 找到一块空地,便于下面赋值
.text:000085B8 ADD   LR, LR, #0x24                   ; 将计算出的字符串的末地址赋给LR,作为后面赋值的结束点
.text:000085BC
.text:000085BC loc_85BC                              ; CODE XREF: .text:000085C8j
.text:000085BC LDR   R1, !                  ; 将计算出的一个数据放入R1中
.text:000085C0 CMP   R3, LR                        ; 比较开始和结束的位置,以便判断是否赋值结束
.text:000085C4 STRB    R1, !                  ; 将结果放入上面找到的空地处,也就是新字符串变量中
.text:000085C8 BNE   loc_85BC                        ; 将计算出的一个数据放入R1中
.text:000085CC MOV   R3, #0                        ; 末尾置0,以便让字符串中不出现垃圾字符
.text:000085D0 ADD   R0, SP, #0x38
.text:000085D4 LDR   R1,
.text:000085D8 STRB    R3,
.text:000085DC BL      _83F0                           ; 调用string.h中的函数strcmp比较两个字符串的值
.text:000085E0 CMP   R0, #0                        ; 如果字符串相同,则注册成功
.text:000085E4 BEQ   loc_8610                        ; 取成功提示字符串的相对地址
.text:000085E8 LDR   R0, =(aNoYouAreFailed - 0x85F4) ; 取失败提示字符串的相对地址
.text:000085EC ADD   R0, PC, R0                      ; "NO,you are failed!"
.text:000085F0 BL      _83F_0
.text:000085F4
.text:000085F4 loc_85F4                              ; CODE XREF: .text:0000861Cj
.text:000085F4 LDR   R2,
.text:000085F8 LDR   R3,
.text:000085FC MOV   R0, #0
.text:00008600 CMP   R2, R3
.text:00008604 BNE   loc_8620
.text:00008608 ADD   SP, SP, #0x48
.text:0000860C LDMFD   SP!, {R4-R8,PC}
.text:00008610 ; ---------------------------------------------------------------------------
.text:00008610
.text:00008610 loc_8610                              ; CODE XREF: .text:000085E4j
.text:00008610 LDR   R0, =(aGoodWorkYouHav - 0x861C) ; 取成功提示字符串的相对地址
.text:00008614 ADD   R0, PC, R0                      ; "Good Work,you have Successed!"
.text:00008618 BL      _83F_0
.text:0000861C B       loc_85F4

再贴上源码,源码没必要讲了吧,程序 是传一个命令行参数 ,然后取这个参数 与计算 出的字符串相比较 ,若一样就显示成功 ,不一样就失败。

#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
    char name[]="helloworld";
    intkeys[]={0xb,0x1f,0x19,0x19,0x49,0xb,0xb,0xb,0x31,0x53};
    char Thekeys;
    int i;
    for(i=0;i<10;i++)
    {
      keys^=7;
      keys=keys/6;
      keys+=22;
      keys-=24;
      keys^=name;
    }
    for(i=0;i<10;i++)
    {
      Thekeys=keys;
    }
    Thekeys=0;
    if(!strcmp(Thekeys,argv))
      printf("Good Work,you have Successed!");
    else
      printf("NO,you are failed!");
    return 0;
}

OK了,就为了节约19块钱,好吧,累死了

Hmily 发表于 2018-5-18 14:47

抱歉,未能达到申请要求,申请不通过,可以关注论坛官方微信(吾爱破解论坛),等待开放注册通知。

Sound 发表于 2018-5-18 16:09

看了半天 只看懂了 你在翻译指令在干嘛。

crx666 发表于 2018-5-19 17:36

天门米九 发表于 2018-5-20 09:32

看不懂看不懂

abao991 发表于 2018-5-26 17:56

原帖 https://bbs.pediy.com/thread-176295.htm

那啥,楼主把底色也复制过来了。还有你到底是申请Denny还是申请小马来了?{:1_907:}
页: [1]
查看完整版本: 申请会员ID:小马来了